【Xcode】アプリを環境ごとに共存させる方法!Bundle IDを本番と開発で切り替える
この記事からわかること
- Xcodeでシミュレーター内に同じアプリを複数共存させる方法
- 本番(Release)、開発(dev)、ステージングなどを切り替える方法
- アプリ名やBundle IDを環境ごとに変える方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Xcode:14.2
今回の目標は以下のような感じです。
シミュレーター内に同じアプリを複数共存させる方法
APIとやり取りをするアプリなど環境に応じて中身のリクエストURLを変更させることはよくあります。スキームを変更することで簡単に環境を切り替えることはできますが、シミュレーター内には基本同じアプリは存在できないため、その都度切り替えてビルドする作業を行う必要があります。
アプリにはアプリを識別するための値としてBundle IDが振られていますが、これが同じものは同じアプリとしてみなされます。なので逆にBundle IDをビルドする前に変更すれば同じアプリを共存させることができるようになります。これは手動で行っても良いですが面倒なのでスキームに応じて自動で切り替わるように設定していきたいと思います。
Bundle IDを環境によって切り替える方法
今回は開発(dev)、ステージング(stg)、本番(Release)の3つの環境を用意した上でBundle IDとアプリ名を環境に応じて変化できるようにしていきます。まずはステージング環境を追加していきます。
「PROJECT」>「Info」>「Configurations」内に環境が定義されているので「+」をクリックして「Duplicate "Debug" Configuration」を選択します。(ステージングは開発環境寄りなので)
続いて「PROJECT」>「Build Settings」>「+」>「Add User-Defined Setting」をクリックしてUser-Definedを追加していきます。
おすすめ記事:【Xcode】User-Definedで環境変数やビルド設定を変更する
ここにキー値はなんでも良いですが今回はBUNDLE_DISPLAY_NAME_PREFIX
とBUNDLE_ID_SUFFIX
を追加して値には以下のようにBUNDLE_DISPLAY_NAME_PREFIX
には接頭辞につけたいD
とS
を、BUNDLE_ID_SUFFIX
には接尾辞には.dev
と.stg
を渡します。ここではまだ定義しただけですので何も変わりません。
続いて「TARGETS」>「Build Setting」>「Product Bundle Identifier」を探します。こちらは「TARGETS」側です。ここにBundle IDが定義されているのでそれぞれ変更します。以下のステージングのように先ほどのBUNDLE_ID_SUFFIX
を${BUNDLE_ID_SUFFIX}
形式で追加します。確定すると自動でここの見た目は変わります。
これでBundle IDが環境によって自動で切り替わるようになりました。次のアプリ名を分かりやすく変更されるように設定していきます。
アプリ名を環境によって切り替える方法
アプリ名を変更するには「TARGETS」>「Info」タブの中にBundle display name
を追加し、$(BUNDLE_DISPLAY_NAME_PREFIX)$(PRODUCT_NAME)
と入力します。これで「接頭辞+アプリ名」が表示されるようになります。
環境の違うスキームを入れ替えてアプリをビルドして見てください。以下のようになっていれば成功です。
ちなみにBundle IDは「TARGETS」>「Info」タブの中にBundle Identifier
とありますがここのみに$(PRODUCT_BUNDLE_IDENTIFIER)${BUNDLE_ID_SUFFIX}
と入力してもすぐに戻されてうまく変化しませんでしや。
開発環境をコードから参照する方法
せっかくステージング環境を追加したのでコードから環境状態を取得して分岐できるようにしておきます。「Project」>「Build Settings」>「Swift Compiler - Custom Flags」>「Active Compilation Conditions」にステージングが追加されているのでSTAGING
と追加することでコードから参照できるようになります。
#if DEBUG
print("開発")
#elseif STAGING
print("ステージング")
#else
print("本番")
#endif
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。