web-dev-qa-db-fra.com

FirebaseRemoteConfig.fetch () ne déclenche pas OnCompleteListener à chaque fois

J'essaie d'implémenter Firebase Remote Config:

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")
    //...
}

Mon problème est que OnCompleteListener n'est pas toujours appelé. Si je ferme/ouvre mon application plusieurs fois, setupView () n'est pas toujours déclenché.

Le OnCompleteListener doit toujours être appelé non? Même si je frappe le cache?

EDIT: Même si je désactive le mode développeur, le comportement est le même. Parfois, le rappel est déclenché, parfois non.

28
guillaume

J'étais confronté au même problème et j'ai contacté le support Firebase. Ils ont répondu ce qui suit:

Il existe actuellement un bogue qui a été signalé lorsque les écouteurs onComplete, onSuccess et onFailure ne sont pas appelés si fetch () est appelé trop tôt. [...] Actuellement, il existe un travail autour duquel vous pouvez placer le fetch () dans un postResume. Vous pouvez essayer de l'utiliser en attendant la sortie d'une solution.

J'ai implémenté la solution de contournement en conséquence

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
                }
            });
}

Jusqu'à présent, il semble que la solution de contournement proposée ait résolu le problème.

MISE À JOUR:

Je viens de recevoir un avis du support Firebase. Selon eux, le problème est résolu avec la dernière mise à jour des services Google Play.

Un correctif pour Remote Config n'appelant pas d'auditeurs après la récupération a été publié dans la dernière mise à jour des services Google Play. Je vais clore cette affaire pour l'instant. Cependant, si vous rencontrez toujours des problèmes, n'hésitez pas à nous contacter et à me le faire savoir.

27
Max

Si votre appareil exécute un ancien service Google Play et une version incompatible, vous devriez voir dans les journaux:

GooglePlayServicesUtil: services Google Play obsolètes. Nécessite 11020000 mais trouvé 10930470

Une solution consiste à mettre à niveau les services Google Play de votre appareil, mais si vous ne le pouvez pas, vous pouvez également simplement rétrograder la version Firebase pour qu'elle corresponde à la version attendue (ici, changez 11.0.2 en 10.9.3). Pas idéal, mais toujours une solution si vous ne pouvez pas mettre à niveau votre appareil (par exemple, le simulateur exécute 10.9.3 à partir d'aujourd'hui):

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
bagage

Pour ceux d'entre vous qui ne peuvent pas le faire en appelant simplement fetch () onPostResume (et vraiment désireux d'améliorer ce fonctionnement), vous pouvez essayer d'appeler la méthode fetch dans Handler.postDelayed() pour retarder votre synchronisation de récupération. Pour notre équipe, cela a augmenté les chances que la méthode de récupération fonctionne correctement. Bien sûr, cette solution ne fonctionne pas de manière fiable, tout comme l'appel de fetch onPostResume.

@Override
public void onPostResume() {
   new Handler().postDelayed(new Runnable() {
      @Override
      public void run() {
         mFirebaseRemoteConfig.fetch(cacheExpiration)...
         ...
      }
   }, 500L);
}
1
shoheikawano