Firebase Remote Configの導入手順



# Firebase Remote Configとは
Firebase Remote Config のコンソール側でKey:Valueの値を登録しておくことで、その値をクラウドで更新することができます。

# メリット
アプリの動作や外観を変更する際に、アプリのアップデートを配布せずとも、Firebase Remote Configのコンソール上で設定を修正するだけで変更することができます。
基本的に全ユーザーに対して同じKey-Valueをリアルタイムに配信・反映でき以下のようなケースに利用することができます。

- 条件（アプリバージョン、OS、指定％のユーザー等）を指定してValueを変える事もできる。
- A/Bテストにも使用することができる。

よくアプリのバージョンをFirebase Remote Configで管理し、強制アップデートを促す際に使われることが多いそうです。

# デメリット
### 即時反映には向いていない
基本的にフェッチ(クラウドから値の取得)は12時間に1度しか行われません。一度フェッチを行った場合は、キャッシュが残り再度フェッチするまでの間はキャッシュされた値が使用されます。そのため、即時変更を求める値の取得についてはFirebase Remote Configの利用は適していません。

# 導入手順
## Firebaseコンソールでの設定
### 1. Firebaseコンソールを開き、メニューからRemote Configを選択します。
<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484337/6988eafd-31a4-92e0-1724-eb68049383ba.png" width=30%>

### 2. 条件の設定
ここでは、それぞれ値を取得する際の条件を設定することができます。

条件については

- デバイスの地域 / 国
- 現在の時刻とデバイスで取得された時刻
- アプリのバージョン
- ビルド番号

などで設定できます。

ここでは、デバイスが日本かどうかで判別していきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484337/767e6503-f251-5b4e-980c-ca88888f96ec.png)





などで条件を設定することも可能です。

### 3. パラメーターキーの設定

上記で決めた条件に基づいて、

```
-  デバイスの地域 / 国　= 日本　の場合：ヤフーのURL
-  デバイスの地域 / 国　= 日本以外　の場合：グーグルのURL
```
を取得するように設定していきます。
これによってデバイスの国によって遷移する先のURLを変更することができます。


## Swift側
### 1.Remote Configオブジェクトの作成

```

remoteConfig = RemoteConfig.remoteConfig()
let settings = RemoteConfigSettings()

//　フェッチ間隔の設定（開発環境のみ設定）
settings.minimumFetchInterval = 0

remoteConfig.configSettings = settings
```

Remote Configは基本的に一度フェッチしたらキャッシュ時間内（デフォルトでは12時間）では再度フェッチされません。
そのため、開発環境では上記のように`minimumFetchInterval`を設定する必要があります。これにより開発環境ではフェッチ間隔に関係なくフェッチを行うことができます。ただし、このコードは必ず本番環境に書かないように注意してください。

> この設定は開発目的でのみ使用し、本番環境で実行されるアプリには使用しないでください。10 人の小さな開発チームでアプリをテストするだけの場合、毎時のサービス側の割り当て制限に達する可能性はほとんどありません。しかし、最小フェッチ間隔に非常に小さい値を設定して何千人ものテストユーザーにアプリを push すると、アプリがこの割り当てに達する可能性が高くなります。

https://firebase.google.com/docs/remote-config/use-config-ios?hl=ja


### 2.デフォルト値の設定
Firebase Remote Config側に値が設定されていなかったり、オフラインで取得できない際に使うデフォルト値をここで設定します。
plistファイルを作成し、一連のパラメータ名とデフォルト値を定義します。

```
// RemoteConfigDefaultsはplistファイルのファイル名
remoteConfig.setDefaults(fromPlist: "RemoteConfigDefaults")
```

### 3.値の読み込み

```swift

remoteConfig.fetchAndActivate { (status, error) -> Void in
            if status == .successFetchedFromRemote || status == .successUsingPreFetchedData {
                // fetchが完了した際の処理を記述
                print("Config fetched!")
                // 今回取得した値はjson形式のためデコードする必要があります
                let jsonString = remoteConfig["parameter"].stringValue
                let jsonData = jsonString?.data(using: .utf8)
                do {
                    // getUrlにRemote Configから取得した値を格納している
                    var urlDictionary = try JSONSerialization.jsonObject(with: jsonData!, options: [])
                    guard let dictionary = urlDictionary as? [String: Any],
                    let getUrl = dictionary["url"] as? [String: Any]　else { return }
            } else {
                // fetchに失敗した際の処理を記述
                print("Config not fetched")
            }
        }
}
```

`fetchAndActivate`によって値のフェッチとfetchした値を有効化する処理を一度に行っています。
このように実装することでFirebase Remote Configから値を取得、アプリ内で利用することができます。