30

我正在尝试实现 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 应该总是被调用对吗?即使我正在访问缓存?

编辑:即使我禁用开发模式,行为也是一样的。有时会触发回调,有时不会。

4

4 回答 4

28

我遇到了同样的问题并联系了 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
                }
            });
}

到目前为止,他们提出的解决方法似乎已经解决了这个问题。

更新:

我刚收到来自火力基地支持的通知。根据他们的说法,最新的 Google Play 服务更新解决了这个问题。

在最新的 Google Play 服务更新中发布了远程配置在获取后不调用侦听器的修复。我将暂时关闭此案。但是,如果您仍然遇到问题,请随时联系并告诉我。

于 2016-06-06T18:59:30.633 回答
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'
于 2017-07-06T13:22:43.460 回答
1

对于那些无法通过简单地调用 fetch() onPostResume 来实现的人(并且真的愿意让它更好地工作),你可以尝试在内部调用 fetch 方法Handler.postDelayed()来延迟你的 fetch 时间。对于我们的团队来说,它增加了 fetch 方法正常工作的机会。当然,这个解决方案并不像调用 fetch onPostResume 一样可靠地工作。

@Override
public void onPostResume() {
   new Handler().postDelayed(new Runnable() {
      @Override
      public void run() {
         mFirebaseRemoteConfig.fetch(cacheExpiration)...
         ...
      }
   }, 500L);
}
于 2016-07-21T06:33:02.753 回答
-2

更新版本 9.2.0 的 firebase 可以按预期工作,并且不再需要此 hack。

我得到了这个可靠的“工作”......但你可能不喜欢我的解决方案。为了在 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 秒(整个事情包括身份验证和配置获取)。在随后的打开中,整个过程大约需要 2-5 秒。显然,这完全取决于设备/网络和 YMMV。

我很想知道为什么需要这样做.. 似乎远程配置应该能够在内部管理它而不向我们公开它。

ps 除了 firebase-config 之外,您还需要此依赖项

compile 'com.google.firebase:firebase-auth:9.0.1'

于 2016-06-01T20:08:49.130 回答