iOSに限らず、アプリ開発においてAPIのURLやアクセスキーといった環境変数を開発用ビルドとリリース用ビルドで切り替えられるようにしておくことは重要です。
XCodeでこれを実現する方法にはいくつかの選択肢があると思います。
本記事では、今のところ私がシンプルで良いと思っているやり方をご紹介したいと思います。
環境変数を切り替える
ここでは開発用ビルドとリリース用ビルドでAPIのURLを切り替えることを例とします。
Configuration
XCodeではアプリのビルド設定はConfiguration
と呼ばれており、デフォルトではDebug
とRelease
の2つが作成されています。
基本的にアプリの開発中はDebug
を使用します。
XCodeメニューからProduct > Scheme > Edit Scheme...を開くと、ビルド設定としてDebug
が指定されていることがわかります。
環境変数の設定
ここで紹介する環境変数の切り替え方法では、登場人物は以下の3つです。
- ターゲットのBuild Settings
- Info.plist
- Configuration構造体
環境変数(ここではAPIのURL)を参照する流れはこんな感じです。
APIクライアント -> Configuration構造体 -> Info.plist -> ターゲットのBuild Settingsに定義された環境変数
ターゲットのBuild Settings
まず、ターゲットのBuild Settingsに環境変数を定義します。
以下のように、ターゲットを選択してBuild Settingsタブ開き、Add User-Defined Settingをクリックします。
すると、Build Settingsの一番下のUser-Defined欄に項目が追加されるので、名前をSE_API_URL
に変更します。
そして、ビルド設定ごとに値を入力できるようになっているので、Debug
には開発用APIのURL、Release
には本番用APIのURLを入力します。
他の環境変数と名前がかぶらないようにプレフィックスをつけると良いようです。ここではSwitchEnvというプロジェクト名の頭文字を取ってから
SE
というプレフィックスをつけました。
Info.plist
次に、Info.plistから先程定義したSE_API_URL
を参照します。
以下のようにAppConfig
というDictionary型の項目を追加します。
そしてその中にApiUrl
という項目を追加し、値として$(SE_API_URL)
を入力します。
$()
でBuild Settingsに定義された環境変数を参照することができます。
今回は環境変数を一つだけ定義しますが、今後変数が増えていくことを見越して整理しやすいようにするために
AppConfig
という入れ物を作っています。
Configuration構造体
環境変数をソースコードから参照するために、Configuration
という名前の構造体を作成します(名前が紛らわしいですが)。
この構造体はシングルトンとして実装し、他のコードはこのシングルトンインスタンス経由で環境変数を参照します。
import Foundation
struct Configuration {
static let shared = Configuration()
private let config: [AnyHashable: Any] = {
let path = Bundle.main.path(forResource: "Info", ofType: "plist")!
let plist = NSDictionary(contentsOfFile: path) as! [AnyHashable: Any]
return plist["AppConfig"] as! [AnyHashable: Any]
}()
let apiUrl: String
private init() {
apiUrl = config["ApiUrl"] as! String
}
}
APIクライアントは以下のようにURLを参照します。
let url = URL(string: Configuration.shared.apiUrl)!
アプリ名、バンドルIDの切り替え
ビルド設定ごとに別々のアプリとしてインストールできるようにしておくと便利です。
ここではそのやり方について紹介します。
iOSではバンドルIDでアプリを一意に識別するので、開発用ビルドとリリース用ビルドでバンドルIDを分ければ別々のアプリとしてインストールできることになります。
まず、ターゲットのBuild SettingsでProduct Bundle Identifierという項目を探します。
そして、Debug
の方の値の最後に-debug
というサフィックスを追加します。
これでDebug
とRelease
でバンドルIDが変わります。
アプリの表示名も別々になるようにしましょう。
ターゲットのBuild SettingsにSE_BUNDLE_DISPLAY_NAME
という環境変数を追加します。
そしてDebug
とRelease
で別々の名前を入力します。
次に、Info.plistにBundle display name
という項目を追加し、$(SE_BUNDLE_DISPLAY_NAME)
という値を入力します。
これでアプリの表示名がビルド設定ごとに変わります。
Firebaseプロジェクトの切り替え
環境変数の切り替えという点で共通するので、以前書いた記事のリンクを載せておきます。
開発版とリリース版でFirebaseのGoogleService-Info.plistを切り替える
アプリアイコンの切り替え
アプリアイコンの切り替え方法は以下の記事で知りました。
ビルド設定の切り替えについても以下の記事の方が幅広く紹介されてますね。
XcodeでDevelop/Staging/Release環境を上手に切り分ける方法