FirebaseRemoteConfig.fetch()不会每次都触发OnCompleteListener

时间:2016-05-28 16:00:58

标签: android firebase firebase-remote-config

我正在尝试实施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 个答案:

答案 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'