Senden von Upstream-Nachrichten auf Android

Wenn Ihre App - Server implementiert die Server XMPP Verbindungsprotokoll, kann es Upstream - Nachrichten von dem Gerät eines Benutzers in die Cloud erhalten. Um eine Upstream-Nachricht zu initiieren, sendet die Client-App eine Anfrage, die Folgendes enthält:

  • Die Adresse des empfangenden Applikationsservers im Format SENDER_ID@fcm.googleapis.com .
  • Eine Meldung Kennung, sollte für jeden eindeutig seinen Sender - ID .
  • Die Nachrichtendaten, die die Schlüssel-Wert-Paare der Nutzlast der Nachricht umfassen.

Wenn es diese Daten empfängt, erstellt FCM eine XMPP-Zeilengruppe, 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

Ihr Android - App kann eine Upstream - Nachricht unter Verwendung senden FirebaseMessaging.send :

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());

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")
})

Behandeln von Upstream-Nachrichtenrückrufen

Mit FirebaseMessaging können Sie die Rückrufe implementieren onMessageSent und onSendError den Status von Upstream - Nachrichten zu überprüfen. In Fehlerfällen, onSendError kehrt ein SendException mit einem Fehlercode. Zum Beispiel, wenn der Client versucht , mehr Nachrichten nach der 20-Nachricht Grenze zu schicken erreicht ist , gibt sie SendException#ERROR_TOO_MANY_MESSAGES .

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 können, onSendError gibt SendException#ERROR_TTL_EXCEEDED .

Zur Optimierung der Netzwerknutzung, FCM Chargen Antworten auf onMessageSent und onSendError , so kann die Bestätigung nicht für jede Nachricht sofort sein.

Empfangen von 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 category und from Feldern und sendet dann eine Strophe 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 mit der eindeutigen Nachrichten-ID zu senden. Wenn FCM keine ACK empfängt, 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>

Siehe die XMPP Connection Server Referenz für weitere Informationen über Upstream - Nachrichtensyntax.