Android への Remote Config の統合に関する Codelab

1. はじめに

最終更新日: 2021 年 3 月 9 日

Firebase Remote Config とは

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

仕組み

Remote Config には、パラメータ値のフェッチやキャッシュといった重要なタスクを処理するクライアント ライブラリが含まれています。また、新しい値が有効になる(したがってアプリのユーザー エクスペリエンスに反映される)タイミングを制御できます。このため、変更のタイミングを制御することによって、アプリのエクスペリエンスを保護できます。

Remote Config クライアント ライブラリの get メソッドを介して、あらゆるパラメータ値にアクセスできます。アプリがサーバーサイドの値を取得するために使用するロジックは、アプリ内デフォルト値を取得する場合と同じであるため、大量のコードを記述することなく Remote Config の機能をアプリに追加できます。

アプリ内のデフォルト値をオーバーライドするには、Firebase コンソールまたは Remote Config バックエンド API を使用して、アプリで使用されているパラメータと同じ名前のパラメータを作成します。各パラメータにサーバーサイドのデフォルト値を設定してアプリ内のデフォルト値をオーバーライドできます。また、特定の条件を満たすアプリ インスタンスのアプリ内デフォルト値をオーバーライドする条件値を作成することもできます。この図は、Remote Config バックエンドとアプリ内でパラメータ値の優先順位がどのように決められるかを示しています。

61f12f33d2ac3133.png

学習内容

  • Firebase Remote Config の実装方法
  • Firebase Remote Config を使用してアプリを更新せずに値を変更する方法

必要なもの

  • Android Studio の最新バージョン
  • Firebase アカウント
  • (推奨、省略可)アプリを実行するための Android デバイス
  • Java または Kotlin の基礎知識

2. 設定方法

(省略可)サンプルコードをダウンロードする

この Codelab では独自のテストアプリを作成しますが、既存のサンプルアプリを確認して実行する場合は、クイックスタートのサンプルコードをダウンロードできます。

次のボタンをクリックして、この Codelab のすべてのコードをダウンロードします。

ダウンロードした zip ファイルを解凍すると、これにより、quickstart-android-master という名前のルートフォルダが展開されます。

または、コマンドラインから GitHub リポジトリのクローンを作成します。

$ git clone https://github.com/firebase/quickstart-android.git

リポジトリに複数のフォルダが含まれている。android_studio_folder.png config フォルダを使用します。

(省略可)サンプルコードをインポートする

Android Studio を起動し、ウェルカム画面で [Import project] を選択します。ダウンロードしたフォルダを開き、android_studio_folder.png config フォルダを選択します。[開く] をクリックします。

5f90353b0b519642.png

新しい Android プロジェクトを作成する

  1. Android Studio で新しいプロジェクトを開始する
  2. [Basic Activity] を選択
  3. [Configure Your Project] 画面で、次の操作を行います。
  4. プロジェクトに名前を付けます。パッケージ名と保存場所は自動的に生成されます。
  5. 言語: Java
  6. Minimum SDK 16

3. Android プロジェクトに Firebase と Firebase 向け Google アナリティクスを追加する

Firebase プロジェクトを作成する

Android アプリに Firebase を追加する前に、iOS アプリに接続するための Firebase プロジェクトを作成します。Firebase プロジェクトの詳細については、Firebase プロジェクトについて理解するをご覧ください。

  1. Firebase コンソールで [プロジェクトを追加] をクリックし、[プロジェクト名] を選択するか、新しいプロジェクト名を入力します。910158221fe46223.png

既存の Google Cloud Platform(GCP)プロジェクトがある場合は、プルダウン メニューからプロジェクトを選択して、そのプロジェクトに Firebase リソースを追加できます。

  1. (省略可)新しいプロジェクトを作成する場合は、プロジェクト ID を編集できます。

Firebase プロジェクトには一意の ID が自動的に割り当てられます。Firebase がプロジェクト ID を使用する仕組みについては、Firebase プロジェクトについて理解するをご覧ください。

  1. [続行] をクリックします。
  2. プロジェクトの Google アナリティクスを設定します。これにより、次の Firebase プロダクトを使用して最適なエクスペリエンスを実現できます。
  • Firebase Crashlytics
  • Firebase Predictions
  • Firebase Cloud Messaging
  • Firebase In-App Messaging
  • Firebase Remote Config
  • Firebase A/B Testing

