您可以使用 Firebase Remote Config 来定义应用中的参数并在云端更新它们的值。这样,您无需更新应用即可修改应用的外观和行为。
Remote Config 库用于存储应用内默认参数值,从 Remote Config 后端中提取更新后的参数值,以及控制提取的值何时可供应用使用。如需了解详情,请参阅 Remote Config 加载策略。
本指南逐步介绍了入门步骤并提供了一些示例代码,所有这些代码都可以从 firebase/quickstart-unity GitHub 代码库中克隆或下载。
第 1 步:将 Remote Config 添加到您的应用
您需要先完成以下步骤,然后才能使用 Remote Config:
注册 Unity 项目并将其配置为使用 Firebase。
如果您的 Unity 项目已在使用 Firebase,那么该项目已经注册并已配置为使用 Firebase。
如果您没有 Unity 项目,则可以下载示例应用。
将 Firebase Unity SDK(具体而言是
FirebaseRemoteConfig.unitypackage
)添加到您的 Unity 项目中。
请注意,为了将 Firebase 添加到 Unity 项目,需要在 Firebase 控制台中和打开的 Unity 项目中执行若干任务(例如,从控制台下载 Firebase 配置文件,然后将配置文件移到 Unity 项目中)。
第 2 步:设置应用内默认参数值
您可以在 Remote Config 对象中设置应用内默认参数值,以便应用在连接到 Remote Config 后端之前能够按预期运行,并且保证在后端中未设置任何值时可以使用默认值。
为实现上述目标,请创建一个新的字符串字典,并在其中填充一些键值对,以代表您要添加的默认参数值。如果您已配置 Remote Config 后端参数值,则可以下载包含这些键值对的文件,并使用该文件构建字符串字典。如需了解详情,请参阅下载 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
对象,其中包含将值转换为各种基本类型的属性。
第 4 步:设置参数值
- 在 Firebase 控制台中打开您的项目。
- 从菜单中选择 Remote Config 以查看 Remote Config 信息中心。
- 使用您在应用中指定的参数名称来定义参数。对于每个参数,您可以设置默认值(最终将替换应用内默认值)和条件值。如需了解详情,请参阅 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
确定完成是否也成功。如果成功,系统会使用 ActivateAsync()
激活 Remote Config 参数值。
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 及更高版本支持实时更新。
- 在您的应用中,添加
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 使用场景并查看一些关键的概念和高级策略文档(如果您尚未这样做),包括: