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:
- 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 umfassen die Schlüssel-Wert-Paare der Nutzdaten der Nachricht.
Wenn es diese Daten empfängt, erstellt FCM eine XMPP-Strophe, 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 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());
Verarbeiten Sie Upstream-Nachrichtenrückrufe
Mit FirebaseMessaging
können Sie die Rückrufe 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, bündelt FCM die Antworten auf onMessageSent
und onSendError
, sodass die Bestätigung möglicherweise nicht sofort für jede Nachricht 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-Zeilengruppe 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 Reaktion auf eine Upstream-Nachricht wie oben 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 es möglicherweise erneut, 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 .