Firebaseの設定をビルド環境ごとに切り替える[iOS][Android][Firebase]

# Firebaseの設定をビルド環境ごとに切り替える[iOS][Android]

こんにちは！寺坂です。

[GANMA!](http://ganma.jp/ "GANMA!")では、iOS/Androidのアプリに [Firebase](https://firebase.google.com/ "Firebase")を導入しています。

いったん必要な部分だけ利用しているので、
Analytics, Notification, Crash, Dynamic Linksなど、まだ一部の導入だけですが、

徐々に利用ノウハウを貯めていっています。

今回は、導入に際して行った環境切り替えのアプローチを紹介したいと思います。


## プロダクション用と開発用に2種類のFirebaseアプリを用意する

普段、プロダクション用と開発用の環境を分けて開発しているので、
Firebaseの設定もそれぞれに用意する必要がありました。

GANMA!ではFirebaseプロジェクトを一つ作り、
環境別に複数のモバイルアプリを作成して対応しています。

### Firebaseの構成

* プロジェクト
    * GANMA! 
* モバイルアプリ 
    * Production用 (iOS/Android)
    * Dev用 (iOS/Android)


## Firebase設定を切り替えて環境別に計測する(iOS)

上述のように、Production用とDev用の2つ用意したので、
アプリ側の設定もそれぞれに合わせてあげる必要があります。         

### // 通常設定

Firebaseコンソールからplistをダウンロードして、iOSプロジェクト内に配置。
AppDelegate内で下記のメソッドを呼びます。        

```swift
FIRApp.configure()
```

### // 環境切り替え

環境を切り替えるためには、
上記のメソッドの代わりに[FIRApp.configureWithOptions(options)](https://firebase.google.com/docs/reference/ios/firebaseanalytics/interface_f_i_r_app.html#ab9ce69bec960856900bcf1265bba98b6 "document")を使います。        

ビルド環境に応じた値をFIROptionsに詰めて渡してあげることで、
Firebaseの向き先を変えることができます。

### // 手順

* 環境ごとのplistをダウンロード(Production用, Dev用など)
* それぞれのplistを開いてその中身を見る
* それぞれの設定値をビルド時に得られるようにする(環境別にconfを用意するなど)
* FIRApp.configureWithOptionsを使って、環境に応じた設定値をセットする

**注意点**

FIRApp.configureWithOptionsを使うようにしても、
GoogleService-Info.plistはちゃんと配置しておく必要があります。 


```swift
let options: FIROptions = FIROptions(
    googleAppID      : GoogleAppID,
    bundleID         : BundleID,
    GCMSenderID      : GCMSenderID,
    APIKey           : APIKey,
    clientID         : ClientID,
    trackingID       : TrackingID,
    androidClientID  : AndroidClientID,
    databaseURL      : DatabaseURL,
    storageBucket    : StorageBucket,
    deepLinkURLScheme: DeepLinkScheme
)
FIRApp.configureWithOptions(options)
```


## Firebase設定を切り替えて環境別に計測する(Android)

### // 通常設定

Firebaseコンソールから**google_service.json**をダウンロードして配置します。

### // 環境切り替え

google_service.jsonには、
Firebase上のアプリそれぞれの設定値が既に記載されていますので、

これをAndroidプロジェクト内に配置して、
jsonファイル内に記載されている"package_name"の部分を修正します。

### // 手順

* google_service.jsonをダウンロードして配置
* "android_client_info"内の"package_name"をビルド時のパッケージ名と一致させる

**注意点**

特に気をつける必要があるのは、jsonファイルに記載している"package_name"の値が
ビルド時のパッケージ名と一致していなければならない点です。

jsonファイルに存在しないパッケージ名でビルドしようとすると、
エラーになってビルドできなくなります。      

ですので、Firebase上には作成していないパッケージ名でビルドする時には、
そのパッケージ名をセットした"client_info"を追加してあげる必要があります。    

```json:google_service.json
{
  "project_info": {
    ...
  },
  "client": [
    // ここの配列にパッケージの種類分だけ"client_info: {}"が入る
  {
      "client_info": {
        "android_client_info": {
          "mobilesdk_app_id": "0000000000000:android:hoge",
          "package_name": "プロダクション用のパッケージ名",
             ....
        },
             ....
      }
  },
  {
      "client_info": {
        "android_client_info": {
          "mobilesdk_app_id": "11111111111:android:hoge1",
          "package_name": "開発用のパッケージ名",
             ....
        },
             ....
      }
  },
  {
      "client_info": {
        "android_client_info": {
          "mobilesdk_app_id": "11111111111:android:hoge1",
          "package_name": "開発用のパッケージ名２",
             ....
        },
             ....
      }
  }
    ....
  ],
  "configuration_version": "1"
}
```

## おわり

以上になります。

ピンポイントな内容ですが、Firebase導入にあたって参考になれば幸いです。

## 参考リンク

[Firebaseドキュメント](https://firebase.google.com/docs/ "Firebase Document")