Firebase Remote Config を使ってみる


Firebase Remote Config を使用すると、アプリでパラメータを定義し、それらの値をクラウドで更新できます。これにより、アプリのアップデートを配布しなくてもアプリの外観や動作を変更できます。

Remote Config ライブラリは、アプリ内のデフォルトのパラメータ値の保存、Remote Config バックエンドからの更新されたパラメータ値のフェッチ、フェッチされた値がアプリで使用できるようになるタイミングの制御に使用されます。詳細については、Remote Config の読み込み方法をご覧ください。

このガイドでは、作業を開始するための手順について説明し、サンプルコードを示します(すべてのサンプルコードは firebase/quickstart-unity GitHub リポジトリからクローンを作成またはダウンロードできます)。

ステップ 1: アプリに Remote Config を追加する

Remote Config を使用するには、次の作業が必要です。

  • Firebase を使用するように Unity プロジェクトを登録して構成する。

    • Unity プロジェクトですでに Firebase を使用している場合、この登録と構成はすでに行われています。

    • Unity プロジェクトがない場合は、サンプルアプリをダウンロードできます。

  • Unity プロジェクトに Firebase Unity SDK(具体的には FirebaseRemoteConfig.unitypackage)を追加する。

Firebase を Unity プロジェクトに追加するには、Firebase コンソールと開いている Unity プロジェクトの両方でタスクを行う必要があります(コンソールから Firebase 構成ファイルをダウンロードし、それを Unity プロジェクトに移動するなど)。

ステップ 2: アプリ内のデフォルト パラメータ値を設定する

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

これを行うには、文字列辞書を作成し、追加するデフォルトを表す Key-Value ペアを入力します。Remote Config バックエンド パラメータ値をすでに構成している場合は、これらの Key-Value ペアを含むファイルをダウンロードし、これを使用して文字列辞書を作成できます。詳細については、Remote Config テンプレートのデフォルトをダウンロードするをご覧ください。

SetDefaultsAsync() を呼び出すと、文字列以外のプロパティはそのプロパティの型に変換されます)。

System.Collections.Generic.Dictionary<string, object> defaults =
  new System.Collections.Generic.Dictionary<string, object>();

// These are the values that are used if we haven't fetched data from the
// server
// yet, or if we ask for values that the server doesn't have:
defaults.Add("config_test_string", "default local string");
defaults.Add("config_test_int", 1);
defaults.Add("config_test_float", 1.0);
defaults.Add("config_test_bool", false);

