update studio reglas indexon datos data auth android firebase firebase-database

android - studio - indexon firebase



La base de datos de Firebase no compromete el bloqueo de datos en lĂ­nea. (1)

Estoy usando el servicio de Firebase Database para sincronizar los datos de los usuarios. He habilitado las compatibilidades fuera de línea y el problema es que después de unos meses de uso, los datos de los usuarios no se confirman en la base de datos en línea, aparentemente porque los sistemas telefónicos de los usuarios bloquean la conexión a Internet de la aplicación.

En algunos casos, logré guiar a los usuarios a habilitar la opción de "uso ilimitado de datos", pero no funciona para todos.

En mi caso, el problema es que el oyente:

void onDataChange(DataSnapshot var1);

de ValueEventListener , no se ValueEventListener cuando una gran cantidad de datos se almacena fuera de línea y no se compromete, y bloquea todos los comportamientos.

No tengo límite de almacenamiento en línea porque tengo el plan Blaze (pague por consumir).

Las transacciones no se comprometen también, y dispara "La transacción fue anulada por un conjunto subsiguiente" con el código de error -9.

El detector de conexión provisto por Firebase siempre imprime "no conectado"

También traté de alternar goOffline() con goOnline() pero no pasa nada.

No entiendo por qué el teléfono podría bloquear mi aplicación para que no se sincronice y permitir que aplicaciones como Facebook y Youtube consuman una gran cantidad de datos de Internet.

Este comportamiento solo ocurre en los dispositivos Android, no hay ningún problema en los teléfonos iOS que usan la misma base de datos de Firebase.

No funciona con 4g, WI-FI ni con VPN (se usa VPN de Opera).

Actualización 1:

Los registros contienen al inicio de ~ 10 veces:

11-13 21:12:28.477 15765 15856 D PersistentConnection: pc_0 - Scheduling connection attempt 11-13 21:12:28.477 15765 15856 D ConnectionRetryHelper: Scheduling retry in 26091ms 11-13 21:12:54.597 15765 15856 D PersistentConnection: pc_0 - Trying to fetch auth token 11-13 21:12:55.747 15765 15856 D PersistentConnection: pc_0 - Error fetching token: An internal error has occurred. [ TOKEN_EXPIRED ]

Cuando intento insertar datos nuevos:

RepoOperation: Aborting transactions for path: [the path]


Después de una larga investigación, descubrí que el token no se actualizaba automáticamente.

En primer lugar, compruebe si el usuario actual ha iniciado sesión con FirebaseAuth.AuthStateListener

Para verificar si necesito actualizar el token

1) Compruebe si la aplicación tiene conexión a Internet:

public static boolean isOnline(Context context) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); return networkInfo != null && networkInfo.isConnectedOrConnecting(); }

2) Luego verifico si la base de datos está conectada a: Detectando estado de conexión

Si la aplicación tiene una conexión a Internet y la base de datos no está conectada, intento actualizar el token:

try { user.getIdToken(true).addOnCompleteListener(new OnCompleteListener<GetTokenResult>() { @Override public void onComplete(@NonNull Task<GetTokenResult> task) { if (task.isSuccessful()) { //succcess } else { //need login again } } }); }catch(Exception e) { //need login again }

Si hay una excepción o la tarea de finalización falla, intento volver a iniciar sesión con el usuario. En la mayoría de los casos, habrá un inicio de sesión transparente, por lo que no se mostrará al usuario, ya que usará las credenciales ya almacenadas por el propio SDK.

Creo que esto es un truco porque afecta solo a unos pocos usuarios, por lo que es un error de SDK.