Xcode9.2にて確認

TARGETについて

TARGETはビルド設定のまとまりで、Xcodeでプロジェクトを作成すると自動で1つ作成される。
TARGETを複数用意することで、テスト用、本番用などを切り替えてアプリをビルドすることができる。
サーバー環境を複数用意する場合などは、TARGETも複数作成すると良い。

TARGETによって切り替えられるもの

必要であれば様々な設定をTARGETで切り替えられるが、主に以下をTARGETによって切り替える。

Bundle Identifier
Bundle IdentifierをTARGET毎に変えることで、各TARGETでビルドしたアプリを別アプリとして同じ端末にインストールできる
アプリ名
ホーム画面に表示されるアプリ名をTARGETによって変えることができる
プログラム処理
TARGETによってプログラム処理を変えることができる。例えば、テスト用と本番用で通信先のURLを別にするなどといったことが可能

TARGETの作り方

既存のTARGETを右クリック、Duplicateを選択してTARGETを複製する。

スクリーンショット 2018-03-21 12.09.15.png

TARGETを複製するとアプリの設定ファイルInfo.plistも複製されるが、こちらは削除する。
Info.plistを複数使うこともできるが、一つのInfo.plistを使いまわした方が管理が楽。

スクリーンショット 2018-03-21 12.16.48.png

削除すると新しくできたTARGETはInfo.plistが未選択の状態になるため、General > Identiry にあるChoose Info.plist File...のボタンから既存のInfo.plistファイルを選択する。

Build Settingsなどの設定

TARGETには任意の名前をつけ、それぞれにBundle Identifierを設定する。
スクリーンショット 2018-03-29 10.48.15.png

次に各TARGETのBuild Settingsの以下の値を編集する。

Other Swift Flags

Other Swift Flagsに -D TARGET名 を設定する。
この値はプログラム内でTARGET毎に処理を切り替えたい場合に、どのTARGETでビルドされているかを判定するために使う。(判定方法は後述)

スクリーンショット 2018-03-29 10.49.59.png

DISPLAY_NAME

TARGET毎にアプリの表示名(ホーム画面のアプリアイコンの下に表示される名前)を変えるため、ユーザー定義のビルド設定 DISPLAY_NAME を追加する。
Build Settings上部の + ボタンから Add User-Defined Setting を選択して設定を追加し、Setting名を DISPLAY_NAME、値をアプリの表示名にする。

スクリーンショット 2018-03-29 10.56.35.png

スクリーンショット 2018-03-29 11.01.10.png

Info.plistの設定

Info.plistに Bundle display name の設定を追加し、Valueを $(DISPLAY_NAME) にする。
これで各TARGETのBuild Settingsに設定した、DISPLAY_NAME がアプリの表示名として適用される。

スクリーンショット 2018-03-29 11.05.07.png

同じ要領で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にリソースが含まれなくなってしまう。

スクリーンショット 2018-03-29 11.30.51.png

チェックを入れ忘れた場合、該当のファイルを選択して右パネルの Target Membership からチェックを付けなおすこともできる。

スクリーンショット 2018-03-29 12.12.43.png

Target毎に含まれるリソースが異なっている場合、Build PhasesCompile SourcesCopy Bundle Resources に表示されるitem数がTargetによって差がある状態になる。

スクリーンショット 2018-03-29 11.36.32.png

Schemeの設定

各TARGETが設定できたら、起動のためのSchemeを作成する。
Xcode左上のScheme名のところからManage Schemes を選択して、Schemeの一覧を表示。

スクリーンショット 2018-03-29 11.39.21.png

既存のSchemeを一度全て削除して、+ ボタンから任意のTARGET用のSchemeを追加する。
スクリーンショット 2018-03-29 11.42.43.png

以降は作成したSchemeを用いてアプリを起動すれば、Schemeに選択されたTARGETが適用された状態でアプリがビルドされる。

Schemeの設定はユーザーディレクトリに保存されるが、通常ユーザーディレクトリはgitignoreに設定してGit管理外とするので、Schemeの設定は各自で行う必要がある。

Objective-C での設定方法

Objective-Cの場合、Build SettingsのOther Swift Flagsの代わりに、Preprocessor Macrosを使用する。
Preprocessor MacrosTEST=1などの値を設定することで、以下のようにプリプロセッサーマクロで処理を切り替えられる。

#ifdef PRODUCT
    apiURL = @"https://api-prod.net";
#endif
#ifdef TEST
    apiURL = @"https://api-test.net";
#endif
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.