techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

Firebase Remote Configを使ってみる

Firebase Reote Configとは

アプリのアップデートを公開しなくても、アプリの動作と外観を変更することができます。

Firebase Remote Config は、アプリのアップデートをユーザーにダウンロードしてもらわなくても、アプリの動作と外観を変更できるクラウド サービスです。Remote Config を使用する場合は、アプリの動作や外観を制御するアプリ内デフォルト値を作成します。後から Firebase コンソールを使用して、すべてのアプリユーザーまたはユーザー層のセグメントに対してアプリ内デフォルト値をオーバーライドすることができます。アップデートを適用するタイミングはアプリ側で制御できます。アプリはアップデートの有無を頻繁にチェックし、パフォーマンスにほとんど影響をおよぼすことなくアップデートを適用することができます。

セットアップ

FirebaseSDKの導入はCloudMessagingのときに書いたので省略します。

blog.techium.jp

build.gradleに以下を追加します。

    implementation 'com.google.firebase:firebase-config:11.6.0'

FirebaseRemoteConfigのインスタンスを取得する

    mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
    //  開発時のAPIの制限を解除するために、開発者モードを有効にする
    FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder()
            .setDeveloperModeEnabled(BuildConfig.DEBUG)
            .build();
    mFirebaseRemoteConfig.setConfigSettings(configSettings);

ここで注意が必要なのは、FirebaseRemoteConfig.getInstance()はFirebaseAppの初期化以降でないとコールできないということです。
これ以前にFirebaseApp#initializeAppメソッドをコールしておきましょう。
そうしないと、FirebaseRemoteConfig#getInstanceコール時にIllegalStateExceptionが発生します。

デフォルト値を設定する

デフォルト値はXML、または、Mapオブジェクトにてセットします。
ここでは、XMLを使います。 remote_config_textというパラメータキーにデフォルト値という文字列を紐付けています。

<?xml version="1.0" encoding="utf-8"?>
<defaultsMap>
    <entry>
        <key>remote_config_text</key>
        <value>デフォルト値</value>
    </entry>
</defaultsMap>

これを、FirebaseRemoteConfig#setDefaultsを使用してセットします。

mFirebaseRemoteConfig.setDefaults(R.xml.remote_config_defaults);

値を取得する

上記までの手順で値を取得できるようになりました。 セットしたデフォルト値を取得してみます。
パラメータキーを引数にして文字列を取得します。

String text = mFirebaseRemoteConfig.getString(KEY_REMOTE_CONFIG_TEXT);

文字列以外にも以下のメソッドでそれぞれの型の値を取得可能です。

  • getBoolean()
  • getByteArray()
  • getDouble()
  • getLong()

RemoteConfigに値を設定する

  1. Firebase コンソールでプロジェクトを開きます。 https://console.firebase.google.com/u/2/
  2. メニューから [Remote Config] を選択して Remote Config ダッシュボードを表示します。
  3. アプリで定義したパラメータキー(ここでは、remote_config_text)と同じ名前のパラメータを定義し、値をセットします。
    ここでは、「RemoteConfigからの値」とします。 f:id:forestsoftjpdev:20171126001119p:plain:w400

RemoteConfigの値を取得する

RemoteConfigの値を取得するにはFirebaseRemoteConfig#fetchメソッドを使用します。 fetchすることにより、RemoteConfigに設定した値がキャッシュされます。 fetch済みのパラメータをアプリで使用可能にするには、activateFetched() メソッドを呼び出す必 要があります。

        mFirebaseRemoteConfig.fetch(cacheExpiration)
                .addOnCompleteListener(this, new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if (task.isSuccessful()) {
                            Toast.makeText(MainActivity.this, "Fetch Succeeded",
                                    Toast.LENGTH_SHORT).show();

                            mFirebaseRemoteConfig.activateFetched();
                        } else {
                            Toast.makeText(MainActivity.this, "Fetch Failed",
                                    Toast.LENGTH_SHORT).show();
                        }
                        
                    }
                });

これで設定した値が取得できます。

fetchの引数にはキャッシュの有効期限を渡す必要があります。 最初にfetchしたときに渡した有効期限の時間が過ぎるまでアプリはキャッシュした値を使い続けます。 RemoteConfigにセットした値を即座にアプリに反映したい場合は、有効期限を短くする必要がありますがAPIの制限もあるので詳しくは以下を確認してください。

FAQ  |  Firebase

まとめ

RemoteConfigの値はフェッチしてアクティベートするまでアプリで使用できない
フェッチした値には有効期限があり、それがすぎるまでは新たに取得できない

参考

Firebase Remote Config  |  Firebase

Use Firebase Remote Config on Android  |  Firebase

github.com