Definir a vida útil de uma mensagem

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.