Por lo general, FCM entrega los mensajes apenas se envían. Sin embargo, esto no siempre es posible. Por ejemplo, es posible que el dispositivo no esté disponible o que FCM retrase los mensajes de manera intencional para evitar que una app consuma recursos en exceso y perjudique la duración de la batería.
En estos casos, FCM almacena el mensaje y lo entrega lo antes posible. Si bien esto es correcto en la mayoría de los casos, hay algunas apps que requieren que las notificaciones se envíen sin demora. Por ejemplo, una notificación de una llamada entrante o una invitación a un evento.
En Android y Web puedes especificar la duración máxima de un mensaje. El valor debe ser una duración de entre 0 y 2,419,200 segundos (28 días). Esto indicará el período máximo durante el cual FCM almacenará y tratará de entregar el mensaje. De forma predeterminada, las solicitudes que no contienen este campo duran un período máximo de cuatro semanas.
En iOS, puedes establecer el encabezado
apns-expiration
en el objeto
ApnsConfig. Para obtener más detalles, consulta la documentación de Apple sobre el envío de solicitudes
de notificación a
APNs.
A continuación, se muestran algunos usos posibles para esta función:
- Llamadas entrantes de chat de video
- Invitaciones a eventos vencidas
- Eventos del calendario
Otra ventaja de especificar la duración de un mensaje es que
FCM no aplica la regulación de mensajes contraíbles a los mensajes con un
valor de tiempo de actividad de 0 segundos. Ten en cuenta que un valor ttl
de
0 significa que los mensajes que no se pueden entregar de inmediato se descartan. Sin embargo,
dado que estos mensajes nunca se almacenan, esto proporciona la mejor latencia para enviar mensajes
de notificación.
A continuación, se muestra un ejemplo de una solicitud que incluye el TTL:
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"data":{
"Nick" : "Mario",
"body" : "great match!",
"Room" : "PortugalVSDenmark"
},
"apns":{
"headers":{
"apns-expiration":"1604750400"
}
},
"android":{
"ttl":"4500s"
},
"webpush":{
"headers":{
"TTL":"4500"
}
}
}
}
Duración de un mensaje
Cuando un servidor de apps publica un mensaje en FCM y recibe un ID de mensaje de vuelta, no significa que el mensaje ya se entregó al dispositivo. Más bien, significa que se aceptó para la entrega. El momento en que se entrega el mensaje depende de muchos factores.
Si el dispositivo está conectado, pero en modo Descanso, FCM almacena un mensaje con
prioridad baja hasta que el dispositivo sale del modo Descanso. Si se configura collapse_key
y hay un mensaje existente con la misma clave de contracción y el mismo token de registro a la espera de ser entregado, se descarta el mensaje anterior y el mensaje nuevo ocupa su lugar. Sin embargo, si no se configura la clave de contracción,
tanto el mensaje nuevo como el antiguo se almacenan para su futuro envío.
Si el dispositivo no está conectado a FCM, el mensaje se almacena hasta que se
establece una conexión. Cuando se establece una conexión, FCM entrega
todos los mensajes pendientes al dispositivo. Si el dispositivo nunca se vuelve a conectar, el tiempo de espera del mensaje finalmente se agota y se descarta del almacenamiento
de FCM. El tiempo de espera predeterminado es de cuatro semanas, a menos que se configure la marca ttl
. Si la
app se desinstaló cuando FCM intenta entregar un mensaje al dispositivo, FCM
descarta el mensaje de inmediato y anula la validez del token
de registro. Los intentos posteriores de enviar un mensaje a ese dispositivo darán como
resultado un error NotRegistered
.
En el caso de los dispositivos Android, si el dispositivo no se conecta
a FCM durante más de un mes, FCM acepta el mensaje de todas formas, pero lo descarta de
inmediato. Si el dispositivo se conecta en un plazo de cuatro semanas desde el último mensaje de datos que le enviaste,
tu cliente recibe la devolución de llamada
onDeletedMessages()
.
Para obtener más información sobre la entrega de mensajes en plataformas de Apple o Android, puedes usar 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 para las apps para Android.