web-dev-qa-db-fra.com

Configuration à distance de Firebase: impossible de lire les valeurs, mais extraction réussie

J'essaie d'avoir un paramètre de configuration à distance à l'aide de la nouvelle fonctionnalité de configuration à distance de Firebase, et j'ai un problème.

Voici ma console de configuration à distance:  remote config console

Je vais chercher et mettre à jour dans la onCreate() de mon application:

final FirebaseRemoteConfig remoteConfig = FirebaseRemoteConfig.getInstance();
remoteConfig.fetch().addOnCompleteListener(new OnCompleteListener<Void>() {
    @Override
    public void onComplete(@NonNull Task<Void> task) {
        if (task.isSuccessful()) {
            remoteConfig.activateFetched();
        }
    }
});

Et voici comment je le lis:

FirebaseRemoteConfig remoteConfig = FirebaseRemoteConfig.getInstance();
String value = remoteConfig.getString("active_subscriptions");

La valeur renvoie null.

Si j'appelle remoteConfig.getInfo().getLastFetchStatus(), il renvoie LAST_FETCH_STATUS_SUCCESS, il semble donc que l'extraction se déroule correctement.

Une idée pourquoi ma valeur est vide?

33
Steven Schoen

Trouvé le problème.

Après avoir ajouté une certaine journalisation, j'ai constaté que la fonction onComplete() du travail d'extraction n'était jamais appelée. J'ai déplacé l'extraction de la onCreate de mon application vers un fragment, et maintenant cela fonctionne correctement!

( Ian Barber , cela pourrait être quelque chose à examiner ou à clarifier, car les journaux indiquaient que Firebase avait été initialisé sans problème lorsqu'il se trouvait dans l'application et que les extractions étaient des échecs silencieux.)

8
Steven Schoen

Solution trouvée! Voir ci-dessous

Je suis confronté au problème de la "complétion silencieuse": j'appelle "chercher" mais les écouteurs onComplete, onSuccess ou onFailure ne se déclenchent jamais. J'ai essayé de le déplacer vers une activité sur Créer et toujours rien ne s'est passé, et par conséquent, les éléments de configuration ne sont jamais chargés à partir du serveur. Le mode développeur est activé et j'appelle l'extraction avec une valeur de cache de 0.

J'ai pu (une fois) placer un point d'arrêt sur la ligne "Public Void onComplete (@NonNull Task task) {", qui a été touchée, puis j'ai pu y accéder et le onComplete a été renvoyé. J'étais alors incapable de reproduire ce même résultat d'une autre manière, y compris de faire la même chose (je pense) une seconde fois.

Cela ressemble à un problème de synchronisation ou de concurrence, mais cela n'a pas beaucoup de sens, étant donné qu'il s'agit d'un appel asynchrone.

Solution de contournement

Si vous récupérez depuis Activité # onResume (ou, je suppose, Activité # onStart), cela fonctionne parfaitement. L'appel de l'extraction à partir de l'activité # onCreate ou de l'application # onCreate donne lieu à un appel qui, apparemment, n'est jamais traité. En fait, les performances de l'application se dégradent considérablement après le début de l'extraction.

Contournement # 2

Si vous voulez vraiment que cela fonctionne à partir de l'application # onCreate (ce que je fais), cela semble également fonctionner:

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        // Run mFirebaseRemoteConfig.fetch(timeout) here, and it works
    }
}, 0);
17
jkane001

Vous êtes probablement en train de frapper le caching in Remote Config. La façon dont cela fonctionne est que Config mettra en cache localement les éléments entrants et les renverra. Ainsi, votre dernier statut d'extraction (mis en cache) était probablement antérieur à la définition de la valeur et nous obtenons une valeur vide mise en cache. 

Vous pouvez contrôler l'expiration du cache, mais si vous récupérez trop souvent, vous risquez de vous faire étrangler. 

Comme il s’agit d’un problème de développement courant, il existe un mode développeur qui vous permet de demander plus rapidement (pour de petits groupes d’utilisateurs): 

FirebaseRemoteConfigSettings configSettings = 
    new FirebaseRemoteConfigSettings.Builder()
        .setDeveloperModeEnabled(BuildConfig.DEBUG)
        .build();
FirebaseRemoteConfig.getInstance().setConfigSettings(configSettings);

Lorsque vous appelez fetch, vous pouvez alors passer un délai d’expiration du cache court.

long cacheExpiration = 3600;
FirebaseRemoteConfig mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
if (mFirebaseRemoteConfig.getInfo().getConfigSettings().isDeveloperModeEnabled()) {
     cacheExpiration = 0;
}
mFirebaseRemoteConfig.fetch(cacheExpiration)
     .addOnCompleteListener(new OnCompleteListener<Void>() {
     // ...
});

