Firebase is back at Google I/O on May 10! Register now

Senden von Upstream-Nachrichten auf Android

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

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 .