アカウントの選択を求められたら、既存の Google アナリティクス アカウントを使用するか、新しいアカウントを作成します。新しいアカウントを作成する場合は、アナリティクス レポートのロケーションを選択し、プロジェクトのデータ共有設定と Google アナリティクスの規約に同意します。

1282a798556779ab.png

48ade68c8de27d2.png

  1. [プロジェクトを作成](既存の GCP プロジェクトを使用する場合は [Firebase を追加])をクリックします。

Firebase プロジェクトのリソースが自動的にプロビジョニングされます。処理が完了すると、Firebase コンソールに Firebase プロジェクトの概要ページが表示されます。

アプリを Firebase に登録する

Firebase プロジェクトを作成したら、プロジェクトに Android アプリを追加できます。

Firebase プロジェクトにアプリを追加する効果的な手法、考慮事項(複数のビルド バリアントの扱い方など)の詳細については、Firebase プロジェクトについて理解するをご覧ください。

  1. Firebase コンソールに移動します。
  2. [プロジェクトの概要] ページの上部にある Android アイコンをクリックして、設定ワークフローを起動します。すでに Firebase プロジェクトにアプリを追加している場合は、[アプリを追加] をクリックするとプラットフォームのオプションが表示されます。
  3. [Android パッケージ名] フィールドにアプリのパッケージ名を入力します。
  4. (省略可)アプリのニックネームを入力します。
  5. このプロジェクトでは SHA-1 は不要なので、SHA-1 フィールドは空白のままにします。
  6. [アプリの登録] をクリックします。

Firebase 構成ファイルを追加する

次に、アプリに必要な Firebase メタデータがすべて含まれた構成ファイルをダウンロードするよう求められます。[google-services.json をダウンロード] をクリックして、Firebase Android 構成ファイル(google-services.json)を取得します。

bc8ec7d3c9a28d75.png

a99b7415462dfc8b.png

プロジェクト レベルの Gradle ファイルbuild.gradle)に、Google サービスの Gradle プラグインを含めるためのルールを追加します。Google の Maven リポジトリがあることも確認してください。

プロジェクト レベルの build.gradle(<project>/build.gradle):

buildscript {

  repositories {
    // Check that you have the following line (if not, add it):
    google()  // Google's Maven repository
  }

  dependencies {
    // ...

    // Add the following line:
    classpath 'com.google.gms:google-services:4.3.5'  // Google Services plugin
  }
}

allprojects {
  // ...

  repositories {
    // Check that you have the following line (if not, add it):
    google()  // Google's Maven repository
    // ...
  }
}

モジュール(アプリレベル)の Gradle ファイル(通常は app/build.gradle)で、Google サービスの Gradle プラグインを適用します。

アプリレベルの build.gradle(<project>/<app-module>/build.gradle):

apply plugin: ‘com.android.application'

// 次の行を追加します。

apply plugin: ‘com.google.gms.google-services' // Google Services plugin

android {

// ...

}

Firebase SDK を Android アプリに追加する

Remote Config で、ユーザー プロパティとオーディエンスを対象としたアプリ インスタンスの条件付きターゲティングを行うには、Google アナリティクスが必要です。プロジェクトで Google アナリティクスを有効にしてください。

(これは、サンプル クイックスタート コードですでに行われています)。

Firebase Android BoM を使用して、モジュール(アプリレベル)の Gradle ファイル(通常は app/build.gradle)で Remote Config Android ライブラリの依存関係を宣言します。Firebase Android BoM を使用することで、アプリでは常に互換性のあるバージョンの Firebase Android ライブラリが使用されます。

また、Google アナリティクスの設定の一環として、Google アナリティクス用の Firebase SDK をアプリに追加する必要もあります。依存関係で、次のコードを追加します。

app/build.gradle

dependencies {
    // Import the BoM for the Firebase platform
    implementation platform('com.google.firebase:firebase-bom:26.6.0')

    // Declare the dependencies for the Remote Config and Analytics libraries
    // When using the BoM, you don't specify versions in Firebase library dependencies
    implementation 'com.google.firebase:firebase-config'
    implementation 'com.google.firebase:firebase-analytics'
}

プロジェクトを Gradle ファイルと同期する

すべての依存関係がアプリで使用可能であることを確認するには、[File] > [Sync Project with Gradle Files] を選択して、プロジェクトを Gradle ファイルと同期します。

