ビルドターゲットを使い分けると「有料版/無料版」「デバッグとリリースで違うBundleIdentifierを使いたい」等、コードはほとんど同じでちょっとだけ違うビルドをしたいものを、一つのプロジェクトにまとめておくことができます。
LCD Clockの有料版と無料版もこの方法で作り分けています。(ステマ)
【LCD Clock】
https://itunes.apple.com/jp/app/lcd-clock/id295737235?mt=8
【LCD Clock Lite】
https://itunes.apple.com/jp/app/lcd-clock-lite-clock-calendar/id567652828?mt=8
ここではビルドターゲットを分ける具体的な手順を説明します。
ビルドターゲットを分ける方法
これで当初のビルドターゲットを分けるというところまではできました。
この時点でビルド設定とInfo.plistも分かれているので、ターゲットに応じたBundleIdentifierなどを使い分けることができます。
ですがここまででは「違うビルドの設定ができた」というだけで、コードで分岐させることはまだできません。コードで分岐が書けるようになるにはもう一手間必要です。
正確には、別々な設定をしたInfo.plistの値などをつかって分岐させることはできますが、普通の状況だとターゲットで異なる処理を動的に(実行時に)分岐させる必要は無く、はじめからどちらかだけで良い場合がほとんどです。
そこで、下記のビルド設定で定義する値を使いプリプロセスの段階で分岐させます。
プリプロセスはコンパイルの前に行われ対象外の部分は無いのと同じです。ですので実行時に分岐判定などが行われることもなくターゲットが増えたからと言って実行時の処理が増えることもありません。
ターゲットに応じて分岐する方法
ターゲットを選択してBuildSettings、PreprocessorMacrosを開きます。
今回は、それぞれに「MYTARGET_A」「MYTARGET_B」という定義を追加しました。
これで準備は完了です。
ターゲットを選択してビルドすれば、それぞれに応じた定義が有効になります。
あとは下記の用に、必要な箇所で分岐させます。
#ifdef MYTARGET_A
NSLog(@"MYTARGET_A");
#endif
#ifdef MYTARGET_B
NSLog(@"MYTARGET_B");
#endif
ちなみにターゲットが2つしかなければelseを使って
#ifdef MYTARGET_A
NSLog(@"MYTARGET_A");
#else
NSLog(@"MYTARGET_B");
#endif
のようにも書けます。
ちなみにLCD Clockでは、有料版には
このようにウィジェット(TodayExtension)が2つ含まれていますが、無料版にはウィジェットは含まれていません。
ビルドターゲットでこのような使い分けも可能です。