En esta guía, se describe cómo configurar Firebase Cloud Messaging en tus apps cliente web y para dispositivos móviles para que puedas recibir mensajes de forma confiable.
Para recibir mensajes, puedes usar un servicio que extienda FirebaseMessagingService
.
El servicio debe anular las devoluciones de llamada onMessageReceived
y onDeletedMessages
. Para ver un ejemplo completo, consulta la muestra de inicio rápido de
Firebase Cloud Messaging.
onMessageReceived
se proporciona para la mayoría de los tipos de mensajes, con las siguientes excepciones:
Mensajes de notificación enviados cuando la app está en segundo plano. En este caso, la notificación se entrega a la bandeja del sistema del dispositivo. Cuando un usuario presiona una notificación, abre el selector de aplicaciones de forma predeterminada.
Mensajes con una notificación y carga útil de datos cuando se reciben en segundo plano. En este caso, la notificación se entrega a la bandeja del sistema del dispositivo, y la carga útil de datos se entrega en los adicionales del intent de tu actividad iniciadora.
Resumen:
Estado de la app | Notificación | Datos | Ambos |
---|---|---|---|
Primer plano | onMessageReceived |
onMessageReceived |
onMessageReceived |
Segundo plano | Bandeja del sistema | onMessageReceived |
Notificación: Bandeja del sistema Datos: En extras del intent |
Para obtener más información acerca de los tipos de mensajes, consulta Mensajes de notificación y de datos.
La devolución de llamada onMessageReceived
tiene un período de ejecución corto. Muchos factores pueden afectar la duración de este período, incluidos los retrasos del SO, el tiempo de inicio de la app, el subproceso principal que bloquearon otras operaciones o las llamadas a onMessageReceived
previas que demoran demasiado.
Por este motivo, debes evitar las tareas de larga duración (como recuperar imágenes de un servidor para mostrarlas en una notificación) en onMessageReceived
y, en su lugar, programar una tarea con WorkManager
para controlar cualquier tarea que pueda tardar más de un par de segundos en completarse. Para obtener más información sobre la prioridad de los mensajes y cómo afecta el procesamiento, consulta Procesamiento de mensajes de prioridad alta y normal.
Edita el manifiesto de la app
Para usar FirebaseMessagingService
, deberás agregar lo siguiente en el manifiesto de la app:
<service
android:name=".java.MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
Se recomienda establecer valores predeterminados para personalizar el aspecto de las notificaciones. Puedes especificar un ícono y un color predeterminados y personalizados que se aplican cada vez que no se establecen valores equivalentes en la carga útil de notificación.
Agrega estas líneas en la etiqueta application
para establecer el ícono predeterminado y el color personalizados:
<!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
See README(https://goo.gl/l4GJaQ) for more. -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_stat_ic_notification" />
<!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
notification message. See README(https://goo.gl/6BKBk7) for more. -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/colorAccent" />
Android muestra y usa el ícono predeterminado personalizado para lo siguiente:
- Todos los mensajes de notificación enviados desde el Compositor de Notifications.
- Todos los mensajes de notificación que no establecen el ícono de manera explícita en la carga útil de la notificación.
Si no se establece un ícono predeterminado personalizado ni un ícono en la carga útil de la notificación, Android muestra el ícono de la aplicación en blanco.
Anula onMessageReceived
Puedes anular el método FirebaseMessagingService.onMessageReceived
para realizar acciones según el objeto RemoteMessage recibido y obtener los datos del mensaje:
Kotlin
override fun onMessageReceived(remoteMessage: RemoteMessage) { // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: ${remoteMessage.from}") // Check if message contains a data payload. if (remoteMessage.data.isNotEmpty()) { Log.d(TAG, "Message data payload: ${remoteMessage.data}") // Check if data needs to be processed by long running job if (needsToBeScheduled()) { // For long-running tasks (10 seconds or more) use WorkManager. scheduleJob() } else { // Handle message within 10 seconds handleNow() } } // Check if message contains a notification payload. remoteMessage.notification?.let { Log.d(TAG, "Message Notification Body: ${it.body}") } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. }
Java
@Override public void onMessageReceived(RemoteMessage remoteMessage) { // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: " + remoteMessage.getFrom()); // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); if (/* Check if data needs to be processed by long running job */ true) { // For long-running tasks (10 seconds or more) use WorkManager. scheduleJob(); } else { // Handle message within 10 seconds handleNow(); } } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. }
Anula onDeletedMessages
En algunas situaciones, es posible que FCM no envíe un mensaje. Esto ocurre cuando hay muchos
mensajes (más de 100) pendientes
para tu app en un dispositivo específico al momento de conectarse o si el dispositivo no se conecta a
FCM durante más de un mes. En estos casos, es posible que recibas una devolución de llamada a FirebaseMessagingService.onDeletedMessages()
. Cuando la instancia de la app reciba esta devolución de llamada, debería ejecutar una sincronización completa con tu servidor de apps. Si no enviaste un mensaje a la app en ese dispositivo en las últimas 4 semanas, FCM no llamará a onDeletedMessages()
.
Maneja mensajes de notificación en una app en segundo plano
Cuando tu app está en segundo plano, Android dirige los mensajes de notificación a la bandeja del sistema. Cuando un usuario presiona una notificación, se abre el selector de aplicaciones de forma predeterminada.
Esto incluye los mensajes que contienen una notificación y carga útil de datos (y todos los mensajes que se envíen desde la consola de Notifications). En estos casos, la notificación se entrega a la bandeja del sistema del dispositivo, y la carga de datos útil se entrega en los adicionales del intent de tu actividad iniciadora.
Para obtener información sobre la entrega de mensajes en tu app, consulta el
panel de informes de FCM,
en el que se registra la cantidad de mensajes que se enviaron y abrieron en dispositivos Apple y
Android, junto con datos de “impresiones” (las notificaciones que ven los usuarios) de las
apps para Android.