tutorial remote integrar firebaseremoteconfig examples configurar cacheexpiration android firebase firebase-remote-config

remote - integrar firebase android



Firebase Remote Config: no se puede leer ningĂșn valor, pero fetch es exitoso (6)

Encontrado el problema

Después de agregar un poco de registro, encontré que nunca se estaba llamando al trabajo de onComplete() de onComplete() . onCreate la búsqueda de la aplicación onCreate a la de un fragmento, ¡y ahora funciona correctamente!

( , esto podría ser algo para investigar o aclarar, ya que los registros indicaban que Firebase se inicializó sin problemas cuando estaba en la Aplicación, y que las capturas fueron fallas silenciosas).

Intento tener un parámetro de configuración remota utilizando la nueva función de configuración remota de Firebase, y estoy teniendo un problema.

Aquí está mi consola de configuración remota:

Estoy onCreate() y actualizando en mi aplicación onCreate() :

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

Y así es como lo estoy leyendo:

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

El valor está devolviendo nulo.

Si llamo a remoteConfig.getInfo().getLastFetchStatus() , devuelve LAST_FETCH_STATUS_SUCCESS , por lo que parece que la recuperación se está realizando correctamente.

¿Alguna idea de por qué mi valor está en blanco?


He usado un código similar al @Ian Barber (copia):

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

Mi problema fue el "BuildConfig.DEBUG" , devuelve falso. ¡Así que toma el valor de 1 hora en caché hasta que fue recuperado nuevamente!


Lo primero que debes hacer es comprobar si tienes la configuración de firebase correcta y estás conectado a firebase. Si tienes android studio 2.2, ve a Tools-> Firebase-> RemoteConfig - Conéctate a Firebase y mira si recibes una notificación que diga conectada. Una vez conectado, haga lo siguiente en su código: 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);

Y luego, para recuperar la configuración, haga lo siguiente: long cacheExpiration = 2000; // Puede aumentar esto generalmente 12 horas es lo que se recomienda

/** 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(); } });

Ejecute su aplicación y compruebe los registros "Firebase Remote config Fetch Successed". Si ves lo mismo, tus configuraciones remotas se cargan y activan.


Probablemente estés presionando el caching en caching en Remote Config. La forma en que funciona es que Config almacenará en caché los elementos entrantes localmente y los devolverá. Así que su último estado de búsqueda (en caché) probablemente fue antes de que se definiera el valor, y obtenemos un valor en blanco almacenado en caché.

Puede controlar la caducidad de la memoria caché, pero si la busca con demasiada frecuencia corre el riesgo de ser acelerada.

Sin embargo, dado que este es un problema de desarrollo común, hay un modo de desarrollador que le permite solicitar más rápidamente (para grupos pequeños de usuarios):

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

Cuando llame a fetch , puede pasar un tiempo de caducidad corto de caché

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

Así es como se hace en la muestra de inicio rápido si quiere una referencia completa.


Tuve el mismo problema y no hubo soluciones provisionales útiles en mi caso. El problema estaba en el dispositivo de prueba. Usé el emulador sin instalar Google Mobile Services, debido a esto el evento completo no se activó. Probé mi teléfono con GMS y todo funcionó muy bien. Buena suerte.


¡Solución alternativa encontrada! Vea abajo

Me encuentro con el asunto de la "finalización silenciosa": llamo "buscar" pero los oyentes completos, en éxito o en desfallecimiento nunca se activan. Intenté moverlo a una actividad en Crear, y todavía no pasó nada, y por lo tanto, los elementos de configuración nunca se cargan desde el servidor. Tengo el Modo de desarrollador habilitado y llamo a buscar con un valor de caché de 0.

Pude (una vez) poner un punto de interrupción en la línea "public void onComplete (tarea de tarea @NonNull) {", que recibió un golpe, y luego pude pasar y se activó el onComplete. Entonces no pude reproducir el mismo resultado de otra forma, incluso haciendo lo mismo (creo) por segunda vez.

Parece un problema de tiempo o concurrencia, pero eso tiene poco sentido, dado que se trata de una llamada asíncrona.

Solución

Si obtiene de Activity # onResume (o, supongo, Activity # onStart), funciona perfectamente. La búsqueda de llamadas de Activity # onCreate o Application # onCreate da como resultado una llamada que aparentemente nunca se maneja, y de hecho, el rendimiento de la aplicación se deteriora notablemente después de que comienza la búsqueda, así que creo que hay un looper ejecutándose o algo así. *

Solución # 2

Si realmente quiere que esto se ejecute desde Application # onCreate (lo cual hago), esto parece funcionar también:

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