89
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

iOSアプリのビルドTARGETを複数作る

TARGETについて

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

TargetとConfigurationどちらを使うべきか 2019/12/17 追記

Xcodeにはビルド設定を切り替える仕組みが、TargetConfigurationの2種類存在する。
Targetの方がより詳細な設定ができるが、この記事に書いた内容は全て Configuration でも切り替えられる。

多くの場合、Targetを複数作るよりConfigurationを複数作る方が運用が簡単である。

ただし、以下のようなケースはConfigurationでは対応できないため、Targetを複数作成する。

  • アプリに含めるリソース(画像)などを変えたい
  • ウィジェットなどのエクステンションを作る

※ ウィジェットについては Configuration でも切り替える方法があるかもしれない。

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
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
89
Help us understand the problem. What are the problem?