Xcodeで production・staging・development と言った環境別にビルドターゲットを分けることも多いと思いますが、必然的に、Firebase の Authentication や Cloud Firestore も環境別にデータベースを分けることになります。
よって環境ごとの GoogleService-Info.plist をビルド時に決定しなければいけません。
GoogleService-Info.plist は FirebaseApp.configure() の処理で読み込まれます。
デフォルトでは「GoogleService-Info.plist」という名前のファイルを読むこむようになっているため、ビルドターゲットごとに読み込むファイルを指定する必要があります。
方法は2つあります(他にもあるかもしれませんが)。
- 環境ごとにファイル名を変えて FirebaseApp.configure の引数にオプション情報として渡す
- 環境ごとのディレクトリにファイルを格納し、Target Membership でビルドターゲットを指定する
❶については、ビルドターゲットを分けたくないが、コンパイルフラグによって環境を分ける場合にも適用出来ます。
順番に見ていきましょう。
GoogleService-Info.plist を環境別に読み込む方法
FirebaseApp.configure の引数にオプション情報として渡す
前述の通り、この方法は、単一のビルドターゲットで処理を分岐したい場合に役立ちます。
例えば、環境別に以下のようにファイル名を変えたとします。
- 本番環境:GoogleService-Info-prod.plist
- ステージング環境:GoogleService-Info-stg.plist
- 開発環境:GoogleService-Info-dev.plist
予め、環境ごとのコンパイルフラグを定義しておきます。
取得されたファイル名を元にオプションデータを作成し、configure の options: の引数とします。
#if DEVELOPMENT
let resource = "GoogleService-Info-dev"
#elseif STAGING
let resource = "GoogleService-Info-stg"
#else
let resource = "GoogleService-Info"
#endif
if let filePath = Bundle.main.path(forResource: resource, ofType: "plist") {
guard let options = FirebaseOptions(contentsOfFile: filePath) else {
assert(false, "Could not load config file.")
}
FirebaseApp.configure(options: options)
} else {
FirebaseApp.configure()
}
これで環境を分岐させることが出来ます。
Target Membership でビルドターゲットを指定する
先ず、以下のように環境別のディレクトリを用意し、それぞれの GoogleService-Info.plist を格納します。
- (プロジェクト直下など任意の階層)/Production/GoogleService-Info.plist
- (プロジェクト直下など任意の階層)/Staging/GoogleService-Info.plist
- (プロジェクト直下など任意の階層)/Development/GoogleService-Info.plist
そして、以下のキャプチャのように Xcode 画面右側にある Target Membership を環境それぞれのファイルごとにビルドターゲットの指定を変えます。
このようにすれば、同じファイル名でもビルドターゲットごとに別々のファイルを FirebaseApp.configure() で読み込んでくれるようになります。
ビルドターゲットが分かれているのであれば、こちらの方がコードを書く必要もありませんしシンプルで良いかと思います。
以上
コメントを残す