Upstream-Nachrichten unter Android senden

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 Clientanwendung eine Anfrage mit den folgenden Angaben:

  • Die Adresse des empfangenden Anwendungsservers im Format SENDER_ID@fcm.googleapis.com.
  • Eine Nachrichten-ID, die für jede Absender-ID eindeutig sein muss.
  • Die Nachrichtendaten, die aus den Schlüssel/Wert-Paaren der Nutzlast der Nachricht bestehen.

Wenn diese Daten empfangen werden, erstellt FCM eine XMPP-Stanza, die an den Anwendungsserver gesendet wird. Dabei werden einige zusätzliche Informationen über das Gerät und die App des Absenders hinzugefügt.

Vorgelagerte 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 ist, wird SendException#ERROR_TOO_MANY_MESSAGES zurückgegeben.

Wenn das Gerät offline oder der Dienst FCM nicht zum Weiterleiten von Upstream-Nachrichten an Ihren Server verfügbar ist, können Android-Client-App-Instanzen maximal 20 ausstehende Nachrichten akkumulieren. 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 Stanza wie die folgende an den Anwendungsserver:

<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 Bestätigungsnachricht 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 vorgelagerten Nachrichtensyntax finden Sie in der Referenz zum XMPP-Verbindungsserver.