4. Remote Config の主なコンポーネントを確認する

次に、アプリで Remote Config を使用する手順を確認します。これらの手順は、クイックスタート Codelab のコードですでに完了しています。クイックスタート Codelab のコードを確認しながら、このセクションを使用して、何が起こっているのかを把握してください。

1. Remote Config シングルトン オブジェクトを取得する

Remote Config オブジェクトのインスタンスを取得し、最小フェッチ間隔を設定して更新の頻度を増やせるようにします。

MainActivity.java

mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder()
        .setMinimumFetchIntervalInSeconds(3600)
        .build();
mFirebaseRemoteConfig.setConfigSettingsAsync(configSettings);

このシングルトン オブジェクトは、アプリ内デフォルト パラメータ値の保存、更新されたパラメータ値のバックエンドからのフェッチ、フェッチされた値がアプリで使用できるようになるタイミングの制御に使用されます。

開発時には、比較的短い最小フェッチ間隔を設定することをおすすめします。詳細については、スロットル処理をご覧ください。

2. アプリ内デフォルト パラメータ値を設定する

アプリ内デフォルト パラメータ値を Remote Config オブジェクトに設定すると、Remote Config バックエンドに接続する前にアプリを意図したとおりに動作させることができます。また、バックエンド側に値が設定されていない場合は、これらのデフォルト値を使用できます。

Map オブジェクト、またはアプリの res/xml フォルダに格納されている XML リソース ファイルを使用して、一連のパラメータ名とデフォルト パラメータ値を定義できます。Remote Config クイックスタート サンプルアプリでは、XML ファイルを使用してデフォルトのパラメータ名や値を定義しています。独自の XML ファイルを作成する方法は次のとおりです。

  1. res フォルダの下に xml フォルダを作成します。

4b8a2a637a626e94.png

  1. 新しく作成した xml フォルダを右クリックして、ファイルを作成します。

358b4ba740120ece.png

  1. デフォルト値を設定します。次のセクションでは、Remote Config クイックスタート XML ファイルのデフォルト値を変更してみます。
  2. 次のように setDefaultsAsync(int) を使用して、これらの値を Remote Config オブジェクトに追加します。

MainActivity.java

mFirebaseRemoteConfig.setDefaultsAsync(R.xml.remote_config_defaults);

3. アプリ内で使うパラメータ値を取得する

ここまでの手順で、パラメータ値を Remote Config オブジェクトから取得できるようになりました。バックエンドに値を設定し、フェッチして有効化すると、それらの値をアプリで使用できるようになります。または、setDefaultsAsync(int) を使用して、構成したアプリ内パラメータ値を取得します。これらの値を取得するには、アプリによって予期されるデータ型に対応した以下のメソッドを呼び出します。このとき、引数としてパラメータキーを指定します。

4. 値をフェッチして有効にする

  1. Remote Config バックエンドからパラメータ値をフェッチするには、fetch() メソッドを呼び出します。バックエンドに設定したすべての値がフェッチされ、Remote Config オブジェクトに保存されます。
  2. フェッチしたパラメータ値をアプリで利用できるようにするには、activate() メソッドを呼び出します。1 回の呼び出しで値をフェッチして有効化する場合は、fetchAndActivate() リクエストを使用して Remote Config バックエンドから値をフェッチし、それらをアプリで利用できるようにします。

MainActivity.java

mFirebaseRemoteConfig.fetchAndActivate()
        .addOnCompleteListener(this, new OnCompleteListener<Boolean>() {
            @Override
            public void onComplete(@NonNull Task<Boolean> task) {
                if (task.isSuccessful()) {
                    boolean updated = task.getResult();
                    Log.d(TAG, "Config params updated: " + updated);
                    Toast.makeText(MainActivity.this, "Fetch and activate succeeded",
                            Toast.LENGTH_SHORT).show();

                } else {
                    Toast.makeText(MainActivity.this, "Fetch failed",
                            Toast.LENGTH_SHORT).show();
                }
                displayWelcomeMessage();
            }
        });

これらの更新されたパラメータ値はアプリの動作と外観に影響するので、スムーズなユーザー エクスペリエンスを邪魔しないタイミング(次にユーザーがアプリを開いたときなど)でフェッチ済みの値を有効化する必要があります。詳細と例については、Remote Config の読み込み方法をご覧ください。

スロットリング

