为什么FirebaseRemoteConfig.fetch不会调用其回调?

时间:2016-06-23 14:38:17

标签: android firebase firebase-remote-config

背景

我尝试使用Google的新Firebase服务进行A / B测试。为此,我们需要同时使用Firebase Analytics和Firebase RemoteConfig。

问题

使用FireBase RemoteConfig,我想从服务器获取变量(每个实验的每个变体都有不同的值),但似乎在某些设备上它会卡在那里,而不是调用它的回调(OnCompleteListener.onComplete)。

我使用了与样本(here)相同的代码:

    // init:
    boolean isDebug = ... ;
    mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
    FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder().setDeveloperModeEnabled(isDebug).build();
    mFirebaseRemoteConfig.setConfigSettings(configSettings);
    final HashMap<String, Object> defaults = new HashMap<>();
    for (...)
        defaults.put(...);
    mFirebaseRemoteConfig.setDefaults(defaults);

    //fetching the variables:
    long cacheExpiration = isDebug ? 0 : java.util.concurrent.TimeUnit.HOURS.toSeconds(1);
    mFirebaseRemoteConfig.fetch(cacheExpiration).addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            //on some devices, I never get here at all
            if (task.isSuccessful()) {
                mFirebaseRemoteConfig.activateFetched();
                final FirebaseAnalytics firebaseAnalytics = FirebaseAnalytics.getInstance(context);
                for (...) {
                    String experimentVariantValue = mFirebaseRemoteConfig.getString(...);
                    firebaseAnalytics.setUserProperty(..., experimentVariantValue);
                }
            } else {
            }
        }
    });

事情是,回调不会被调用,但只在某些设备上调用:

  • 使用Android 6.0.1的Nexus 5:几乎总是成功。
  • 使用Android 5.1.1的Nexus 4和使用Android 4.2.2的LG G2:几乎总是冻结(意味着他们不会进入回调)

我还发现,当它确实有效时,它会在之后的近会话中起作用。

问题

为什么会发生?我该怎么做才能解决这个问题?

3 个答案:

答案 0 :(得分:1)

只是为了添加Cachapa刚刚发布的内容,当fetch()过早调用时会发生错误。我们找到了两个问题的解决方案(工作但不满意) - 从onResume调用fetch(),或者在实际发出fetch()之前加上3秒的延迟。

关于&#34;它在后续会话中工作&#34;,一旦你得到回调并调用activateFetched(),所有会话都将获得正确的值。

<强>更新 3秒的延迟来自Activity.onCreate()。经过进一步检查后,它只能在一台设备上运行 - Nexus 4.它没有在三星S3或Moto X Pure上做到这一点。 我们还检查了三星S7,它没有任何延迟地工作 - 问题根本没有表现出来。

我们正在与Firebase支持部门进行邮件通信。当他们回到我身边时,我会在这里更新..

更新2 Firebase团队声称这已经在GPSv9.4中解决了,我想这次他们是对的。他们还声称它在9.3中得到了解决,但随后我的测试反驳了它。现在(在将我们对gms的依赖关系更新到v9.4之后),我在我的开发设备上正确地获得了回调。但是,我仍然有迹象表明并非所有的生产设备都能获得正确的配置。我的假设是没有将GPS更新到最新版本的设备仍然有问题,但我不确定..

答案 1 :(得分:0)

根据这个答案,这似乎是Firebase初始化代码中的某种竞争条件:https://stackoverflow.com/a/37664946

我尝试了一些已发布的解决方法,但没有任何可靠的工作能让我满意。似乎Firebase开发人员已经意识到了这个问题,所以很快就会解决问题。

答案 2 :(得分:0)

  

为什么会发生?我该怎么做才能解决这个问题?

我猜测回调没有被调用的原因是因为Firebase远程配置可能有几个问题而且还没有解决。

以下列出了我和我的团队到目前为止所发现的可能被视为远程配置问题的事项。

以上列表是我和我的队友到目前为止发现的远程配置的一些问题。前两个来自谷歌搜索,最后一个,&#34;调试构建和发布版本可能会影响远程配置的行为方式..?&#34;来自我们在远程配置测试一段时间之后的观察,所以我们还不确定它。

我不确定它是否解决了您的问题,但如果您的问题与我上面列出的第一个问题相关,由于foreach($tables as $table){ $sql .= 'UPDATE `table` SET `order` = '$i' WHERE `id` ='.$table['id'].';'; $i++; } mysqli_multi_query($sql); //do this after loop completes 过早调用,那么您可以尝试调用{{1与fetch()我们已经尝试过,它使远程配置成功调用其监听器的机会更大,但总的来说,in my personal opinion, Remote Config is just not fully ready yet for production release.