Si votre serveur d'applications implémente le protocole XMPP Connection Server , il peut recevoir des messages en amont de l'appareil d'un utilisateur vers le cloud. Pour lancer un message en amont, l'application cliente envoie une requête contenant les éléments suivants :
- L'adresse du serveur d'application de réception au format
SENDER_ID@fcm.googleapis.com
. - Un ID de message qui doit être unique pour chaque ID d'expéditeur .
- Les données de message comprenant les paires clé-valeur de la charge utile du message.
Lorsqu'il reçoit ces données, FCM crée une strophe XMPP à envoyer au serveur d'applications, en ajoutant des informations supplémentaires sur l'appareil et l'application d'envoi.
Envoyer un message en amont à partir d'une application client Android
Votre application Android peut envoyer un message en amont à l'aide de FirebaseMessaging.send :
Kotlin+KTX
val fm = Firebase.messaging fm.send( remoteMessage("$SENDER_ID@fcm.googleapis.com") { setMessageId(messageId.toString()) addData("my_message", "Hello World") addData("my_action", "SAY_HELLO") }, )
Java
FirebaseMessaging fm = FirebaseMessaging.getInstance(); fm.send(new RemoteMessage.Builder(SENDER_ID + "@fcm.googleapis.com") .setMessageId(Integer.toString(messageId)) .addData("my_message", "Hello World") .addData("my_action","SAY_HELLO") .build());
Gérer les rappels de messages en amont
Avec FirebaseMessaging
, vous pouvez implémenter les rappels onMessageSent
et onSendError
pour vérifier l'état des messages en amont. En cas d'erreur, onSendError
renvoie une SendException
avec un code d'erreur. Par exemple, si le client tente d'envoyer plus de messages après que la limite de 20 messages est atteinte, il renvoie SendException#ERROR_TOO_MANY_MESSAGES
.
Si l'appareil est hors ligne ou si le service FCM n'est pas disponible pour transférer les messages en amont vers votre serveur, les instances d'application client Android peuvent accumuler un maximum de 20 messages en attente. Si de tels messages expirent avant que FCM puisse les envoyer avec succès, onSendError
renvoie SendException#ERROR_TTL_EXCEEDED
.
Pour optimiser l'utilisation du réseau, FCM regroupe les réponses à onMessageSent
et onSendError
, de sorte que l'accusé de réception peut ne pas être immédiat pour chaque message.
Recevoir des messages XMPP sur le serveur d'applications
Lorsque FCM reçoit un appel de messagerie en amont d'une application cliente, il génère la strophe XMPP nécessaire pour envoyer le message en amont. FCM ajoute la category
et les champs from
, puis envoie une strophe comme celle-ci au serveur d'application :
<message id=""> <gcm xmlns="google:mobile:data"> { "category":"com.example.yourapp", // to know which app sent it "data": { "hello":"world", }, "message_id":"m-123", "from":"REGID" } </gcm> </message>
Envoi d'un message ACK
En réponse à un message en amont comme ci-dessus, le serveur d'application doit utiliser la même connexion pour envoyer un message ACK contenant l'ID de message unique. Si FCM ne reçoit pas d'accusé de réception, il peut réessayer d'envoyer le message au serveur d'application.
<message id=""> <gcm xmlns="google:mobile:data"> { "to":"REGID", "message_id":"m-123" "message_type":"ack" } </gcm> </message>
Consultez la Référence du serveur de connexion XMPP pour plus d'informations sur la syntaxe des messages en amont.