8

背景

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

问题

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

我使用了与示例(此处)大致相同的代码:

    // 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:几乎总是成功。
  • Nexus 4 与 Android 5.1.1 和 LG G2 与 Android 4.2.2 :几乎总是冻结(意味着他们没有进入回调)

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

问题

为什么会发生?我能做些什么来解决这个问题?

4

3 回答 3

1

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

关于“之后它在附近的会话中起作用”,一旦你得到回调并调用 activateFetched(),所有会话都将获得正确的值。

更新 3 秒延迟来自 Activity.onCreate()。进一步检查后,它只在一个设备上运行——Nexus 4。它在三星 S3 和 Moto X Pure 上都没有。我们还检查了三星 S7,它在没有任何延迟的情况下工作——这个问题根本没有表现出来。

我们正在与 Firebase 支持的邮件通信中讨论它。当他们回复我时,我会在这里更新..

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

于 2016-06-29T05:32:32.227 回答
0

为什么会发生?我能做些什么来解决这个问题?

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

以下是我和我的团队迄今为止发现的可能被视为远程配置问题的列表。

以上列表是我和我的队友迄今为止发现的一些关于远程配置的问题。其中前两个来自 Google 搜索,最后一个是“调试构建和发布构建可能会影响远程配置的行为方式..?” 是我们在测试远程配置一段时间后观察到的,所以我们还不确定。

我不确定它是否能解决您的问题,但如果您的问题与我上面列出的第一个问题有关,由于fetch()调用太早,那么您可以尝试调用我们尝试过的方法,这样有更好的fetch()机会postDelayedRemote Config 成功调用它的监听器,但总的来说,在我个人看来,Remote Config 还没有完全准备好用于生产发布。.

于 2016-07-19T01:53:31.210 回答
0

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

我尝试了很多张贴的解决方法,但没有一种方法能可靠地让我满意。不过,Firebase 开发人员似乎已经意识到了这个问题,所以这个问题可能很快就会得到解决。

于 2016-06-28T14:48:26.957 回答