Envoyer des messages en amont sur Android

Si votre serveur d'application 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:

  • Adresse du serveur d'application destinataire au format SENDER_ID@fcm.googleapis.com.
  • ID de message qui doit être unique pour chaque ID d'expéditeur.
  • Données du 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'application, en ajoutant des informations supplémentaires sur l'appareil et l'application d'envoi.

Envoyer un message en amont à partir d'une application cliente 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 un SendException avec un code d'erreur. Par exemple, si le client tente d'envoyer plus de messages après avoir atteint la limite de 20 messages, il renvoie SendException#ERROR_TOO_MANY_MESSAGES.

Si l'appareil est hors connexion ou que le service FCM ne permet pas de transférer les messages en amont vers votre serveur, les instances de l'application cliente Android peuvent accumuler jusqu'à 20 messages en attente. Si ces messages expirent avant que FCM ne puisse les envoyer, onSendError renvoie SendException#ERROR_TTL_EXCEEDED.

Pour optimiser l'utilisation du réseau, FCM regroupe les réponses à onMessageSent et onSendError. Il est donc possible que la confirmation ne soit pas immédiate pour chaque message.

Recevoir des messages XMPP sur le serveur de l'application

Lorsque FCM reçoit un appel de messagerie en amont à partir d'une application cliente, il génère la strophe XMPP nécessaire pour envoyer le message en amont. FCM ajoute les champs category et from, puis envoie une strophe semblable à 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>

Envoyer un message ACK

En réponse à un message en amont comme celui-ci, 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 (ACK), il peut réessayer d'envoyer le message au serveur d'applications.

<message id="">
  <gcm xmlns="google:mobile:data">
  {
      "to":"REGID",
      "message_id":"m-123"
      "message_type":"ack"
  }
  </gcm>
</message>

Pour en savoir plus sur la syntaxe des messages en amont, consultez la documentation de référence du serveur de connexion XMPP.