¿Por qué FirebaseRemoteConfig.fetch no llama a su devolución de llamada?

Fondo

Trato de usar los nuevos servicios de Firebase de Google, para pruebas A / B. Para ello, necesitamos utilizar Firebase Analytics y Firebase RemoteConfig.

El problema

Utilizando FireBase RemoteConfig, quería obtener las variables del servidor (que tienen un valor diferente por variante de cada experimento), pero parece que en algunos dispositivos se queda atascado, no llamando a su devolución de llamada (OnCompleteListener.onComplete).

Utilicé sobre el mismo código que en las muestras ( aquí ):

// init: boolean isDebug = ... ; mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance(); FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder().setDeveloperModeEnabled(isDebug).build(); mFirebaseRemoteConfig.setConfigSettings(configSettings); final HashMap<String, Object> defaults = new HashMap<>(); for (...) defaults.put(...); mFirebaseRemoteConfig.setDefaults(defaults); //fetching the variables: long cacheExpiration = isDebug ? 0 : java.util.concurrent.TimeUnit.HOURS.toSeconds(1); mFirebaseRemoteConfig.fetch(cacheExpiration).addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { //on some devices, I never get here at all if (task.isSuccessful()) { mFirebaseRemoteConfig.activateFetched(); final FirebaseAnalytics firebaseAnalytics = FirebaseAnalytics.getInstance(context); for (...) { String experimentVariantValue = mFirebaseRemoteConfig.getString(...); firebaseAnalytics.setUserProperty(..., experimentVariantValue); } } else { } } }); 

La cosa es, la llamada no se llama, pero sólo en algunos dispositivos:

  • Nexus 5 con Android 6.0.1: casi siempre tiene éxito.
  • Nexus 4 con Android 5.1.1 y LG G2 con Android 4.2.2: casi siempre congelar (lo que significa que no entrar en la devolución de llamada)

También he encontrado que cuando funciona, funciona en las sesiones cercanas después.

La pregunta

¿Por qué ocurre? ¿Qué puedo hacer para solucionar esto?

Sólo para añadir a lo que Cachapa acaba de publicar, el error ocurre cuando se llama fetch () demasiado pronto. Encontramos dos soluciones al problema (ambos funcionan pero no son satisfactorios): llamamos a fetch () de un onResume, o añadimos un retraso de 3 segundos antes de emitir el fetch ().

Y sobre el "funciona en las próximas sesiones después", una vez que obtenga la devolución de llamada y llamar a activateFetched (), todas las sesiones obtendrán los valores correctos.

Actualización El retraso de 3 segundos fue de Activity.onCreate (). Después de comprobar más, sólo funcionó en un dispositivo – Nexus 4. No hizo el truco en un Samsung S3 ni en un Moto X Pure. También comprobamos en un Samsung S7, allí trabajó sin ningún retraso – el problema nunca se manifestó en absoluto.

Lo estamos discutiendo en una correspondencia por correo con el soporte de Firebase. Actualizaré aquí cuando vuelvan a mí ..

Actualización 2 El equipo de Firebase afirma que esto se resuelve en GPSv9.4 y creo que esta vez tienen razón. También afirmó que fue resuelto en 9.3, pero luego mis pruebas refutó. Ahora (después de actualizar nuestra dependencia de gms a v9.4), obtengo las devoluciones de llamada correctamente en mis dispositivos dev. Sin embargo, todavía tengo indicios de que no todos nuestros dispositivos de producción están recibiendo la configuración correcta. Mi suposición es que los dispositivos que no actualizar el GPS a la última versión son todavía defectuosos, pero no estoy seguro ..

Parece ser algún tipo de condición de carrera en el código de inicialización de Firebase, de acuerdo con esta respuesta: https://stackoverflow.com/a/37664946

He intentado bastantes de las soluciones publicadas y nada funcionó lo suficientemente fiable para mi satisfacción. Parece que los desarrolladores de Firebase son conscientes del problema, así que el problema probablemente se solucionará pronto.

¿Por qué ocurre? ¿Qué puedo hacer para solucionar esto?

Estoy adivinando la razón por la cual las devoluciones de llamada no se llama es porque Firebase Remote Config puede tener varios problemas y los que no se resuelven todavía.

A continuación se muestra una lista de cosas que mi equipo y yo hemos encontrado hasta ahora que pueden ser considerados como los problemas de configuración remota.

  • Fetch () no llama a sus devoluciones de llamada si el método se llama demasiado pronto después de la inicialización de la aplicación.
  • (FIJO en 9.2.1) El proceso de generación de Gradle falló con "minifyEnabled" – Proguard
  • La compilación de depuración y la versión de lanzamiento pueden afectar cómo se comporta la configuración remota ..?

La lista de arriba es algunos de los problemas relacionados con la configuración remota que mis compañeros y yo hemos encontrado hasta ahora. Los dos primeros son de la Búsqueda de Google, y el último, "Depurar compilación y lanzamiento de compilación puede afectar cómo se comporta la configuración remota ..?" Es de nuestra observación después de probar Remote Config por un tiempo, por lo que no estamos seguros acerca de ello todavía.

No estoy seguro de si soluciona su problema, pero si su problema está relacionado con el primer problema de lo que he enumerado anteriormente, debido a fetch() se llama demasiado pronto, entonces usted puede intentar llamar fetch() con postDelayed que tenemos Probado y hecho la mejor ocasión para que la configuración remota llamara con éxito a sus oyentes, pero en general, en mi opinión personal, la configuración remota apenas no está totalmente listo todavía para la salida de la producción. .

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.