Wenn Ihr App-Server das XMPP Connection Server-Protokoll implementiert, kann er Upstream-Nachrichten vom Gerät eines Nutzers an die Cloud empfangen. Um eine Upstream-Nachricht zu initiieren, sendet die Clientanwendung eine Anfrage mit den folgenden Angaben:
- Die Adresse des empfangenden Anwendungsservers im Format
SENDER_ID@fcm.googleapis.com
. - Eine Nachrichten-ID, die für jede Absender-ID eindeutig sein muss.
- Die Nachrichtendaten, die aus den Schlüssel/Wert-Paaren der Nutzlast der Nachricht bestehen.
Wenn diese Daten empfangen werden, erstellt FCM eine XMPP-Stanza, die an den Anwendungsserver gesendet wird. Dabei werden einige zusätzliche Informationen über das Gerät und die App des Absenders hinzugefügt.
Vorgelagerte Nachricht von einer Android-Client-App senden
Ihre Android-App kann mit FirebaseMessaging.send eine Upstream-Nachricht senden:
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());
Upstream-Nachrichten-Callbacks verarbeiten
Mit FirebaseMessaging
kannst du die Rückrufe onMessageSent
und onSendError
implementieren, um den Status von Upstream-Nachrichten zu prüfen. Bei Fehlern gibt onSendError
ein SendException
mit einem Fehlercode zurück. Wenn der Client beispielsweise versucht, mehr Nachrichten zu senden, nachdem das Limit von 20 Nachrichten erreicht ist, wird SendException#ERROR_TOO_MANY_MESSAGES
zurückgegeben.
Wenn das Gerät offline oder der Dienst FCM nicht zum Weiterleiten von Upstream-Nachrichten an Ihren Server verfügbar ist, können Android-Client-App-Instanzen maximal 20 ausstehende Nachrichten akkumulieren.
Wenn solche Nachrichten ablaufen, bevor FCM sie erfolgreich senden kann, gibt onSendError
SendException#ERROR_TTL_EXCEEDED
zurück.
Um die Netzwerknutzung zu optimieren, sendet FCM Antworten an onMessageSent
und onSendError
im Batch. Daher erfolgt die Bestätigung möglicherweise nicht sofort für jede Nachricht.
XMPP-Nachrichten auf dem App-Server empfangen
Wenn FCM einen Upstream-Messaging-Aufruf von einer Client-App erhält, generiert er die erforderliche XMPP-Strophe zum Senden der Upstream-Nachricht.
FCM fügt die Felder category
und from
hinzu und sendet dann eine Stanza wie die folgende an den Anwendungsserver:
<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>
ACK-Nachricht senden
Als Antwort auf eine solche Upstream-Nachricht muss der App-Server dieselbe Verbindung verwenden, um eine Bestätigungsnachricht mit der eindeutigen Nachrichten-ID zu senden. Wenn FCM keine Bestätigung erhält, versucht er möglicherweise noch einmal, die Nachricht an den App-Server zu senden.
<message id=""> <gcm xmlns="google:mobile:data"> { "to":"REGID", "message_id":"m-123" "message_type":"ack" } </gcm> </message>
Weitere Informationen zur vorgelagerten Nachrichtensyntax finden Sie in der Referenz zum XMPP-Verbindungsserver.