at kaneshin

Free space for me.

Firebase Remote Config for iOS

f:id:laplus-knsn:20161204223220j:plain

この記事は Firebase Advent Calendar 2016 - Qiita の4日目の記事です。

最近は Golang を用いたサーバサイド開発を専らの仕事としていますが、約2年前はガッツリと iOS アプリ開発を行っていました。そのときから「アプリの振る舞いや見た目、A/Bテストをサーバサイドでどうにかコントロールしたい」と思っていたので、今回はそれを満たすことのできる Firebase Remote Config について紹介しようと思います。

Firebase Remote Config とは

Firebase をご存知の方は多いと思いますが、Remote Config は Database, Storage と同じ立ち位置となる Firebase の一つのサービスです。この Remote Config が提供する機能は Firebase 上である値を定義し、その値を iOS、Android や Web のアプリ(主にクライアント)で取得し、使用することができます。ここでいう使用方法は実装者次第になりますが、設定した値に対してセグメントさせたユーザにのみ配信してA/Bテストに役立てたりします。 これによって、アプリ開発者が「開発〜検証〜リリース」という作業を行わずとも、アプリをアップデートすることができるようになります。 また、Firebase Analytics とも連携することができます。

開発

今回は iOS アプリでの開発で説明します。

0. Firebase on iOS

Add Firebase to your iOS Project」を読んでプロジェクトで Firebase を使用できる状態にします。

1. Xcode Project 作成

Xcode プロジェクトに Podfile ファイルがなければ pod init で作成し、下記のように Podfile に pod 'Firebase/RemoteConfig' を追加します。

target 'YourTargetName' do
  use_frameworks!

  pod 'Firebase/RemoteConfig'
end

追加したら pod install で RemoteConfig をインストールし、ワークスペース(.xcworkspaceファイル)を開いて開発を行います。

2. 実装

Firebase シングルトンの初期化

application:didFinishLaunchingWithOptions で Firebase を初期化します。

import UIKit
import Firebase

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

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

        FIRApp.configure()
        return true
    }

}

Remote Config から値の取得

FIRRemtoeConfig.remoteConfig() でシングルトンインスタンスを呼び出し使用します。例えば、ボタンのタイトルを変更するためには下記のように実装します。

let appDefaults: [String: NSObject] = [
    "reaction_button_text" : "Like",
]
FIRRemoteConfig.remoteConfig().setDefaults(appDefaults)

let fetchDuration: TimeInterval = 0
FIRRemoteConfig.remoteConfig().fetch(withExpirationDuration: fetchDuration) { [weak self] (status, error) in

    guard error == nil else {
        return
    }
 
    FIRRemoteConfig.remoteConfig().activateFetched()

    let title = FIRRemoteConfig.remoteConfig()["reaction_button_text"].stringValue ?? "Like"
    self.button.setTitle(title, for: UIControlState.normal)
}

こうすることによって、 "reaction_button_text" を Remote Config の方に値を設定することによって、Firebase 上でボタンのタイトルを変更することが可能になります。仮に、Remote Config に値を設定しないか、通信状況が悪い場合などはデフォルトとして "Like" が表示されるようになります。

3. Remote Config に値を追加

Firebase のダッシュボードからプロジェクトを指定して、Remote Config に値を設定します。プロジェクトを作成していない場合は新規で作成するか、GCP のプロジェクトをインポートしましょう。

Remote Config は Firebase ダッシュボードの左パネルから選択ができます。

f:id:laplus-knsn:20161204223816p:plain

"ADD PARAMETER" で値を追加します。

f:id:laplus-knsn:20161204223848p:plain

値が追加完了したら "PUBLISH CHANGES" を押して、値を配信します。

f:id:laplus-knsn:20161204223859p:plain

これで "reaction_button_text" の値に "Favorite" が設定され、配信されるようになります。

おわりに

軽めに Firebase Remote Config の解説をしましたが、次はもう少し振る舞いを変更させる記事を書こうかなと思います。