Se il tuo server app implementa il protocollo XMPP Connection Server , può ricevere messaggi upstream dal dispositivo di un utente al cloud. Per avviare un messaggio a monte, l'app client invia una richiesta contenente quanto segue:
- L'indirizzo del server dell'app ricevente nel formato
SENDER_ID@fcm.googleapis.com
. - Un ID messaggio che dovrebbe 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 dell'app, aggiungendo alcune informazioni aggiuntive sul dispositivo di invio e sull'app.
Invia un messaggio a monte da un'app client Android
La tua app Android può inviare un messaggio upstream utilizzando FirebaseMessaging.send :
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());
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 le richiamate dei messaggi a monte
Con FirebaseMessaging
, puoi implementare i callback onMessageSent
e onSendError
per controllare lo stato dei messaggi upstream. In casi 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 è 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 che FCM possa inviarli correttamente, onSendError
restituisce SendException#ERROR_TTL_EXCEEDED
.
Per ottimizzare l'utilizzo della rete, FCM invia in batch le risposte a onMessageSent
e onSendError
, quindi il riconoscimento potrebbe non essere immediato 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 inviare il messaggio upstream. FCM aggiunge la category
e from
campi, quindi invia una stanza come la seguente al server dell'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 a monte come quello sopra, 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>
Per ulteriori informazioni sulla sintassi dei messaggi upstream, vedere XMPP Connection Server Reference .