Firebase 远程配置 - 初始提取 return 个本地默认值

Firebase Remote Config - Initial fetch return local default values

我正在使用 Firebase Remote Config 获取远程数据,我的应用程序需要第一次启动时的最新数据。

我正在我的应用程序中进行提取和更新 onCreate():

mFirebaseRemoteConfig.fetch(cacheExpiration)
    .addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            if (task.isSuccessful()) {
                mFirebaseRemoteConfig.activateFetched();
            }
        }
    });

并读取值:

myValue = mFirebaseRemoteConfig.getBoolean(Constants.FIREBASE_REMOTE_MY_VALUE);
  1. 第一次提取工作正常(activateFetched() 成功触发),但它 returns remote_config_defaults 值而不是发布的远程配置。
  2. 第二次获取,甚至几秒后,returns 远程值。
  3. 之后,下面的抓取都受制于 cacheExpiration 规则(完全可以)。

知道为什么在第一次调用时没有获取我的远程值吗?

Firebase 远程配置的回调就是这样设计的,它将首先 return 缓存的值。如果没有从服务器保存的缓存值,它将 return 默认值中定义的值并触发远程获取。下一次 return 它将 return 从服务器获取的值,如果它设法保存它们的话。

Firebase Remote Config 决定值的方式可以描述如下:

首先,它检查是否有从服务器存储的缓存值,如果有,它会使用该值并在第一次调用时 return 该值。

如果没有缓存值,它会查找以编程方式或在默认文件中定义的默认值。 (当您调用 setDefaults() 时)

如果没有从服务器缓存的值,并且默认值中也没有值,它将使用该类型的系统默认值。

可以在此处找到更多信息:https://firebase.google.com/docs/remote-config/

听起来您忽略了获取远程参数的异步性质。 onComplete() 回调在向 Firebase 服务器发送请求并收到回复后触发。这将花费几分之一秒,甚至更多。

如果你的语句要使用获取的值:

myValue = mFirebaseRemoteConfig.getBoolean(Constants.FIREBASE_REMOTE_MY_VALUE);

跟随调用fetch()并且不在onComplete()回调中,它将在接收到配置数据之前执行。第二次调用似乎只是工作,因为第一次调用已经过了足够的时间来完成并且它获取和激活的数据存在。

从 Android 设备获取 RemoteConfig 时我 运行 遇到的一个问题是我们最初使用的方法

fetch()

这给了我们同样的问题,即初始值始终与默认值相同。将其更改为

fetchAndActivate()

为我们解决了这个问题。我认为不同之处在于 Firebase 允许您获取数据但不是立即 'activate' 它,如果您想根据默认值立即采取一些行动,然后激活远程值,然后激活任何逻辑,这可能会有所帮助在那之后将基于远程值。

希望这对某人有所帮助:)

就像@Bob Snyder 指出的那样,这是因为 firebase 的异步特性。

所以使用 onCompleteListener 来解决这个问题:

firebaseRemoteConfig.activate().addOnCompleteListener {
    //logic to check the remote value
}