FCM distribue généralement les messages immédiatement après leur envoi. Toutefois, cela n'est pas toujours possible. Par exemple, l'appareil peut être indisponible ou FCM peut retarder intentionnellement les messages pour éviter qu'une application ne consomme trop de ressources et n'affecte l'autonomie de la batterie.
Dans ce cas, FCM stocke le message et le distribue dès que possible. Bien que cela ne pose pas de problème dans la plupart des cas, certaines applications nécessitent l'envoi de notifications sans délai. Par exemple, une notification d'appel entrant ou une invitation à un événement.
Sur Android et sur le Web, vous pouvez spécifier la durée de vie maximale d'un message. La valeur doit être une durée comprise entre 0 et 2 419 200 secondes (28 jours). Elle correspond à la durée maximale pendant laquelle FCM stocke et tente de distribuer le message. Par défaut, les requêtes qui ne contiennent pas ce champ durent au maximum quatre semaines.
Sur iOS, vous pouvez définir l'en-tête apns-expiration dans l'objet ApnsConfig. Pour en savoir plus, consultez la documentation d'Apple sur l'envoi de demandes de notification aux APN.
Voici quelques exemples d'utilisation de cette fonctionnalité :
- Appels entrants de chat vidéo
- Événements d'invitation arrivant à expiration
- Événements d'agenda
Un autre avantage de la spécification de la durée de vie d'un message est que FCM n'applique pas de limitation aux messages réductibles dont la valeur de durée de vie est de 0 seconde. N'oubliez pas qu'une valeur ttl de 0 signifie que les messages qui ne peuvent pas être distribués immédiatement sont supprimés. Toutefois, comme ces messages ne sont jamais stockés, cela offre la meilleure latence pour l'envoi de messages de notification.
Voici un exemple de requête incluant un 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"
}
}
}
}
Durée de vie d'un message
Lorsqu'un serveur d'application publie un message sur FCM et reçoit un ID de message, cela ne signifie pas que le message a déjà été envoyé à l'appareil. Cela signifie qu'elle a été acceptée pour diffusion. Le moment de la distribution du message dépend de nombreux facteurs.
Si l'appareil est connecté, mais en mode Sommeil, un message de faible priorité est stocké par FCM jusqu'à ce que l'appareil quitte le mode Sommeil. Si collapse_key est défini et qu'un message existant avec la même clé de réduction et le même jeton d'enregistrement est en attente de distribution, l'ancien message est supprimé et le nouveau message prend sa place. Toutefois, si la clé de réduction n'est pas définie, les nouveaux et les anciens messages sont stockés pour une distribution ultérieure.
Si l'appareil n'est pas connecté à FCM, le message est stocké jusqu'à ce qu'une connexion soit établie. Lorsqu'une connexion est établie, FCM transmet tous les messages en attente à l'appareil. Si l'appareil ne se reconnecte jamais, le message finit par expirer et est supprimé de l'espace de stockage FCM. Le délai avant expiration par défaut est de quatre semaines, sauf si l'option ttl est définie. Si l'application a été désinstallée lorsque FCM tente de transmettre un message à l'appareil, FCM supprime immédiatement ce message et invalide le jeton d'enregistrement. Les tentatives ultérieures d'envoi d'un message à cet appareil entraînent une erreur NotRegistered.
Pour les appareils Android, si l'appareil ne s'est pas connecté à FCM depuis plus d'un mois, FCM accepte toujours le message, mais l'ignore immédiatement. Si l'appareil se connecte dans les quatre semaines suivant le dernier message de données que vous lui avez envoyé, votre application cliente reçoit le rappel onDeletedMessages().
Pour obtenir plus d'informations sur la distribution des messages sur les plates-formes Android ou Apple, vous pouvez utiliser le tableau de bord de reporting FCM, qui enregistre le nombre de messages envoyés et ouverts sur les appareils Apple et Android, ainsi que les données d'impressions pour les applications Android.