Удаленная загрузка значений конфигурации несовместима - PullRequest
0 голосов
/ 29 сентября 2019

Я получаю значения удаленной конфигурации Firebase как в onStart (), так и в onStop ().Переменная, которую я держу в "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 ]

1 голос
/ 29 сентября 2019

Вот почему это происходит.Remote Config кэширует значение в локальном хранилище в соответствии с официальными документами.Вы можете обратиться сюда и рассмотреть

"Remote Config включает в себя клиентскую библиотеку, которая выполняет важные задачи, такие как выборка значений параметров и их кэширование, и в то же время дает вам контроль над активацией новых значений, так чтоони влияют на взаимодействие с пользователем вашего приложения. Это позволяет вам защитить работу приложения, контролируя время любых изменений. "

Когда вы используете клиентскую библиотеку для получения параметра удаленной конфигурации, кэшируетсяЗначение будет возвращено вам, если оно там (TL; DL), для получения дополнительной информации вы можете прочитать официальные документы здесь .Он использует минимальный интервал времени для извлечения значения, чтобы избежать сбоев приложения. Для этого минимального интервала времени последнее извлеченное значение служило кешем

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 .

1 голос
/ 29 сентября 2019

Обновления Remote Config в консоли не являются мгновенными.Они не работают как push-уведомления.Новые значения вступают в силу только после завершения задачи, возвращенной fetch () , и после этого вы вызываете activ () .Я укажу, что вы не используете задачу, возвращаемую fetch (), чтобы узнать, когда новые значения были получены из Firebase.

...