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. 基本アクティビティを選択する
  3. [Configure Your Project] セクションscreen:
  4. プロジェクトに名前を付けます。パッケージ名と [Save location] は自動的に生成されます。
  5. 言語: Java
  6. 最小 SDK 16

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

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

Firebase を Android アプリに追加する前に、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 プラグイン: 「com.google.gms.google-services」// Google サービス プラグイン

android {

// ...

}

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

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

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

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

また、アナリティクスの設定の一環として、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] >プロジェクトと 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 人のデベロッパーがいるプロジェクトで迅速なイテレーションに対応するには、アプリで FirebaseRemoteConfigSettings オブジェクトの最小フェッチ間隔(setMinimumFetchIntervalInSeconds)の値を小さく設定します。

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. [Engage] セクションの左側のメニューから [Remote Config] を選択して、Remote Config ダッシュボードを表示します。
  3. [パラメータを追加] で「Parameter key.」と入力します。Default value の下に任意のテキストを追加します。[パラメータを追加]をクリックしますこの Codelab では、res/xml/remote_config_defaults.xml ファイルのパラメータキーを使用します。詳しくは、以下の表をご覧ください。

パラメータキー

デフォルト値(remote_config_defaults.xml

説明

loading_phrase

設定を取得しています...

String;Remote Config の値をフェッチするときに表示されます。

welcome_message_caps

false

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

welcome_message

マイアプリへようこそ!

String;ウェルカム メッセージ

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

28fa48f18da43002.png

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

cfe900477549adb7.png

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

6. 完了

これで、Remote Config を使用してウェルカム メッセージを変更できました。Remote Config を利用してアプリを変更、カスタマイズする方法は他にも多数あります。以下の参考情報をご覧ください。