背景・動機
業務でReact Nativeを使ったアプリを開発しています。
実機でアプリをテストする際に、毎回環境を切り替えてビルドする手間がかかっていました。
環境ごとに別名のアプリをビルドし実機にインストールできるようにしたので、備忘録も兼ねて投稿します。
概要
アプリからバックエンドのAPIサーバや、WebViewを使ってWebサーバへアクセスしており、バックエンドのサーバには、Development、Staging、Productionの3つの環境があります。
今回は、アプリもバックエンドのサーバと同様にStaging環境を追加し、Debug、Staging、Releaseでそれぞれ別名のアプリをビルドし実機にインストールします。
以下のような状態を目指します。
1. アプリのConfigurationにStagingを追加
デフォルトの状態ではアプリにはDebugとReleaseの2種類の設定しか用意されていませんので、Stagingの設定を追加します。
- Xcodeを開き、PROJECT > Info > Configurationsの「+」をクリック。
- Duplicate "Release" Configurationを選択し、Stagingと入力します。
2. Reactの各ライブラリがReleaseビルドを参照するようにPathを追加
ConfigurationにStagingを追加するだけではビルドに失敗してしまいます。
Reactをはじめとする外部のライブラリも、Debug、Releaseの2種類の設定しか対応していないためです。
今回は外部のライブラリはReleaseを参照するようにPATHを追加します。
2-1. Header Search PathsにPATHを追加
- TARGETS > アプリ名 > Build Settings > Search Paths > Header Search Pathsを開く。
- Stagingの値に
$(BUILD_DIR)/Release-$(PLATFORM_NAME)/include
をnon-recursiveで追加。 - 上記と同様の修正を
アプリ名Tests
にも行う。
2-1. Library Search PathsにPATHを追加
- Header Search Pathsのすぐ下にあるLibrary Search Pathsを開く。
- Stagingの値に
$(BUILD_DIR)/Release-$(PLATFORM_NAME)
をrecursiveで追加。 - 上記と同様の修正を
アプリ名Tests
にも行う。
同様の修正をTARGETS > アプリ名Testsにも行います。
3. 環境ごとにアプリ名とバンドル名を変更する
同一端末にアプリを共存させるためには、バンドル名が異なっている必要があります。
アプリ名も環境ごとに変更した方が、混乱せずに済むと思いますので、修正します。
3-1. ユーザー定義変数を設定する
- TARGETS > アプリ名 > Build Settingsの「+」をクリック。
- Add User-Defined Settingをクリック。
-
BUNDLE_IDENTIFIER_SUFFIX
とDISPLAY_NAME_PREFIX
を追加(名前は任意で構いません)。 - 各Configurationごとに、以下のキャプチャ画像のように設定します。
3-2. バンドル名、アプリ名にユーザー定義変数を追加
- TARGETS > アプリ名 > Info > Custom iOS Target Propertiesを開く。
- Bundle identifierの値を
$(PRODUCT_BUNDLE_IDENTIFIER)$(BUNDLE_IDENTIFIER_SUFFIX)
に設定する。 - Bundle display nameを
$(DISPLAY_NAME_PREFIX)アプリ名
に設定する。
4. 端末にインストールする
- macにiPhoneを接続しアプリをビルドします。
- Edit Scheme... > Build ConfigurationにStagingが増えていますので、適宜変更してビルドしてください。
- Debugビルドを実行するとアプリ名にDevが追加されたものが、Stagingビルドを実行するとStgが追加されたものがインストールされます。
- Releaseビルドは今までと同じように、アプリ名に何も追加されずインストールできます。