iOSからFirebaseのRemote Configを利用する方法

iOS環境からの`Firebase`の`Remote Config`を利用する方法です。
言語は`Swift`です。

この記事はFirebaseの[ガイド](https://firebase.google.com/docs/ios/setup?authuser=2)参考しました。

Firebaseのプロジェクト生成
-

Firebaseのプロジェクト生成にはアプリバンドルidが要るため、まずXcodeから練習用シングルビューアプリのプロジェクトを生成してから進めます。
アプリプロジェクトが作られたらFirebaseのプロジェクトを生成します。

<img width="1202" alt="スクリーンショット 2018-01-19 14.27.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/221266/0c80762f-96f7-2b1e-a773-b84183f13418.png">

この記事はiOS環境からFirebaseを利用する方法に対する内容なのでiOSを選択します。

<img width="1239" alt="スクリーンショット 2018-01-19 14.30.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/221266/cb868b99-3b17-4081-8a9b-9ba1a7c7b002.png">

次へ進み設定ファイルをダウンロードします。案内通りにアプリのプロジェクトのルートに移動します。

<img width="1244" alt="スクリーンショット 2018-01-19 21.07.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/221266/eb727c96-1450-69dc-4408-8b5b617eee0e.png">

Remote Configに移動してパラメータのキー値を追加します。

```
loading_message    : Remote Configがフェッチされる前に表示されるメッセージです。
true_message       : show_event_messageがtrueの時のメッセージです。
false_message      : show_event_messageがfalseの時のメッセージです。
show_event_message : イベント状況を作動するかを決定するブールバリューです。
```

これでFirebaseの事前準備が終わりました。

アプリブロジェクトにFirebaseを実装
-

- Podfileファイルに次の項目を追加します。

```text:Podfile
pod 'Firebase/RemoteConfig'
```
- `pod install`を実行します。
- 設置された `.xcworkspace`を実行し、`GoogleService-Info.plist`を入れます。

`Firebase`をインポートして,
`application:didFinishLaunchingWithOptions: `メソッドにFirebaseApp公有インスタントを構成します。

```swift:appDelegate.swift
import Firebase

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        FirebaseApp.configure()
        
        return true
    }
```

画面からRemote Configのパラメータを確認できるように簡単なラベルとボタンを追加します。

<img width="806" alt="スクリーンショット 2018-01-19 21.42.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/221266/760cda81-4c81-a846-af86-acef028e2dfb.png">

そして`ViewContorller`にRemote Configを実装しましょう。

```swift:ViewController.swift
//
//  ViewController.swift
//  practive
//
//  Created by jeonsangjun on 2018/01/19.
//  Copyright © 2018年 jeonsangjun. All rights reserved.
//

import UIKit
import Firebase

class ViewController: UIViewController {
    
    var remoteConfig: RemoteConfig!
    let loadingMessageConfigKey = "loading_message"
    let trueMessageConfigKey = "true_message"
    let falseMessageConfigKey = "false_message"
    let showEventMessageConfigKey = "show_event_message"
    
    @IBOutlet weak var testLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        remoteConfig = RemoteConfig.remoteConfig()
        // 随時更新されるリモートの値をすぐ確認できるようにディベロッパーモーとに設定する。
        let remoteConfigSettings = RemoteConfigSettings(developerModeEnabled: true)
        remoteConfig.configSettings = remoteConfigSettings!
        
        fetchConfig()
    }
    
    
    @IBAction func showMessageAction(_ sender: Any) {
        fetchConfig()
    }
    
    func fetchConfig() {
        // フェッチが終わる前まで表示されるメッセージ
        testLabel.text = remoteConfig[loadingMessageConfigKey].stringValue
        
        // ディベロッパーモードの時、expirationDurationを0にして随時更新できるようにする。
        let expirationDuration = remoteConfig.configSettings.isDeveloperModeEnabled ? 0 : 3600
        remoteConfig.fetch(withExpirationDuration: TimeInterval(expirationDuration)) { (status, error) -> Void in
            if status == .success {
                print("Config fetched!")
                self.remoteConfig.activateFetched()
            } else {
                print("Config not fetched")
                print("Error: \(error?.localizedDescription ?? "No error available.")")
            }
            self.setDisplayLabel()
        }
    }
    
    func setDisplayLabel() {
        // show_event_messageがtrueの場合
        if remoteConfig[showEventMessageConfigKey].boolValue {
            testLabel.text = remoteConfig[trueMessageConfigKey].stringValue
        // show_event_messageがfalseの場合
        } else {
            testLabel.text = remoteConfig[falseMessageConfigKey].stringValue
        }
    }
    
}


```
シミュレーターを実行します。

<img width="320" alt="Simulator Screen Shot - iPhone SE - 2018-01-19 at 22.11.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/221266/a7dd9b2b-874c-f167-8bc9-8f69b8e3ccfe.png">


`show_event_message`がtrueなので`true_message`が表示されます。

<img width="1140" alt="スクリーンショット 2018-01-19 21.59.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/221266/751b2ff0-1760-0d0e-7db2-6112bc56c01e.png">

シミュレーターはそのままにしてまたFirebaseのRemote Configに移動します。
`show_event_message`をフォルトに変更して`変更を公開`を押します。

<img width="320" alt="Simulator Screen Shot - iPhone SE - 2018-01-19 at 22.13.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/221266/a981cfe6-72ac-4af2-baa9-9607c5ce3a4a.png">

 そしてシミュレーターに戻ってShowボタンをタップすると、
`loading_message`が少し表示されてから`false_message`に変わって表示されます。