远程配置值获取不一致

时间:2019-09-29 06:34:04

标签: android android-lifecycle firebase-remote-config

我正在onStart()和onStop()中获取Firebase远程配置值。我保存在“ min_version”中的变量,用于应用内更新功能。因此,我的问题是,当我要进行远程配置并更新值时,它们不会立即更新,而是在更新为新值之前将其旧值保存以用于应用程序的整个生命周期迭代。这意味着,如果我决定要更新某个版本的所有用户,则他们不会立即获得应用程序内更新,而只会在经过onStop一次迭代之后才能获得。

这是我的onStart()和onStop()代码-


@Override
  protected void onStart() {
    /**
     * We are fetching the minimum version that we want the user to have from Firebase Remote Config, only after we have the results we can proceed to start the app.
     */
    getMinAppVersion("onStart", () -> {
      // navigation drawer
      checkValidFacebookSession();
      initDrawerMenu();

      // network monitoring
      registerNetworkReceiver();

      // monitoring upload
      LocalBroadcastManager.getInstance(this).registerReceiver(mUploadReceiver, new IntentFilter(ULBroadcastConstants.UPLOAD_STATUS_ACTION));
      LocalBroadcastManager.getInstance(this).registerReceiver(mFCMReceiver, new IntentFilter(MyFirebaseMessagingService.RECEIVED_FCM_ACTION));

      checkInAppUpdate();
    });
    super.onStart();
  }

@Override
  protected void onStop() {
    getMinAppVersion("onStop", () -> {
      mNavigationView.setNavigationItemSelectedListener(null);
      mDrawerLayout.removeDrawerListener(mBadgeDrawerToggle);


      // network monitor
      unregisterNetworkReceiver();

      // unregister upload
      LocalBroadcastManager.getInstance(this).unregisterReceiver(mUploadReceiver);
      LocalBroadcastManager.getInstance(this).unregisterReceiver(mFCMReceiver);
    });

    super.onStop();
  }

这是我的“ getMinAppVersion()”方法-


private void getMinAppVersion(String didComeFrom, OnRemoteConfigFetchComplete listener){
    //fetching the min_version parameter from 'remote config' of Firebase and saves it to our local variable.
    FirebaseRemoteConfig mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
    FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder().setMinimumFetchIntervalInSeconds(200).build();
    mFirebaseRemoteConfig.setConfigSettingsAsync(configSettings);
    mFirebaseRemoteConfig.fetch(0);
    mFirebaseRemoteConfig.activate().addOnCompleteListener(task -> {
      if (task.isSuccessful()) {
        min_version = mFirebaseRemoteConfig.getLong(RemoteConfigUtil.MIN_VERSION);
        Timber.tag("min_version_" + didComeFrom).d(String.valueOf(min_version));
        if (listener != null)
          listener.onFetchComplete();
      } else {
        Timber.tag("min version").d("error while fetching and activating remove config");
      }
    });
  }

2 个答案:

答案 0 :(得分:1)

控制台中的远程配置更新不是即时的。它们不像推送通知那样工作。新值仅在fetch()返回的任务完成后生效,然后您调用activate()。我将指出,您不是使用fetch()返回的Task来查找何时从Firebase接收到新值。

答案 1 :(得分:1)

这就是为什么它发生的原因。 Remote Config根据官方文档将值缓存在本地存储中。您可以在这里参考并考虑

“ Remote Config包括一个客户端库,该客户端库处理重要的任务,例如获取参数值并将其缓存,同时仍使您可以控制何时激活新值,以便它们影响应用程序的用户体验。您可以通过控制任何更改的时间来维护您的应用程序体验。”

使用客户端库获取remote-config参数时,如果缓存的值在那(TL; DL),它将返回给您以获取更多信息,您可以阅读官方文档here。它使用最小时间间隔来获取值,以避免应用程序崩溃。对于该最小间隔时间,最后获取的值用作缓存

mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder()
        .setMinimumFetchIntervalInSeconds(3600)
        .build();
mFirebaseRemoteConfig.setConfigSettingsAsync(configSettings);

这里3600是两次新提取之间的时间minimum interval,您可以根据需要调整时间。如果您最近调用了fetch(),并且再次调用它,则客户端库会根据minimum-interval的时间确定应执行新的API调用还是提供缓存的值。 Firebase远程配置可在REST api上使用,并且也使用Throttling