概要
開発用、本番用など同じ端末に接続先の違うアプリを入れられると便利です。
1端末に同じ Bundle Identifier
では入れられないので、環境によって Bundle Identifier
を変えることで実現できます。
なおPush通知をするアプリの場合は Bundle Identifier
毎に証明書が必要になるので注意が必要です。
つまり、開発、ステージング、本番接続用のアプリを共存させたければ、それぞれのサーバー用のBundle Identifier
を作り、それぞれに別のPush証明書をサーバーに配置する必要があります。
やり方
-
その後、Objective-cなら
Preprocessor Macros
、SwiftならOther Swift Flags
を設定します。(Swiftの場合は、-D DEBUG
のようにする)
-
Objective-Cの場合は、
Preprocessor Macros
を見てプログラム上で以下のように分岐します。
#ifdef DEBUG
// ...
#elif RELEASE
// ...
#else
// ...
#endif
- Swiftの場合は
Other Swift Flags
を見てプログラム上で以下のように分岐します。
#if DEBUG
// ...
#elseif RELEASE
// ...
#else
// ...
#endif
あとは、Bundle Identifier
を変更するだけです。
-
Build Settings → Packaging → Product Bundle Identifier で、それぞれの環境ごとに変えます。
同様に Product Nameをそれぞれの環境ごとに変えます。
Product Module Nameはすべて同じ名前にするといいでしょう。Module名なのでアルファベットで書きます。
-
Info.plist のBundle nameを
$(PRODUCT_NAME)
にする。 -
テストターゲットで
TEST_HOST
を検索して、それぞれのProduct Nameに合わせて書き直します。これが違うとテストが動作しません。 -
最後にスキームごとにビルドすれば完成です。
Apnsを使ったりする場合は、Code Signing EntitlementsもConfigurationごとに作ります。そうしないとios10以降ではデバイストークンが受けられません
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>aps-environment</key>
<string>development</string>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>aps-environment</key>
<string>ad-hoc</string>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>aps-environment</key>
<string>production</string>
</dict>
</plist>