Firebase.RemoteConfig.FirebaseRemoteConfig.DefaultInstance.SetDefaultsAsync(defaults)
  .ContinueWithOnMainThread(task => {

ステップ 3: アプリ内で使用するパラメータ値を取得する

ここまでの手順で、パラメータ値を Remote Config オブジェクトから取得できるようになりました。Remote Config バックエンドに値を設定し、フェッチして有効化すると、それらの値をアプリで使用できるようになります。または、SetDefaultsAsync() を使用して、構成したアプリ内パラメータ値を取得します。

アプリ内パラメータ値を取得するには、GetValue() を呼び出します。このとき、引数としてパラメータキーを指定します。これは、ConfigValue を返します。ConfigValue には、値をさまざまな基本タイプに変換するプロパティがあります。

ステップ 4: パラメータ値を設定する

  1. Firebase コンソールでプロジェクトを開きます。
  2. メニューから [Remote Config] を選択して、Remote Config ダッシュボードを表示します。
  3. アプリで定義したパラメータと同じ名前のパラメータを定義します。それぞれのパラメータに、デフォルト値(最終的にはアプリ内デフォルト値をオーバーライドします)や条件値を設定できます。詳細については、Remote Config のパラメータと条件をご覧ください。

ステップ 5: 値をフェッチして有効にする(必要な場合)

Remote Config バックエンドからパラメータ値をフェッチするには、FetchAsync() メソッドを呼び出します。バックエンドに設定したすべての値がフェッチされ、Remote Config オブジェクトにキャッシュ保存されます。

// Start a fetch request.
// FetchAsync only fetches new data if the current data is older than the provided
// timespan.  Otherwise it assumes the data is "recent enough", and does nothing.
// By default the timespan is 12 hours, and for production apps, this is a good
// number. For this example though, it's set to a timespan of zero, so that
// changes in the console will always show up immediately.
public Task FetchDataAsync() {
  DebugLog("Fetching data...");
  System.Threading.Tasks.Task fetchTask =
  Firebase.RemoteConfig.FirebaseRemoteConfig.DefaultInstance.FetchAsync(
      TimeSpan.Zero);
  return fetchTask.ContinueWithOnMainThread(FetchComplete);
}

上述のコードでは、FetchComplete は、ContinueWithOnMainThread()オーバーロードのいずれかのパラメータと一致する署名を持つメソッドです。

以下のサンプルコードでは、FetchComplete メソッドに前のタスク(fetchTask)が渡され、これにより FetchComplete はタスクが完了したかどうかを判断できます。このコードで Info.LastFetchStatus を使用して、終了が正常であったかどうかの判断も行います。正常に終了した場合、Remote Config のパラメータ値は ActivateAsync() を使用して有効になります。

private void FetchComplete(Task fetchTask) {
  if (!fetchTask.IsCompleted) {
    Debug.LogError("Retrieval hasn't finished.");
    return;
  }

  var remoteConfig = FirebaseRemoteConfig.DefaultInstance;
  var info = remoteConfig.Info;
  if(info.LastFetchStatus != LastFetchStatus.Success) {
    Debug.LogError($"{nameof(FetchComplete)} was unsuccessful\n{nameof(info.LastFetchStatus)}: {info.LastFetchStatus}");
    return;
  }

  // Fetch successful. Parameter values must be activated to use.
  remoteConfig.ActivateAsync()
    .ContinueWithOnMainThread(
      task => {
        Debug.Log($"Remote data loaded and ready for use. Last fetch time {info.FetchTime}.");
    });
}

FetchAsync() を使用してフェッチされた値は、フェッチが完了するとローカルにキャッシュ保存されますが、ActivateAsync() が呼び出されるまでは使用できません。これにより、計算途中の場合や、問題や異常な動作を引き起こす可能性のある場合は、新しい値が適用されないようにできます。

ステップ 6: リアルタイムで更新をリッスンする

パラメータ値をフェッチしたら、リアルタイム Remote Config を使用して、Remote Config バックエンドからの更新をリッスンできます。更新が利用可能になると、リアルタイム Remote Config によって接続済みデバイスに通知され、新しいバージョンの Remote Config を公開すると変更が自動的にフェッチされます。

リアルタイム更新は、Android および Apple プラットフォーム用の Firebase Unity SDK v11.0.0 以降でサポートされています。

  1. アプリで OnConfigUpdateListener を追加して更新のリッスンを開始し、新しいパラメータ値を自動的にフェッチします。次に、ConfigUpdateListenerEventHandler を作成して更新イベントを処理します。次の例では、更新をリッスンし、新しく取得した値を使用して、更新されたウェルカム メッセージを表示します。
// Invoke the listener.
void Start()
{
  Firebase.RemoteConfig.FirebaseRemoteConfig.DefaultInstance.OnConfigUpdateListener
    += ConfigUpdateListenerEventHandler;
}

// Handle real-time Remote Config events.
void ConfigUpdateListenerEventHandler(
   object sender, Firebase.RemoteConfig.ConfigUpdateEventArgs args) {
  if (args.Error != Firebase.RemoteConfig.RemoteConfigError.None) {
    Debug.Log(String.Format("Error occurred while listening: {0}", args.Error));
    return;
  }

  Debug.Log("Updated keys: " + string.Join(", ", args.UpdatedKeys));
  // Activate all fetched values and then display a welcome message.
  remoteConfig.ActivateAsync().ContinueWithOnMainThread(
    task => {
        DisplayWelcomeMessage();
    });
}

// Stop the listener.
void OnDestroy() {
    Firebase.RemoteConfig.FirebaseRemoteConfig.DefaultInstance.OnConfigUpdateListener
      -= ConfigUpdateListenerEventHandler;
}

新しいバージョンの Remote Config を次回公開すると、アプリを実行して変更をリッスンしているデバイスが完了ハンドラを呼び出します。

次のステップ

Remote Configユースケースに関する詳細な情報が必要な方は、主要なコンセプトと高度な戦略に関する以下のドキュメントをご覧ください。