【Firebase・iOS】GoogleService-Info.plist を環境別に読み込む方法

Xcodeで productionstagingdevelopment と言った環境別にビルドターゲットを分けることも多いと思いますが、必然的に、Firebase の Authentication や Cloud Firestore も環境別にデータベースを分けることになります。

よって環境ごとの GoogleService-Info.plist をビルド時に決定しなければいけません。

GoogleService-Info.plist は FirebaseApp.configure() の処理で読み込まれます。

デフォルトでは「GoogleService-Info.plist」という名前のファイルを読むこむようになっているため、ビルドターゲットごとに読み込むファイルを指定する必要があります。

方法は2つあります(他にもあるかもしれませんが)。

  1. 環境ごとにファイル名を変えて FirebaseApp.configure の引数にオプション情報として渡す
  2. 環境ごとのディレクトリにファイルを格納し、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 を環境それぞれのファイルごとにビルドターゲットの指定を変えます。

開発環境用の GoogleService-Info.plist

このようにすれば、同じファイル名でもビルドターゲットごとに別々のファイルを FirebaseApp.configure() で読み込んでくれるようになります。

ビルドターゲットが分かれているのであれば、こちらの方がコードを書く必要もありませんしシンプルで良いかと思います。

以上