TARGETについて
TARGETはビルド設定のまとまりで、Xcodeでプロジェクトを作成すると自動で1つ作成される。
TARGETを複数用意することで、テスト用、本番用などを切り替えてアプリをビルドすることができる。
サーバー環境を複数用意する場合などは、TARGETも複数作成すると良い。
TargetとConfigurationどちらを使うべきか 2019/12/17 追記
Xcodeにはビルド設定を切り替える仕組みが、Target
とConfiguration
の2種類存在する。
Targetの方がより詳細な設定ができるが、この記事に書いた内容は全て Configuration
でも切り替えられる。
多くの場合、Targetを複数作るよりConfigurationを複数作る方が運用が簡単である。
ただし、以下のようなケースはConfigurationでは対応できないため、Targetを複数作成する。
- アプリに含めるリソース(画像)などを変えたい
- ウィジェットなどのエクステンションを作る
※ ウィジェットについては Configuration でも切り替える方法があるかもしれない。
TARGETによって切り替えられるもの
必要であれば様々な設定をTARGETで切り替えられるが、主に以下をTARGETによって切り替える。
- Bundle Identifier
- Bundle IdentifierをTARGET毎に変えることで、各TARGETでビルドしたアプリを別アプリとして同じ端末にインストールできる
- アプリ名
- ホーム画面に表示されるアプリ名をTARGETによって変えることができる
- プログラム処理
- TARGETによってプログラム処理を変えることができる。例えば、テスト用と本番用で通信先のURLを別にするなどといったことが可能
TARGETの作り方
既存のTARGETを右クリック、Duplicateを選択してTARGETを複製する。
TARGETを複製するとアプリの設定ファイルInfo.plistも複製されるが、こちらは削除する。
Info.plistを複数使うこともできるが、一つのInfo.plistを使いまわした方が管理が楽。
削除すると新しくできたTARGETはInfo.plistが未選択の状態になるため、General > Identiry にあるChoose Info.plist File...
のボタンから既存のInfo.plistファイルを選択する。
Build Settingsなどの設定
TARGETには任意の名前をつけ、それぞれにBundle Identifierを設定する。
次に各TARGETのBuild Settingsの以下の値を編集する。
Other Swift Flags
Other Swift Flagsに -D TARGET名
を設定する。
この値はプログラム内でTARGET毎に処理を切り替えたい場合に、どのTARGETでビルドされているかを判定するために使う。(判定方法は後述)
DISPLAY_NAME
TARGET毎にアプリの表示名(ホーム画面のアプリアイコンの下に表示される名前)を変えるため、ユーザー定義のビルド設定 DISPLAY_NAME
を追加する。
Build Settings上部の + ボタンから Add User-Defined Setting
を選択して設定を追加し、Setting名を DISPLAY_NAME
、値をアプリの表示名にする。
Info.plistの設定
Info.plistに Bundle display name
の設定を追加し、Valueを $(DISPLAY_NAME)
にする。
これで各TARGETのBuild Settingsに設定した、DISPLAY_NAME
がアプリの表示名として適用される。
同じ要領でUser-Definedの変数を追加すれば、Info.plistの他の値も、TARGETによって切り替えることができる。
プログラム内での処理分岐方法
設定したOther Swift Flags
によってプログラム内の処理を分岐させることができる。
#if
、#elseif
、#else
、#endif
を使って以下のように処理を切り替える。
主に参照するAPI、リソースなどを切り替える際に使用する。
class Environment {
var apiURL: String
init() {
#if PRODUCT
apiURL = "https://api-prod.net"
#elseif TEST
apiURL = "https://api-test.net"
#else
apiURL = "https://api-else.net"
#endif
}
}
TARGETを複数運用する際の注意点
複数TARGETを作った場合、ファイルを追加する際に全てのTargetsにチェックを入れるよう注意する必要がある。
チェックを入れないと、TARGETにリソースが含まれなくなってしまう。
チェックを入れ忘れた場合、該当のファイルを選択して右パネルの Target Membership
からチェックを付けなおすこともできる。
Target毎に含まれるリソースが異なっている場合、Build Phases
の Compile Sources
、Copy Bundle Resources
に表示されるitem数がTargetによって差がある状態になる。
Schemeの設定
各TARGETが設定できたら、起動のためのSchemeを作成する。
Xcode左上のScheme名のところからManage Schemes
を選択して、Schemeの一覧を表示。
既存のSchemeを一度全て削除して、+ ボタンから任意のTARGET用のSchemeを追加する。
以降は作成したSchemeを用いてアプリを起動すれば、Schemeに選択されたTARGETが適用された状態でアプリがビルドされる。
Schemeの設定はユーザーディレクトリに保存されるが、通常ユーザーディレクトリはgitignoreに設定してGit管理外とするので、Schemeの設定は各自で行う必要がある。
Objective-C での設定方法
Objective-Cの場合、Build SettingsのOther Swift Flags
の代わりに、Preprocessor Macros
を使用する。
Preprocessor Macros
にTEST=1
などの値を設定することで、以下のようにプリプロセッサーマクロで処理を切り替えられる。
#ifdef PRODUCT
apiURL = @"https://api-prod.net";
#endif
#ifdef TEST
apiURL = @"https://api-test.net";
#endif