[英]Firebase Remote Config: Can't read any values, but fetch is successful
我正在尝试使用 Firebase 的新远程配置功能来获得远程配置参数,但我遇到了问题。
我正在我的应用程序的onCreate()
中进行获取和更新:
final FirebaseRemoteConfig remoteConfig = FirebaseRemoteConfig.getInstance();
remoteConfig.fetch().addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
remoteConfig.activateFetched();
}
}
});
这就是我的阅读方式:
FirebaseRemoteConfig remoteConfig = FirebaseRemoteConfig.getInstance();
String value = remoteConfig.getString("active_subscriptions");
值返回 null。
如果我调用remoteConfig.getInfo().getLastFetchStatus()
,它会返回LAST_FETCH_STATUS_SUCCESS
,所以似乎获取成功。
知道为什么我的值为空白吗?
找到解决方法! 见下文
我遇到了“无声完成”的事情——我称之为“获取”,但 onComplete、onSuccess 或 onFailure 侦听器永远不会触发。 我尝试将它移动到 onCreate 活动,但仍然没有发生任何事情,因此,配置项永远不会从服务器加载。 我启用了开发人员模式,并且正在调用缓存值为 0 的 fetch。
我能够(一次)在“public void onComplete(@NonNull Task task){”行上放置一个断点,该断点被击中,然后我能够通过并触发onComplete。 然后我无法以任何其他方式重现同样的结果,包括第二次做同样的事情(我认为)。
看起来像是时间或并发问题,但鉴于这是一个异步调用,这没什么意义。
解决方法
如果您从 Activity#onResume(或者,我认为是 Activity#onStart)中获取,它可以完美运行。 从 Activity#onCreate 或 Application#onCreate 调用 fetch 会导致一个看似永远不会被处理的调用,实际上,在 fetch 开始后,应用程序的性能明显下降,所以我认为有一个循环程序正在运行。*
解决方法 #2
如果你真的希望它从 Application#onCreate 运行(我这样做),这似乎也有效:
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// Run mFirebaseRemoteConfig.fetch(timeout) here, and it works
}
}, 0);
您可能会在远程配置中使用 缓存。 它的工作方式是 Config 将在本地缓存传入的项目,并返回它们。 所以你最后一次(缓存的)获取状态可能是在定义值之前,我们得到一个缓存的空白值。
您可以控制缓存过期时间,但如果您频繁获取,则可能会受到限制。
因为这是一个常见的开发问题,所以有一种开发人员模式可以让您更快地请求(对于小用户群):
FirebaseRemoteConfigSettings configSettings =
new FirebaseRemoteConfigSettings.Builder()
.setDeveloperModeEnabled(BuildConfig.DEBUG)
.build();
FirebaseRemoteConfig.getInstance().setConfigSettings(configSettings);
当您调用fetch
您可以传递一个很短的缓存过期时间
long cacheExpiration = 3600;
FirebaseRemoteConfig mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
if (mFirebaseRemoteConfig.getInfo().getConfigSettings().isDeveloperModeEnabled()) {
cacheExpiration = 0;
}
mFirebaseRemoteConfig.fetch(cacheExpiration)
.addOnCompleteListener(new OnCompleteListener<Void>() {
// ...
});
如果您想要完整的参考,这就是它在快速入门示例中的完成方式。
发现问题了。
添加一些日志记录后,我发现从未调用过获取作业的onComplete()
。 我将提取从我的应用程序的onCreate
到片段的,现在它可以正常工作了!
( Ian Barber ,这可能需要调查或澄清,因为日志表明 Firebase 在应用程序中初始化时没有问题,并且获取是无声的失败。)
我也遇到了这个问题。 原来我没有在 Firebase 控制台中看到“发布”按钮。 :脸掌:
我遇到了同样的问题,在我的情况下没有任何解决方法有帮助。 问题出在测试设备上。 我在没有安装 Google 移动服务的情况下使用了模拟器,因此未触发 Complete 事件。 我用 GMS 尝试了我的手机,一切都很好。 祝你好运。
在这种情况下,第一件事是检查您是否有正确的 firebase 配置并且您已连接到 firebase 。如果您有 android studio 2.2,请转到 Tools->Firebase->RemoteConfig - 连接到 Firebase,看看您是否收到一条通知说已连接。连接后,在您的代码中执行以下操作: mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
/** NOTE: At this point, your app can use in-app default parameter values.To use in-app
* default values,skip the next section. You can deploy your app without setting
* parameter values on the server,and then later set values on the server to
* override the default behavior and appearance of your app.
*/
mFirebaseRemoteConfig.setDefaults(R.xml.remote_config_defaults);
FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder()
.setDeveloperModeEnabled(true)
.build();
mFirebaseRemoteConfig.setConfigSettings(configSettings);
然后为了获取配置执行以下 long cacheExpiration = 2000; // 可以增加这个通常 12hrs 是推荐的
/** If in developer mode cacheExpiration is set to 0 so each fetch will retrieve values from
* the server.*/
if (mFirebaseRemoteConfig.getInfo().getConfigSettings().isDeveloperModeEnabled()) {
cacheExpiration = 0;
}
/** cacheExpirationSeconds is set to cacheExpiration here, indicating that any previously
* fetched and cached config would be considered expired because it would have been fetched
* more than cacheExpiration seconds ago. Thus the next fetch would go to the server unless
* throttling is in progress. The default expiration duration is 43200 (12 hours).
*/
mFirebaseRemoteConfig.fetch(cacheExpiration)//TODO Bring this from a config file
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Log.d(TAG, "Firebase Remote config Fetch Succeeded");
// Once the config is successfully fetched it must be activated before newly fetched
// values are returned.
mFirebaseRemoteConfig.activateFetched();
} else {
Log.d(TAG, "Firebase Remote config Fetch failed");
}
showRemoteConfig();
}
});
运行您的应用程序并检查日志“Firebase Remote config Fetch Succeeded”。 如果您看到相同的内容,则您的远程配置已加载并激活。
我使用了类似的代码,如@Ian Barber(复制):
FirebaseRemoteConfigSettings configSettings =
new FirebaseRemoteConfigSettings.Builder()
.setDeveloperModeEnabled(BuildConfig.DEBUG)
.build();
FirebaseRemoteConfig.getInstance().setConfigSettings(configSettings);
我的问题是"BuildConfig.DEBUG" ,它返回 false。 所以它在缓存中取值 1h 直到它被再次获取!
那么在我的情况下,我能得到控制addOnCompleteListener
为获取方法,但我已经取的值firebaseRemoteConfig
只是我打电话后firebaseRemoteConfig.activate()
所以,当我试图从获取值firebaseRemoteConfig
它返回我以前保存的值,因为firebaseRemoteConfig.activate()
异步运行,并且在我从 firebaseRemoteConfig 获取新值之前没有保存新值,所以我也为activate()
方法添加了完整的侦听器,这里:
firebaseRemoteConfig.fetch()
.addOnCompleteListener(activity, OnCompleteListener {
if (it.isSuccessful)
{
Log.d("task","success")
firebaseRemoteConfig.activate().addOnCompleteListener { // here I have added a listener
val base_url=firebaseRemoteConfig.getString("base_url")
Log.d("base url",base_url)
Toast.makeText(activity, "Base url: $base_url",Toast.LENGTH_SHORT).show()
}
}
else
{
Log.d("task","failure")
}
})
Android Studio 的 Build Variant 是否与您预期的 Firebase 项目匹配?
我有一个问题,Firebase 远程配置没有使用fetch(0)
触发 OnCompleteListener ,但使用fetch()
触发。
查看FirebaseRemoteConfig.fetch() 不会每次都触发 OnCompleteListener ,我发现第一个答案有时即使使用fetch(0)
。 然后我再次将间隔设置为 3600 秒,因为错误继续出现:
override fun onPostResume() {
super.onPostResume()
// Initialize FirebaseRemoteConfig here.
...
firebaseRemoteConfig.fetch(3600).addOnCompleteListener { task ->
if (task.isSuccessful) {
firebaseRemoteConfig.activateFetched()
//calling function to check if new version is available or not
checkForUpdate(currentVersionCode, firebaseRemoteConfig.getString(VERSION_CODE_KEY))
} else
Toast.makeText(this@MainActivity, "Someting went wrong please try again",
Toast.LENGTH_SHORT).show()
}
}
我在做一个大项目,但问题被埋在了一个意想不到的地方。 长话短说:firebase 应用程序 ID(通常通过 google-services.json 设置)已通过代码更改:
FirebaseOptions.Builder builder = new FirebaseOptions.Builder();
builder.setApplicationId(applicationId);
builder.setApiKey(apiKey);
FirebaseOptions options = builder.build();
FirebaseApp.initializeApp(context, options);
解决方案是删除该代码并让 firebase 使用来自“google-services.json”的信息。
使用 fetchAndActivate 而不是 fetch
我面临着同样的问题。 获取后,只有第一次没有听众接到电话。 我在单行中尝试 fetchAndActivate,它对我有用。 使用下面的代码
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();
}
});
它将立即获取并激活。 您可以在此处的官方文档中找到这种方式
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.