Invio di messaggi upstream su Android

Se i vostri attrezzi application server l' XMPP Connessione server di protocollo, può ricevere messaggi a monte 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 di ricezione applicazione nel formato SENDER_ID@fcm.googleapis.com .
  • Un ID messaggio che dovrebbe essere unico per ogni ID del 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 dell'app, aggiungendo alcune informazioni aggiuntive sul dispositivo e sull'app di invio.

Invia un messaggio upstream da un'app client Android

La tua app Android in grado di inviare un messaggio a monte utilizzando FirebaseMessaging.send :

Giava

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());

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")
})

Gestire i callback dei messaggi upstream

Con FirebaseMessaging , è possibile implementare i callback onMessageSent e onSendError per controllare lo stato dei messaggi a monte. In casi di errore, onSendError restituisce un SendException con un codice di errore. Ad esempio, se i tentativi client per inviare più messaggi dopo che il limite di 20 messaggio viene raggiunto, restituisce SendException#ERROR_TOO_MANY_MESSAGES .

Nei casi in cui il dispositivo è offline o il servizio FCM non è disponibile per inoltrare messaggi upstream al server, le istanze dell'app client Android possono accumulare un massimo di 20 messaggi in sospeso. Se tali messaggi scadono prima di FCM possa inviare correttamente, onSendError ritorna SendException#ERROR_TTL_EXCEEDED .

Per ottimizzare l'utilizzo della rete, FCM lotti risposte a onMessageSent e onSendError , in modo che il riconoscimento non può essere immediata per ogni messaggio.

Ricevi 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 le category e from campi e quindi invia una stanza come la seguente al server 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, il server dell'app 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 dell'app.

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

Vedere la connessione del server di riferimento XMPP per ulteriori informazioni sulla sintassi messaggio a monte.