開発版とリリース版でFirebaseのGoogleService-Info.plistを切り替える

iOSアプリの開発版とリリース版で別々のFirebaseプロジェクトを使うとき、GoogleService-Info.plistを環境ごとに切り替えてあげる必要があります。
この切り替え方法についてまとめます。

## 環境ごとに別々のターゲットを使用する場合
### ターゲット設定
Firebaseに開発用とリリース用の２つのプロジェクトを作成しておきます。
ここではBundleIDは共通にすることとします。

開発版のターゲット名はFireApp-Debug、リリース版のターゲット名はFireApp-Releaseとします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/81715/36f3c2b7-4332-ed98-eda3-e913f9720aeb.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/81715/5b5fd395-f548-b21b-bc4b-23225c830ef5.png)


### GoogleService-Info.plistの配置
Configs/DebugとConfigs/Releaseといったように、環境ごとにディレクトリを作成し、そこにそれぞれのGoogleService-Info.plistファイルを配置します。
詳しくは後述しますが、**「GoogleService-Info.plist」という名前にしておく必要があります。**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/81715/94f2e867-18eb-ef07-96ed-d04360b2a6e3.png)

各GoogleService-Info.plistをそれぞれのターゲットに関連付けるのを忘れないようにしましょう。
こうすることで、FireApp-DebugターゲットではConfigs/Debug/GoogleService-Info.plistが、FireApp-ReleaseターゲットではConfigs/Release/GoogleService-Info.plistが使用されるようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/81715/6f65ad3c-f350-5741-a311-55fdba903eb3.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/81715/7f453aae-db35-2e80-626b-f54e6769caba.png)

あとはAppDelegateで以下のコードを実行するだけです。

```swift
FirebaseApp.configure()
```

## ターゲットは一つで、Configurationで切り替える場合
Firebaseに開発用とリリース用の２つのプロジェクトを作成しておきます。
ここではBundleIDは共通にすることとします。

### ターゲット設定
こちらの方法では開発版とリリース版でターゲットは分けないので、新しくターゲットを作成する必要はありません。
プロジェクト作成時にデフォルトで作成されるターゲットを使用することとします。

### GoogleService-Info.plistの配置
Configsディレクトリ配下に、GoogleService-Info-Debug.plistとGoogleService-Info-Release.plistという名前で配置します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/81715/30f9e96b-c9ab-1f66-065c-abb5da12af3c.png)

どちらのファイルも、ターゲットには関連付けないようにしておいて下さい（関連付けてもいいですがバンドルに無駄なファイルが追加されるだけです）。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/81715/b4eb950d-e326-5a2f-54bc-aa43a29e0064.png)

### ビルド時にGoogleService-Info.plistにリネームする
FirebaseSDKはGoogleService-Info.plistという名前を期待しているので、ビルド時にリネームしてバンドルに追加するという手段を取ります。

ターゲットのBuild Phasesに、Run Scriptを追加します。

```bash
if [ "${CONFIGURATION}" == "Release" ]; then
  cp "${PROJECT_DIR}/${PROJECT_NAME}/Configs/GoogleService-Info-Release.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"
else
  cp "${PROJECT_DIR}/${PROJECT_NAME}/Configs/GoogleService-Info-Debug.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"
fi
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/81715/dadab16a-4b6e-a742-2b16-3e0ce468b84b.png)

あとはAppDelegateで以下のコードを実行するだけです。

```swift
FirebaseApp.configure()
```

## [非推奨] FirebaseApp.configure(options:)メソッドを使う
アプリ起動時にファイル名を指定してFirebaseSDKを設定する方法があります。
AppDelegateで以下のようなコードを書きます。

```swift
#if DEBUG
    let fileName = "GoogleService-Info-Debug"
#else
    let fileName = "GoogleService-Info-Release"
#endif
let filePath = Bundle.main.path(forResource: fileName, ofType: "plist")!
let options = FirebaseOptions(contentsOfFile: filePath)!
FirebaseApp.configure(options: options)
```

DebugビルドかReleaseビルドかによって、使用するGoogleService-Info.plistファイルを切り替えます。
`#if DEBUG`のところは他の記事を参照して下さい([これ](https://qiita.com/qmihara/items/a6b88b74fe64e1e05ca4)とか)。

ただしこのやり方には問題があって、アプリを実行すると以下のようなログが出力されます。

```
[Firebase/Core][I-COR000012] Could not locate configuration file: 'GoogleService-Info.plist'.
[Firebase/Analytics][I-ACS020006] Google App ID from GoogleService-Info.plist is empty. Please, define GOOGLE_APP_ID in GoogleService-Info.plist for Analytics to work reliably. See https://goo.gl/txkZbE
[Firebase/Analytics][I-ACS025020] Analytics requires Google App ID from GoogleService-Info.plist. Your data may be lost. Google App ID has been changed. Original, new ID: (nil), 1:230766696330:ios:86cfac58ce17318b
```

[公式ドキュメント](https://firebase.google.com/docs/configure/?hl=ja#reliable-analytics)にもこの件に関して記載があり、FirebaseApp.configure()を実行するよりも前にGoogleService-Info.plistを参照しようとしてしまうようです。

アナリティクスデータが失われてしまう可能性があるようで、

> 可能な限りデフォルトの設定方法を使用することをおすすめします。

とのことなので、上述した２つの方法を使用すると良いでしょう。

この件に関連するIssueのリンクも貼っておきます: https://github.com/firebase/quickstart-ios/issues/75