【Unity】【Firebase】【リアルタイム Remote Config】アプリの強制アップデート

Unity で Firebase の 「**リアルタイム Remote Config**」 を使用するサンプルです。

↓ 今回作成したサンプルがこちら

<iframe width="560" height="315" src="https://www.youtube.com/embed/Ri6ZSlMEAqQ?si=GBUWs6E0Tozg9pt3" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

Firebaseコンソール で RemoteConfig の値を変更した瞬間に、
アプリ側でその値の変更を検知して、特定の処理を実行することができます。

↓ 今回サンプルで作成したコードは下記です
```RemoteConfigSample.cs
using System.Threading.Tasks;
using UnityEngine;
using Firebase.Extensions;
using Firebase.RemoteConfig;
using System;
using System.Linq;

public class RemoteConfigSample : MonoBehaviour {
	// アップデートが必要な時に表示するUI
	[SerializeField] GameObject _uiUpdate;

	// RemoteConfigで取得する値のキー
	private const string KEY = "app_version";


	/// <summary>
	/// アプリ起動時の初期化処理
	/// </summary>
	async void Start () {
		// アプリ起動時にアプリバージョンを取得
		string version = await Fetch(KEY);

		// アプリバージョンチェック
		CheckAppVersion(int.Parse(version));

		// RemoteConfig更新のリッスンを開始
		FirebaseRemoteConfig.DefaultInstance.OnConfigUpdateListener += ConfigUpdateListenerEventHandler;
	}

	/// <summary>
	/// RemoteConfig更新時
	/// </summary>
	private void ConfigUpdateListenerEventHandler(object sender, ConfigUpdateEventArgs args) {
		if (args.Error != RemoteConfigError.None) {
			Debug.LogError($"[ConfigUpdateListenerEventHandler] Error occurred while listening: {args.Error}");
			return;
		}

		FirebaseRemoteConfig.DefaultInstance.ActivateAsync().ContinueWithOnMainThread(
			task => {
				if (args.UpdatedKeys.Contains(KEY)) {
					// アプリバージョンチェック
					string version = FirebaseRemoteConfig.DefaultInstance.GetValue(KEY).StringValue;
					CheckAppVersion(int.Parse(version));
				}
			});
	}

	/// <summary>
	/// 指定キーのデータ取得
	/// </summary>
	public async Task<string> Fetch(string key) {
		string value = "";

		var tcs = new TaskCompletionSource<bool>();
		await FirebaseRemoteConfig.DefaultInstance.FetchAsync(TimeSpan.Zero).ContinueWithOnMainThread(task => {
			FirebaseRemoteConfig.DefaultInstance.ActivateAsync().ContinueWithOnMainThread(activateTask => {
				value = FirebaseRemoteConfig.DefaultInstance.GetValue(key).StringValue;
				tcs.SetResult(true);
			});
		});
		await tcs.Task;

		return value;
	}

	/// <summary>
	/// アプリバージョンチェック
	/// </summary>
	private void CheckAppVersion(int appVersion) {
		if (int.Parse(Application.version) < appVersion) {
			// アプリバージョンが上がっていた場合は更新を促す
			_uiUpdate.SetActive(true);
		}
	}

	/// <summary>
	/// 破棄時
	/// </summary>
	void OnDestroy() {
		// RemoteConfig更新のリッスンを停止
		FirebaseRemoteConfig.DefaultInstance.OnConfigUpdateListener -= ConfigUpdateListenerEventHandler;
	}
}
```

## 補足
:::note alert
* FetchAsync のほうはUnityEditorでも値は取得できるのですが、OnConfigUpdateListener で登録したメソッドは実機でしか動作しません！
:::

↑ 今回の記事はこれだけ言いたかった（ここで嵌った...）

* その他、基本的には <a href="https://firebase.google.com/docs/remote-config/get-started?platform=unity&_gl=1*f4421s*_up*MQ..*_ga*MjA1NjIzODQ4LjE3MjE3MTcxMTM.*_ga_CW55HF8NVT*MTcyMTcxNzExMy4xLjAuMTcyMTcxNzExMy4wLjAuMA..&hl=ja#add-real-time-listener">Firebase公式のガイド</a> に従えば問題なさそうです
* Firebase Unity SDK v11.0.0 以降でサポートされています
* <a href="https://console.developers.google.com/apis/api/firebaseremoteconfigrealtime.googleapis.com/overview?hl=ja">Google Cloud コンソール</a> で「Firebase Remote Config Realtime API」を有効にする必要があります