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.