Invio di messaggi in upstream su Android

Se il server dell'app implementa protocollo XMPP Connection Server, può ricevere messaggi 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 destinazione nel formato SENDER_ID@fcm.googleapis.com.
  • Un ID messaggio che deve essere univoco per ogni ID mittente.
  • I 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 delle app, aggiungendo alcune informazioni aggiuntive sul dispositivo e sull'app di invio.

Invia un messaggio upstream da un'app client Android

La tua app per Android può inviare un messaggio 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 a monte

Con FirebaseMessaging, puoi implementare richiama onMessageSent e onSendError per controllare lo stato dell'upstream messaggi. In caso di errore, onSendError restituisce un SendException con un codice di errore. Ad esempio, se il client tenta di invia altri messaggi una volta raggiunto il limite di 20 messaggi, viene restituito SendException#ERROR_TOO_MANY_MESSAGES.

Se il dispositivo è offline o il servizio FCM non è disponibile per forward i messaggi upstream al tuo server, le istanze dell'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.

Ricevi messaggi XMPP sul server delle app

Quando FCM riceve una chiamata di messaggistica upstream da un'app client, genera la stanza XMPP necessaria per inviare il messaggio upstream. FCM aggiunge i campi category e from, poi invia un messaggio di errore stanza come la seguente al server delle 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 quello illustrato sopra, il server di app devono utilizzare la stessa connessione per inviare un messaggio ACK contenente ID messaggio. 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 al server di connessione XMPP.