Control de mensajes de FCM Android
jueves, 11 de octubre de 2018

Jingyu Shi
Representante de desarrolladores
En la entrada del blog “Notificar a tus usuarios con FCM”, compartimos información sobre el uso de FCM en versiones modernas de Android en relación con todas las características de administración de energía. En línea con esto, observemos el flujo de trabajo común de los mensajes de FCM (mensajes de notificación y mensajes de datos) y la manera de controlar esos mensajes en tu código.
Mensajes de notificación

Cuando usas un mensaje de notificación de FCM, el sistema controla la manera en que se muestra la notificación en representación de tu app cuando esta se encuentra en segundo plano. Cuando tu app está en segundo plano, el mensaje de notificación de FCM se entrega al controlador
onMessageReceived()
y puedes manejarlo publicando una notificación, si es necesario, actualizando el contenido de la app con los datos de la carga útil de FCM (4 KB como máx.) u obtener contenido del servidor de la app.
Flujo de trabajo
Un servidor de apps envía un mensaje de notificación (o un mensaje de notificación con una carga útil de datos) a un usuario:- El servidor de apps envía un mensaje de notificación.
- Los mensajes de notificación son altamente prioritarios de forma predeterminada y contraíbles; el siguiente mensaje reemplazará el mensaje actual si aún no se ha enviado.
- El mensaje de FCM se envía a la app cliente.
- Cuando tu app está en primer plano
- El desarrollador debe manejar el mensaje de notificación en el controlador.
- Publica una notificación o actualiza el contenido de la app en el callback de FCM.
- Cuando tu app está en segundo plano
- La notificación se envía a la bandeja del sistema.
- Si se publica una notificación, tu usuario puede tocar la notificación y abrir tu app. Luego puedes usar los datos de
getIntent()
para actualizar el contenido de la app, si es necesario.
Ejemplo de código:
class SimpleFirebaseMessagingService : FirebaseMessagingService() { private val TAG = "spFirebaseMsgService" override fun onMessageReceived(remoteMessage: RemoteMessage) { // when App is in foreground, notification message: if (remoteMessage.notification != null) { // post notification if needed updateContent(remoteMessage.notification) } // process data payload } private fun updateContent(notification: RemoteMessage.Notification) {} }
SimpleFirebaseMessagingService.kt
Mensaje de datos
Debes usar mensajes de datos si necesitas controlar la notificación en la app cliente, ya sea para personalizar la notificación o para desencriptar los datos de carga útil recibidos.De forma predeterminada, un mensaje de datos tiene prioridad normal, lo cual significa que, de forma predeterminada, se enviará en lotes al siguiente período de mantenimiento cuando el dispositivo esté en Descanso.
Manejar mensajes
Al enviar mensajes de datos, debes manejarlos en el callback deonMessageReceived()
de la app cliente. El enfoque sugerido en el controlador es el siguiente:
- Cuando necesites notificar al usuario, primero publica una notificación.
- Actualiza el contenido de la app con datos de carga útil.
- Si es necesario, programa la obtención de datos adicionales del servidor de la app.
Flujo de trabajo
Un servidor de apps envía mensajes de datos para notificar a los usuarios con un mensaje de FCM completamente encriptado:
- El servidor de apps envía un mensaje de datos al servidor de FCM
- El mensaje de datos debe incluir todos los datos necesarios para una notificación en la carga útil.
- Cuando se recibe el mensaje en el cliente de la app de FCM, tienes un período breve* para administrar el mensaje y publicar una notificación.
- Administra la desencriptación de la carga útil y la notificación personalizada en el callback
onMessageReceived()
, y luego publica de inmediato una notificación para el usuario.- Ten en cuenta que FCM NO garantiza el orden de la entrega. Los desarrolladores deben controlarlo cuando los mensajes se envían desordenados; cuando envías mensajes no contráctiles, puedes realizar un seguimiento del orden con un ID de secuencia de mensaje y dejar de notificar al usuario hasta que se reciban todos los mensajes o dejes de esperar en caso de que los mensajes de TTL previos caduquen.
- Usa los datos de carga útil para actualizar el contenido del cliente y almacenar los datos localmente.
- Si necesitas datos adicionales que superen el límite de carga útil de FCM de 4 KB, programa un trabajo o usa WorkManager para obtener los datos, pero no bloquees la visualización de una notificación inicial sobre esto.
- WorkManager se recomienda cuando es estable.
- Usa JobScheduler.
- Si necesitas actualizar la notificación con los datos que obtuviste, actualízala si todavía está activa.
- Administra la desencriptación de la carga útil y la notificación personalizada en el callback
- El usuario abre la app.
- Si el contenido de la app no está actualizado, comprueba si se completaron las tareas programadas en 2.3 y actualiza el contenido de tu app de forma correspondiente.
Ejemplo de código:
class SimpleFirebaseMessagingService : FirebaseMessagingService() { private val TAG = "spFirebaseMsgService" override fun onMessageReceived(remoteMessage: RemoteMessage) { // Use data payload to create a notification if (remoteMessage.data.isNotEmpty()) { // step 2.1: decrypt payload val notificationMessage = decryptPayload(remoteMessage.data) // step 2.1: display notification immediately sendNotification(notificationMessage) // step 2.2: update app content with payload data updateContent(remoteMessage.data) // Optional step 2.3: if needed, fetch data from app server /* if additional data is needed or payload is bigger than 4KB, App server can send a flag to notify client*/ if (remoteMessage.data["url"] != null) { scheduleJob() // use WorkManager when it's stable } } // process notification payload when app in foreground... } private fun decryptPayload(dataPayload: Map<String, String>): String { return "decrypted message" } private fun sendNotification(notificationMessage: String) {} private fun updateContent(dataPayload: Map<String, String>) {} private fun scheduleWork() { // it's recommended to use WorkManager when it's stable, use JobScheduler // on background work complete, update the notification if still active } }
SimpleFirebaseMessagingService.kt
FCM en versiones modernas de Android
Android introdujo muchas características para mejorar la potencia en versiones recientes, por lo que debes asegurarte de revisar y probar tus casos de uso de FCM con estas características. Puedes obtener más información sobre las características de Android Power y su funcionamiento con FCM en esta entrada de blog.Si todavía no usas FCM, llegó el momento de realizar una mejora. La biblioteca C2DM quedó obsoleta oficialmente en 2012 y se dio de baja por completo en 2015, por lo que ya no es compatible con versiones modernas de Android. En abril de 2018, también anunciamos que el servidor de Google Cloud Messaging (GCM) y las API de cliente quedaron obsoletos, y se eliminarán el 11 de abril de 2019. Puedes obtener más información sobre el anuncio y las guías de migración en esta entrada de blog.
Para aprovechar por completo la funcionalidad y las características que FCM y Android ofrecen, te recomendamos usar FCM hoy mismo. Para comenzar, consulta la documentación de Firebase Cloud Messaging.