我正在尝试实施Firebase远程配置:
override fun onCreate(savedInstanceState: Bundle?) {
val configSettings = FirebaseRemoteConfigSettings.Builder().setDeveloperModeEnabled(BuildConfig.DEBUG).build()
mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance()
mFirebaseRemoteConfig.setConfigSettings(configSettings)
mFirebaseRemoteConfig.setDefaults(R.xml.remote_config_defaults)
fetchRemoteConfig()
}
private fun fetchRemoteConfig() {
var cacheExpiration = 3600L
if (mFirebaseRemoteConfig.info.configSettings.isDeveloperModeEnabled) {
cacheExpiration = 0L
}
mFirebaseRemoteConfig.fetch(cacheExpiration)
.addOnCompleteListener { task ->
if (task.isSuccessful) {
Log.d(TAG, "Remote config fetch succeeded")
mFirebaseRemoteConfig.activateFetched()
} else {
Log.d(TAG, "Remote config fetch failed - ${task.exception?.message}")
}
setupView()
}
}
private fun setupView() {
val text = mFirebaseRemoteConfig.getString("my_text")
//...
}
我的问题是并不总是调用OnCompleteListener。 如果我多次关闭/打开我的应用程序,则不会始终触发setupView()。
应始终调用OnCompleteListener吗?即使我正在点击缓存?
编辑:即使我禁用开发者模式,行为也是一样的。有时会触发回调,有时不会。
答案 0 :(得分:27)
我遇到了同样的问题并联系了firebase支持。他们回复了以下内容:
目前有一个错误报告,如果过早调用fetch(),则不会调用onComplete,onSuccess和onFailure侦听器。 [...] 目前有一个解决方法,你可以将fetch()放在postResume中。在解决方案发布之前,您可以尝试同时使用它。
我相应地实施了变通方法
protected void onPostResume() {
super.onPostResume();
mFirebaseRemoteConfig.fetch(cacheExpiration)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG, "Fetch Succeeded");
// Once the config is successfully fetched it must be activated before newly fetched values are returned.
mFirebaseRemoteConfig.activateFetched();
// Do whatever should be done on success
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
Log.d(TAG, "Fetch failed");
// Do whatever should be done on failure
}
});
}
到目前为止,似乎他们提出的解决方法已经解决了这个问题。
更新:
我刚收到firebase支持的通知。根据他们的说法,最新的Google Play服务更新解决了这个问题。
在最新的Google Play服务更新中发布了一个修复远程配置,而不是在获取后调用侦听器。 我现在要结案。但是,如果您仍然遇到问题,请随时与我联系并告知我们。
答案 1 :(得分:2)
如果您的设备运行旧的Google Play服务且版本不兼容,则应在日志中看到:
GooglePlayServicesUtil:Google Play服务已过期。需要11020000但找到10930470
一种解决方案是升级您的设备Google Play服务,但如果不能,您也可以简单地降级firebase版本以匹配预期版本(此处将11.0.2更改为10.9.3)。 不理想,但如果你不能升级你的设备仍然是一个解决方案(例如,模拟器从今天开始运行10.9.3):
compile 'com.google.firebase:firebase-core:10.2.6'
compile 'com.google.firebase:firebase-messaging:10.2.6'
compile 'com.google.firebase:firebase-config:10.2.6'
答案 2 :(得分:1)
对于那些无法通过简单地调用fetchResume上的fetch()来实现它的人(并且真的愿意让这项工作更好),你可以尝试在Handler.postDelayed()
内调用fetch方法来延迟你的获取时间。对于我们的团队,它增加了获取方法正常工作的机会。当然,这个解决方案不能像调用fetch onPostResume那样可靠地工作。
@Override
public void onPostResume() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mFirebaseRemoteConfig.fetch(cacheExpiration)...
...
}
}, 500L);
}
答案 3 :(得分:-2)
更新版本9.2.0的firebase按照预期运行,不再需要此黑客攻击。
我得到了这个&#34;工作&#34;可靠......但你可能不喜欢我的解决方案。为了在firebase准备就绪时获取配置提取,我必须这样做:
FirebaseAuth.getInstance()
// I don't actually want to or need to sign in..(and this actually throws an error for us.. but we ignore it)
.signInAnonymously()
// when it completes (error or no error) we can do our business
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
// do the remote config fetch you were doing before
remoteConfig.fetch(...).addOnComplete(...);
}
});
这确保firebase内部已准备好进行初始配置提取...在第一个应用程序打开时,这似乎需要大约6-10秒才能在我糟糕的测试设备上完成(包括auth和config fetch)。在随后的打开中,整个过程需要2-5秒。显然,这取决于设备/网络和YMMV。
我很想知道为什么这是必需的..似乎远程配置应该能够在内部管理它而不是将它暴露给我们。
P.S。除了firebase-config
之外,你还需要这种依赖 compile 'com.google.firebase:firebase-auth:9.0.1'