アプリが短期間に何度もフェッチすると、フェッチ呼び出しがスロットリングされ、SDK から FirebaseRemoteConfigFetchThrottledException が返されます。バージョン 17.0.0 よりも前の SDK では、フェッチ リクエストは 60 分間に 5 回までと制限されていました(新しいバージョンでは制限が緩和されています)。

アプリの開発では、構成ファイルを頻繁にフェッチして(1 時間に何度も)有効にし、アプリの開発とテストを迅速にイテレーションすることをおすすめします。最大 10 人の開発者がいるプロジェクトで迅速なイテレーションに対応するには、アプリで最小フェッチ間隔(setMinimumFetchIntervalInSeconds)が小さい FirebaseRemoteConfigSettings オブジェクトを一時的に設定します。

Remote Config のデフォルトの最小フェッチ間隔は 12 時間です。つまり、実際にフェッチ呼び出しが行われた回数に関係なく、12 時間のウィンドウ内で構成ファイルがバックエンドから複数回フェッチされることはありません。具体的には、次の順で最小フェッチ間隔が決定されます。

  1. fetch(long) のパラメータ
  2. FirebaseRemoteConfigSettings.setMinimumFetchIntervalInSeconds(long) のパラメータ
  3. デフォルト値(12 時間)

最小フェッチ間隔のカスタム値を設定するには、FirebaseRemoteConfigSettings.Builder.setMinimumFetchIntervalInSeconds(long) を使用します。

5. Remote Config を使用してアプリの動作を変更する

アプリ内デフォルト パラメータを変更する

res/xml/remote_config_defaults.xml を開き、デフォルト値を別の値に変更します。

res/xml/remote_config_defaults.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- START xml_defaults -->
<defaultsMap>
    <entry>
        <key>loading_phrase</key>
        <value>Fetching config...</value>
    </entry>
    <entry>
        <key>welcome_message_caps</key>
        <value>false</value>
    </entry>
    <entry>
        <key>welcome_message</key>
        <value>Welcome to my awesome app!</value>
    </entry>
</defaultsMap>
    <!-- END xml_defaults -->

アプリ内デフォルト値の変更を確認する

  1. エミュレータまたはテストデバイスを使用してプロジェクトを実行し、動作を確認します。
  2. Java 版または Kotlin 版の [開く] をクリックします。

c1582b989c25ced.png

  1. メインビューのウェルカム メッセージを確認します。

4c838bf5a629d5b8.png

Remote Config バックエンドでパラメータ値を設定する

次に、Remote Config を介して値を送信するテストを行います。Firebase コンソールまたは Remote Config バックエンド API を使用して、サーバーサイドの新しいデフォルト値を作成できます。このデフォルト値は、目的の条件付きロジックまたはユーザー ターゲティングに従って、アプリ内の値をオーバーライドします。このセクションでは、Firebase コンソールでこれらの値を作成するための手順を説明します。

  1. Firebase コンソールを開き、プロジェクトを開きます。
  2. [エンゲージ] セクションの左側のサイドメニューから [Remote Config] を選択して、Remote Config ダッシュボードを表示します。
  3. [パラメータを追加] で Parameter key. を入力します。Default value に任意のテキストを追加します。[パラメータを追加] をクリックします。この Codelab では、res/xml/remote_config_defaults.xml ファイルのパラメータキーを使用します。詳しくは、以下の表をご覧ください。

パラメータ キー

デフォルト値(remote_config_defaults.xml

説明

loading_phrase

構成を取得しています...

文字列。Remote Config の値を取得するときに表示されます。

welcome_message_caps

false

ブール値。true の場合、welcome_message をすべて大文字に変更します。

welcome_message

素晴らしいアプリへようこそ!

文字列。ウェルカム メッセージ

スクリーンショットの例:

28fa48f18da43002.png

  1. パラメータの追加が完了したら、[変更を公開] をクリックします。
  2. エミュレータまたはデバイスでアプリを再度実行し、今回は [Fetch Remote Welcome] ボタンをクリックします。

cfe900477549adb7.png

  1. Remote Config のパラメータと値に基づいて、ウェルカム メッセージが更新されます。

6. 完了

お疲れさまでした。Remote Config を使用してウェルカム メッセージを変更できました。Remote Config を使用してアプリを変更、カスタマイズする方法は他にもたくさんあります。以下の追加リソースもご覧ください。