Invio di messaggi in upstream su Android

Se il server dell'app implementa il protocollo XMPP Connection Server, può ricevere messaggi in upstream dal dispositivo di un utente al cloud. Per avviare un messaggio upstream, l'app client invia una richiesta contenente quanto segue:

  • L'indirizzo del server dell'app di ricezione nel formato SENDER_ID@fcm.googleapis.com.
  • Un ID messaggio che deve essere univoco per ogni ID mittente.
  • Dati del messaggio che comprendono le coppie chiave-valore del payload del messaggio.

Quando riceve questi dati, FCM crea una stanza XMPP da inviare al server di app, aggiungendo alcune informazioni aggiuntive sul dispositivo e sull'app di invio.

Inviare un messaggio in upstream da un'app client Android

L'app per Android può inviare un messaggio in upstream utilizzando 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());

Gestire i callback dei messaggi upstream

Con FirebaseMessaging, puoi implementare i callback onMessageSent e onSendError per controllare lo stato dei messaggi a monte. In caso di errore, onSendError restituisce un SendException con un codice di errore. Ad esempio, se il client tenta di inviare più messaggi dopo aver raggiunto il limite di 20 messaggi, restituisce SendException#ERROR_TOO_MANY_MESSAGES.

Nei casi in cui il dispositivo sia offline o il servizio FCM non sia disponibile per inoltrare i messaggi upstream al server, le istanze di app client Android possono accumulare un massimo di 20 messaggi in attesa. Se questi messaggi scadono prima che FCM possa inviarli correttamente, onSendError restituisce SendException#ERROR_TTL_EXCEEDED.

Per ottimizzare l'utilizzo della rete, FCM raggruppa le risposte in onMessageSent e onSendError, quindi la conferma potrebbe non essere immediata per ogni messaggio.

Ricevere messaggi XMPP sul server dell'app

Quando FCM riceve una chiamata di messaggistica upstream da un'app client, genera la stanza XMPP necessaria per l'invio del messaggio upstream. FCM aggiunge i campi category e from, quindi invia una stanza come la seguente al server di app:

<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>

Invio di un messaggio ACK

In risposta a un messaggio upstream come il precedente, l'app server deve utilizzare la stessa connessione per inviare un messaggio ACK contenente l'ID messaggio univoco. Se FCM non riceve un ACK, può riprovare a inviare il messaggio al server delle app.

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

Per ulteriori informazioni sulla sintassi dei messaggi a monte, consulta il riferimento del server di connessione XMPP.