読者です 読者をやめる 読者になる 読者になる

酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

iOSアプリにFirebase.RemoteConfigを導入する

iPhone

本記事ではiOSアプリにFirebase.RemoteConfigを導入した際にしたことを紹介します。メモなのでそのまま運用できないかもしれません。

たとえば、ユーザーにアップデートを促す際にアラートを表示させます。

アラートの表示条件としては、ウェブに置いているコンテンツ*1に最新アプリのバージョン(1.0.1)を書いておいて、ユーザーが使用しているアプリ(1.0.0)よりも新しければアラートを表示させる、ということをよくしますよね。

f:id:ch3cooh393:20161205133302p:plain

そのほか、「2016年12月30日まではクローズ状態で、2017年1月1日になるとオープン状態にしたい」という要件があるかもしれません。期間が決まっていればアプリにハードコーディングでもしれおけば良いのですが、もし「必要とするコンテンツが揃い次第、オープン状態にしたい」となった場合アプリだけで制御することができません。

そのあたりの制御をFirebase.RemoteConfigを使うことで簡単に使用することができます。

前準備

先にFirebaseの導入を済ませておく必要があります。

Podfile

  pod 'Firebase'
  pod 'Firebase/RemoteConfig'

コンフィグの初期値

default_config.plist

f:id:ch3cooh393:20161205132016p:plain

デフォルト値をplistから読み込ませておきます。

import UIKit
import Firebase
import FirebaseRemoteConfig

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var remoteConfig: FIRRemoteConfig?

    func application(_ application: UIApplication, 
        didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        FIRApp.configure()
        
        remoteConfig = FIRRemoteConfig.remoteConfig()
        remoteConfig?.setDefaultsFromPlistFileName("default_config")
        //デベロッパーモードを有効にしておく
        if let settings = FIRRemoteConfigSettings(developerModeEnabled: true) {
            remoteConfig?.configSettings = settings
        }
        
        return true
    }

各画面でリモートのコンフィグ値をフェッチする

コンフィグの値はローカルにキャッシュされます。デフォルトでは12時間(43200秒間)キャッシュが保持されます。ここでは30秒キャッシュさせるようにしました。

なんどもサーバーへアクセスすることを防ぐために数回Remote Configへリクエストを送ると、キャッシュされたデータが返ってくるようになります。

import UIKit
import FirebaseRemoteConfig

class FirstViewController: UIViewController {

    let remoteConfig = FIRRemoteConfig.remoteConfig()
    
    @IBOutlet weak var detailLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //キャッシュ保持期間を秒単位で指定する
        remoteConfig.fetch(withExpirationDuration: 30) { [weak self] (status, error) in
            if status == .success {
                print("Config fetched!")
                self?.remoteConfig.activateFetched()
            } else {
                print("Config not fetched")
            }
            self?.updateDisplay()
        }
        self.updateDisplay()
    }

    private func updateDisplay() {
        let p1 = remoteConfig["hogehoge_string"].stringValue
        let p2 = remoteConfig["hogehoge"].boolValue
        
        detailLabel.text = "\(p1) \(p2)"
    }
}

Firebaseコンソールでパラメータを追加・変更する

コンソールでパラメータを追加します。追加できるのは文字列型、数字型、Bool型のようです。

f:id:ch3cooh393:20161205132740p:plain

適当なパラメータhogehogeを追加しました。デフォルト値がfalseだったのでtrueにしました。

f:id:ch3cooh393:20161205132816p:plain

アプリを起動させるとフェッチが動いて、Firebaseコンソールで設定した値を取得することができます。

f:id:ch3cooh393:20161205132838p:plain

let p1 = remoteConfig["hogehoge_string"].stringValue
let p2 = remoteConfig["hogehoge"].boolValue
        
detailLabel.text = "\(p1) \(p2)"

またコンソール上で値を変更してみました。

f:id:ch3cooh393:20161205132638p:plain

フェッチ期間を30秒に指定しているので、30秒以上経過すると新しい値が反映されることを確認できました。

f:id:ch3cooh393:20161205132631p:plain

*1:大抵JSONファイルだったりする