iOSアプリ開発における定数定義の方法【環境毎設定編】

本番環境・テスト環境で、アプリが接続するサーバURLが異なる事は少なくない。
この様に定数でありながら、条件により有効になる値を変更する必要がある場合の、定数定義の方法を紹介する。
(基本的な定数定義の方法は、「iOSアプリ開発における定数定義の方法【基本編】」を参照のこと)

<準備>
今回紹介する方法には、「<プロジェクト名>-Prefix.pch」ファイルを使用する。
このファイルはXcode5以前はプロジェクト作成時に自動的に生成されたが、Xcode6からは手動で生成する必要がある。
生成方法は「Xcode6でPCHファイルを追加する方法」を参照のこと。

<手順概要>
1.定数を変更する条件を「<プロジェクト名>-Prefix.pch」に定義する
2.「.h」ファイルに「extern」キーワードを用いて定数名を定義する
3.「.m」ファイルに定数に格納する値を定義する(マクロによる分岐)

<手順詳細>
1.定数を変更する条件を「<プロジェクト名>-Prefix.pch」に定義する
テスト環境を表す値として「VAL_ENV_TEST」、本番環境を表す値として「VAL_ENV_REAL」を定義する
また、実際に環境を設定する値として「DEF_ENVIRONMENT」を定義する。
この「DEF_ENVIRONMENT」の右側に設定する値によって、環境を切り替えることになる。
(下記は「本番環境」に設定した例である)

//環境種別
#define VAL_ENV_TEST   0        //テスト環境
#define VAL_ENV_REAL   1        //本番環境

// 環境設定
#define DEF_ENVIRONMENT VAL_ENV_REAL
                         //↑この場所に設定する値によって環境を切り替える

2.「.h」ファイルに「extern」キーワードを用いて定数名を定義する
この手順は、「iOSアプリ開発における定数定義の方法【基本編】」で紹介した方法と変わらない。
今回は「SAMPLE_CONST_SERVER」という定数を定義する

#import <Foundation/Foundation.h>

@interface AppConsts : NSObject

/** サンプル定数(条件によって変更される定数) */
extern NSString * const SAMPLE_CONST_SERVER;

@end

3.「.m」ファイルに定数に格納する値を定義する(マクロによる分岐)
手順1で定義した値を用いて、定数定義をマクロにより分岐して行う。

#import "AppConsts.h"

@implementation AppConsts

#if DEF_ENVIRONMENT == VAL_ENV_REAL

//本番環境時の定数設定
NSString * const SAMPLE_CONST_SERVER = @"https://real.server/";

#elif DEF_ENVIRONMENT == VAL_ENV_TEST

//テスト環境時の定数設定
NSString * const SAMPLE_CONST_SERVER = @"http://test.server/";

#endif

@end

<定数の使用方法>
定義した定数を使用するには、使用したいクラスで定数定義クラス「AppConsts.h」をimportし、定数を使用したい場所に定数名を記述する。

//使用するクラスに「AppConsts.h」をimportしておくこと

NSLog(@"%@", SAMPLE_CONST_SERVER);

<実行結果>
「<プロジェクト名>-Prefix.pch」の「DEF_ENVIRONMENT」を「VAL_ENV_TEST」に設定した場合

2014-11-12 21:41:24.535 ConstsSample[11753:84567] http://test.server/

「<プロジェクト名>-Prefix.pch」の「DEF_ENVIRONMENT」を「VAL_ENV_REAL」に設定した場合

2014-11-12 21:42:34.247 ConstsSample[11832:85331] https://real.server/

<考察>
今回の様に環境によって変更する必要がある定数が1件の場合は、紹介した方法はあまり効力を発揮しないが、件数が増えれば変更作業を楽にすることができる。
また、環境変更をソースコードの変更では無く、設定ファイルの変更のみで実施できることは、品質管理の面で有利に働くと思われる。

Enjoy Programing!!

<関連記事>
iOSアプリ開発における定数定義の方法【基本編】
iOSアプリ開発における定数定義の方法【環境毎設定編】(本記事)
iOSアプリ開発における定数定義の方法【マクロ使用編】
iOSアプリ開発における定数定義の方法【最適解編】

<お勧め書籍>

詳解 Objective-C 2.0 第3版
iOSアプリ開発技術者として仕事をするのであれば、必ず読んでおくべき書籍である。
筆者も何度も繰り返し精読している。