Como tenho certeza de que as mensagens enviadas via FCM serão entregues?

Olá pessoal tudo bem? Recentemente estou fazendo uso da ferramenta do Google [Firebase Cloud Messagin] (https://firebase.google.com/docs/cloud-messaging/) em um projeto Android. Em cenários que a app Android está conectada, tudo funciona normalmente, porém, estou realizando um projeto que envolve sincronização de dados tanto para App Android quanto para um Serviço externo, por exemplo, um Web Service. Entretanto, nesse tópico de sincronização, existe situações em que a App Android pode ficar offline, ou seja, não irá receber as notificações do FCM. Porém, quando fica online novamente, de alguma forma, o FCM envia as notificações novamente… Embora esse seja um cenário “feliz”, provavelmente deve ter alguma exceção, como por exemplo, a mensagem não chegar, ou então, demorar muito e não fazer mais sentido assim que chegar… Em outras palavras, a minha dúvida atual é, existem pontos problemáticos (não entrega, demora pra entregar, falha em geral) para esse tipo de caso (modo offline) ou similar? Se sim, quais são e como podemos evitá-los?

Os serviços de push notification garantem que as mensagens chegarão ao destino, mas não garantem que a ordem de envio será preservada. Ou seja, a mensagem 2 pode chegar antes da mensagem 1.

Caso a app esteja offline, a mensagem fica numa fila de espera para ser enviada assim que o aparelho ficar online novamente. Porém, pode ocorrer do aparelho ficar online muito tempo após o envio da mensagem. Nesse caso, o servidor de mensageria olhará uma propriedade da mensagem chamada de time to live (TTL), caso a mensagem esteja na fila há um tempo maior que seu TTL, ela é destruída pelo servidor. Isso é importante para que não existam mensagens “zumbis”, que nunca serão entregues.

Geralmente, não devemos nos preocupar com demora na entrega, pois a ideia do FCM (evolução do GCM, filho do C2DM) é mandar apenas um “ping” (ou algo semelhante) para a app. Logo, o uso do FCM para envio de mensagens mais complexas ou que precisem de certa urgência é desaconselhado. Nesse caso, o ideal é fazer sua própria estrutura de mensageria (com sockets, talvez).