Senden von Upstream-Nachrichten auf Android

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 .