FCM distribue généralement les messages immédiatement après leur envoi. Toutefois, ce n'est pas toujours possible. Par exemple, l'appareil peut être indisponible ou FCM peut intentionnellement retarder les messages pour empêcher une application de consommer des ressources excessives et d'affecter négativement 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 pour un appel entrant ou une invitation à un événement.
Sur Android et 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 période maximale pendant laquelle FCM stocke le message et tente de le distribuer. Par défaut, les demandes 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 Apple sur l'envoi de requêtes de notification à APNs.
Voici quelques utilisations possibles de cette fonctionnalité :
- Appels vidéo entrants
- Événements d'expiration des invitations
- É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 la limitation des messages réductibles aux messages dont la 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 permet d'obtenir la meilleure latence pour l'envoi de messages de notification.
Voici un exemple de requête incluant 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 en retour, cela ne signifie pas que le message a déjà été distribué à l'appareil. Cela signifie qu'il a été accepté pour la livraison. Le moment où le message est remis 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 le 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 le remplace. Toutefois, si la clé de réduction n'est pas définie, les messages anciens et nouveaux sont stockés pour une diffusion 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 envoie tous les messages en attente à l'appareil. Si l'appareil n'est plus jamais connecté, le message finit par expirer et est supprimé du stockage FCM. Le délai avant expiration par défaut est de quatre semaines, sauf si l'indicateur ttl
est défini. Si l'application a été désinstallée lorsque FCM tente d'envoyer un message à l'appareil, FCM supprime immédiatement ce message et invalide le jeton d'enregistrement. Toute tentative ultérieure d'envoi d'un message à cet appareil générera 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 le supprime 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 diffusion 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 sur les impressions pour les applications Android.