Cómo configurar la persistencia offline en Firebase Firestore

  • Configuración de la persistencia de datos en diversas plataformas como Android, iOS y Web.
  • Gestión de la caché local y control del tamaño de almacenamiento para optimizar el rendimiento.
  • Uso de metadatos para diferenciar si la información proviene del servidor o del almacenamiento local.
  • Diferencias fundamentales entre la persistencia en Firestore y el funcionamiento de Realtime Database.

Cómo configurar la persistencia offline en Firebase Firestore

Imagínate que estás diseñando una aplicación y, de repente, el usuario entra en un túnel o se queda sin datos justo cuando necesita consultar algo. Para evitar que la app se quede colgada o muestre una pantalla en blanco, Firebase ofrece una solución llamada persistencia de datos, que básicamente permite que la aplicación siga dando la cara aunque no haya conexión, similar a cómo funcionan otras funciones que siguen funcionando sin internet.

No es solo que la app no se rompa, sino que permite que el usuario siga leyendo y escribiendo datos que se guardan localmente. Una vez que el dispositivo vuelve a tener internet, Firestore se encarga de sincronizar todo el lío de cambios pendientes con la nube, asegurando que la versión más reciente sea la que prevalezca.

Activando la persistencia según la plataforma

Dependiendo de dónde estés desarrollando tu proyecto, el proceso cambia un pelín. En el caso de Android y Apple, la persistencia ya viene activada de serie, así que no tienes que mover un dedo a menos que quieras desactivarla poniendo la opción PersistenceEnabled en falso. Sin embargo, en la web la historia es otra: por defecto está apagada y tienes que llamar al método enablePersistence para que empiece a funcionar.

Para los que usan Swift u Objective-C, se puede configurar a través de FirestoreSettings, permitiendo elegir entre una caché que solo viva en la memoria o una que se escriba en el disco duro. En Kotlin o Java para Android, se utiliza el constructor de FirebaseFirestoreSettings para definir si queremos MemoryCacheSettings o PersistentCacheSettings. Por último, si usas Dart (Flutter), basta con ajustar la propiedad persistenceEnabled en los settings del cliente.

Android offline
Artículo relacionado:
Android offline: qué funciones siguen funcionando sin internet

El control del tamaño de la caché

Firestore no guarda todo infinitamente, sino que gestiona un espacio de almacenamiento. El límite predeterminado es de 100 MB, y cuando se supera, el sistema empieza a borrar los documentos más antiguos que no se han usado recientemente para hacer sitio. Si crees que tu app necesita más espacio, puedes cambiar este valor o incluso configurarlo como ilimitado mediante CACHE_SIZE_UNLIMITED.

Es importante mencionar que, mientras la persistencia esté activa, cada documento recibido del backend se guarda. Si necesitas optimizar la velocidad de las consultas offline, puedes activar la indexación automática, lo que evita que el SDK tenga que escanear toda la colección localmente cada vez que el usuario hace una búsqueda sin conexión.

Saber si los datos son frescos o locales

A veces es vital saber si la información que ve el usuario es la última versión del servidor o si es un dato «viejo» guardado en el móvil. Para esto, Firestore proporciona la propiedad fromCache dentro de SnapshotMetadata. Si este valor es true, significa que los datos vienen de la caché local y podrían estar desactualizados.

Para que tu app reaccione a estos cambios de estado, debes añadir la opción includeMetadataChanges al configurar tu escucha (listener). De este modo, el cliente recibirá un evento aunque el dato sea el mismo, pero el metadato de origen haya cambiado de local a servidor.

Gestionando la red y la seguridad al cerrar sesión

Si por alguna razón necesitas simular un entorno offline o forzar que la app no use la red, puedes llamar a disableNetwork(). Esto hará que todas las peticiones se sirvan desde la caché y que las escrituras queden en cola hasta que reactives la conexión con enableNetwork().

Aquí es donde entra un punto crítico: la seguridad de los datos. En la web, la caché de Firestore no se borra automáticamente cuando el usuario cierra la sesión. Aunque existe la función clearPersistence(), Firebase advierte que no es una herramienta de seguridad robusta y que no garantiza que los datos sean irrecuperables. Por eso, si manejas información muy sensible, lo más recomendable es no activar la persistencia en dispositivos que no sean totalmente seguros.

Diferencias con Realtime Database

No hay que confundir Firestore con Realtime Database. En esta última, la persistencia de disco también permite mantener el estado y encolar escrituras, pero funciona de forma distinta. Por ejemplo, maneja una caché predeterminada de 10 MB y utiliza un sistema de sincronización basado en referencias activas.

Firebase Performance
Artículo relacionado:
Guía Completa sobre el Análisis del Comportamiento del Usuario con Firebase Analytics

Una característica potente de Realtime Database es la función onDisconnect, que permite ejecutar operaciones en el servidor justo cuando el cliente pierde la conexión. Además, ofrece la ruta especial /.info/connected para que la app sepa en tiempo real si está conectada o no, algo fundamental para sistemas de presencia (saber quién está online). Comparte la información para que más usuarios conozcan del tema.


Añadir como fuente preferida en Google