Wenn Ihr App-Server das XMPP Connection Server- Protokoll implementiert, kann er Upstream-Nachrichten vom Gerät eines Benutzers an die Cloud empfangen. Um eine Upstream-Nachricht zu initiieren, sendet die Client-App eine Anfrage mit folgendem Inhalt:
- Die Adresse des empfangenden App-Servers im Format
SENDER_ID@fcm.googleapis.com
. - Eine Nachrichten-ID, die für jede Absender-ID eindeutig sein sollte.
- Die Nachrichtendaten, die die Schlüssel-Wert-Paare der Nutzlast der Nachricht umfassen.
Wenn es diese Daten empfängt, erstellt FCM eine XMPP-Stanza, die an den App-Server gesendet wird, und fügt einige zusätzliche Informationen über das sendende Gerät und die App hinzu.
Senden Sie eine Upstream-Nachricht von einer Android-Client-App
Ihre Android-App kann mithilfe von 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());
Rückrufe für Upstream-Nachrichten verarbeiten
Mit FirebaseMessaging
können Sie die Callbacks onMessageSent
und onSendError
implementieren, um den Status von Upstream-Nachrichten zu überprüfen. Im Fehlerfall gibt onSendError
eine SendException
mit einem Fehlercode zurück. Wenn der Client beispielsweise versucht, weitere Nachrichten zu senden, nachdem das Limit von 20 Nachrichten erreicht ist, gibt er SendException#ERROR_TOO_MANY_MESSAGES
zurück.
In Fällen, in denen das Gerät offline ist oder der FCM-Dienst nicht verfügbar ist, um Upstream-Nachrichten an Ihren Server weiterzuleiten, können 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, fasst FCM Antworten auf onMessageSent
und onSendError
zusammen, sodass die Bestätigung möglicherweise nicht für jede Nachricht sofort erfolgt.
Empfangen Sie XMPP-Nachrichten auf dem App-Server
Wenn FCM einen Upstream-Messaging-Aufruf von einer Client-App empfängt, generiert es die erforderliche XMPP-Stanza zum Senden der Upstream-Nachricht. FCM fügt die Felder category
und from
hinzu und sendet dann eine Zeilengruppe 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>
Senden einer ACK-Nachricht
Als Antwort auf eine Upstream-Nachricht wie oben muss der App-Server dieselbe Verbindung verwenden, um eine ACK-Nachricht zu senden, die die eindeutige Nachrichten-ID enthält. Wenn FCM keine ACK erhält, kann es erneut versuchen, 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 Upstream-Nachrichtensyntax finden Sie in der XMPP-Verbindungsserver-Referenz .