C’est ce qui se passe dans l’exemple quickstart si vous souhaitez une référence complète.

15
Ian Barber

J'ai eu le même problème et aucune solution de contournement n'a été utile dans mon cas. Le problème était dans le dispositif de test. J'ai utilisé l'émulateur sans installer Google Mobile Services. Pour cette raison, l'événement Complet n'a pas été déclenché. J'ai essayé mon téléphone avec GMS et tout a bien fonctionné. Bonne chance.

3
Vadim Zin4uk

Dans un tel cas, la première chose à faire est de vérifier si vous disposez de la configuration Firebase appropriée et que vous êtes connecté à Firebase. Si Android Studio 2.2 est installé sur Outils-> Firebase-> RemoteConfig - Connectez-vous à Firebase et voyez si vous recevez une notification disant connecté. Une fois connecté, procédez comme suit dans votre code: mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance ();

    /** NOTE: At this point, your app can use in-app default parameter values.To use in-app
     *        default values,skip the next section. You can deploy your app without setting
     *        parameter values on the server,and then later set values on the server to
     *        override the default behavior and appearance of your app.
     */

    mFirebaseRemoteConfig.setDefaults(R.xml.remote_config_defaults);
    FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder()
            .setDeveloperModeEnabled(true)
            .build();
    mFirebaseRemoteConfig.setConfigSettings(configSettings);

Et ensuite, pour aller chercher config, procédez comme suit long cacheExpiration = 2000; // Peut augmenter cela habituellement 12 heures est ce qui est recommandé

    /** If in developer mode cacheExpiration is set to 0 so each fetch will retrieve values from
     * the server.*/

    if (mFirebaseRemoteConfig.getInfo().getConfigSettings().isDeveloperModeEnabled()) {
        cacheExpiration = 0;
    }

   /**  cacheExpirationSeconds is set to cacheExpiration here, indicating that any previously
    * fetched and cached config would be considered expired because it would have been fetched
    * more than cacheExpiration seconds ago. Thus the next fetch would go to the server unless
    * throttling is in progress. The default expiration duration is 43200 (12 hours).
    */

    mFirebaseRemoteConfig.fetch(cacheExpiration)//TODO Bring this from a config file
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "Firebase Remote config Fetch Succeeded");
                        // Once the config is successfully fetched it must be activated before newly fetched
                        // values are returned.
                        mFirebaseRemoteConfig.activateFetched();
                    } else {
                        Log.d(TAG, "Firebase Remote config Fetch failed");
                    }
                    showRemoteConfig();
                }
            });

Exécutez votre application et enregistrez les journaux "Récupération de configuration Firebase Remote". Si vous voyez la même chose, vos configurations à distance sont chargées et activées.

2
Raheel Shah

J'ai utilisé un code similaire à @Ian Barber (copie):

FirebaseRemoteConfigSettings configSettings = 
    new FirebaseRemoteConfigSettings.Builder()
        .setDeveloperModeEnabled(BuildConfig.DEBUG)
        .build();
FirebaseRemoteConfig.getInstance().setConfigSettings(configSettings);

Mon problème était le "BuildConfig.DEBUG" , il retourne faux. Donc, il faut que la valeur 1h dans le cache soit récupérée!

2

J'ai eu un problème parce que Firebase Remote Config n'a pas déclenché OnCompleteListener avec fetch(0), mais avec fetch().

En regardant FirebaseRemoteConfig.fetch () ne déclenche pas OnCompleteListener à chaque fois , j'ai constaté que la première réponse fonctionnait parfois même avec fetch(0). Ensuite, j'ai de nouveau défini 3600 secondes pour intervalle, les erreurs continuant à apparaître:

override fun onPostResume() {
    super.onPostResume()

    // Initialize FirebaseRemoteConfig here.
    ...

    firebaseRemoteConfig.fetch(3600).addOnCompleteListener { task ->
        if (task.isSuccessful) {
            firebaseRemoteConfig.activateFetched()
            //calling function to check if new version is available or not
            checkForUpdate(currentVersionCode, firebaseRemoteConfig.getString(VERSION_CODE_KEY))
        } else
            Toast.makeText(this@MainActivity, "Someting went wrong please try again",
                Toast.LENGTH_SHORT).show()
    }

}
0
CoolMind

J'ai aussi rencontré ce problème. Il s'avère que je n'avais pas vu le bouton 'Publier' dans la console Firebase. : facepalm:

0
aaronmarino