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 Client-App eine Anfrage mit den folgenden Angaben:
- Die Adresse des empfangenden App-Servers im Format
SENDER_ID@fcm.googleapis.com
. - Eine Nachrichten-ID, die für jede Absender-ID eindeutig sein muss.
- Die Nachrichtendaten, die die Schlüssel/Wert-Paare der Nutzlast der Nachricht enthalten.
Wenn FCM diese Daten empfängt, erstellt es eine XMPP-Strophe, die an den App-Server gesendet wird. Dabei werden einige zusätzliche Informationen zum sendenden Gerät und zur App hinzugefügt.
Upstream-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 wurde, wird SendException#ERROR_TOO_MANY_MESSAGES
zurückgegeben.
Wenn das Gerät offline ist oder der FCM-Dienst nicht verfügbar ist, um Upstream-Nachrichten an Ihren Server weiterzuleiten, können sich in Android-Client-App-Instanzen maximal 20 ausstehende Nachrichten ansammeln.
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 Zeile wie die folgende an den App-Server:
<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 ACK-Nachricht 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 Syntax von Upstream-Nachrichten findest du in der XMPP-Verbindungsserverreferenz.