O FCM geralmente entrega mensagens imediatamente após elas terem sido enviadas. No entanto, isso nem sempre é possível. Por exemplo, o dispositivo pode estar indisponível ou o FCM pode atrasar mensagens intencionalmente para evitar que um app consuma recursos excessivos, o que prejudica a duração da bateria.
Nesses casos, o FCM armazena a mensagem e a entrega o quanto antes. Embora isso não seja um problema na maioria dos casos, em alguns apps é necessário que as notificações sejam enviadas sem atraso. Por exemplo, uma notificação de uma chamada recebida ou um convite para um evento.
No Android e na Web, é possível especificar a vida útil máxima de uma mensagem. O valor precisa ter a duração de 0 a 2.419.200 segundos (28 dias) e corresponde ao período máximo pelo qual o FCM armazena e tenta entregar a mensagem. Por padrão, as solicitações que não tiverem esse campo preenchido duram um período máximo de quatro semanas.
No iOS, é possível definir o cabeçalho apns-expiration
no objeto
ApnsConfig. Para mais detalhes, consulte a documentação da Apple sobre Como enviar
solicitações de notificação para
APNs.
Veja aqui alguns usos possíveis para este recurso:
- Chamadas de bate-papo por vídeo recebidas
- Eventos de convite expirando
- Eventos da agenda
Outra vantagem de especificar a vida útil de uma mensagem é que
o FCM não aplica o limite de mensagens colapsáveis a mensagens com um
valor de vida útil de 0 segundos. Tenha em mente que um valor ttl
de
0 significa que mensagens que não podem ser entregues imediatamente são descartadas. No entanto,
como essas mensagens nunca são armazenadas, isso gera a melhor latência
para o envio de mensagens de notificação.
Veja um exemplo de solicitação que inclui 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"
}
}
}
}
Vida útil de uma mensagem
Quando um servidor do app publica uma mensagem para o FCM e recebe um ID de mensagem de volta, isso não significa que a mensagem já foi entregue ao dispositivo. Na verdade, significa que ela foi aceita para a entrega. A entrega da mensagem depende de vários fatores.
Se o dispositivo estiver conectado, mas no modo Soneca, uma mensagem
de prioridade baixa é armazenada pelo FCM até o dispositivo sair desse modo. Se o collapse_key
estiver definido e
houver uma mensagem com a mesma chave de
recolhimento e
token de registro aguardando entrega, a mensagem antiga será descartada e a
nova mensagem tomará o lugar dela. No entanto, se a chave
de recolhimento não estiver definida, as mensagens novas e antigas serão armazenadas para entrega posterior.
Se o dispositivo não estiver conectado ao FCM, a mensagem será armazenada até que uma
conexão seja estabelecida. Quando uma
conexão é estabelecida, o FCM entrega todas as mensagens pendentes ao
dispositivo. Se o dispositivo não se reconectar
mais, a mensagem vai expirar e será descartada do armazenamento do FCM. O tempo limite padrão é de quatro semanas,
a menos que a flag ttl
esteja definida. Se o
app tiver sido desinstalado quando o FCM tentar entregar uma mensagem ao
dispositivo, o FCM vai descartar a mensagem imediatamente e invalidar o
token de registro. As próximas tentativas de enviar uma mensagem
a esse dispositivo resultarão em um erro NotRegistered
.
Para dispositivos Android, se o dispositivo não se conectar ao FCM por mais de um mês, o FCM ainda vai aceitar a mensagem, mas vai descartá-la imediatamente. Se o dispositivo se conectar dentro de quatro semanas a partir da última mensagem de dados enviada a ele, o
cliente receberá a callback onDeletedMessages()
.
Para mais informações sobre a entrega de mensagens em plataformas Android ou Apple, use o painel de relatórios do FCM, que registra o número de mensagens enviadas e abertas em dispositivos Apple e Android, além de dados de impressões para apps Android.