在 Android 上發送上游消息

如果您的應用服務器實現了XMPP 連接服務器協議,它可以接收從用戶設備到雲端的上游消息。要啟動上游消息,客戶端應用程序會發送包含以下內容的請求:

當它接收到這些數據時,FCM 構建一個 XMPP 節以發送到應用服務器,添加一些關於發送設備和應用的附加信息。

從 Android 客戶端應用發送上游消息

您的 Android 應用可以使用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")
})

處理上游消息回調

使用FirebaseMessaging ,您可以實現回調onMessageSentonSendError來檢查上游消息的狀態。在錯誤情況下, onSendError返回帶有錯誤代碼的SendException 。例如,如果客戶端在達到 20 條消息限制後嘗試發送更多消息,它會返回SendException#ERROR_TOO_MANY_MESSAGES

在設備離線或 FCM 服務無法將上游消息轉發到您的服務器的情況下,Android 客戶端應用程序實例最多可累積 20 條待處理消息。如果此類消息在 FCM 成功發送之前到期, onSendError將返回SendException#ERROR_TTL_EXCEEDED

為了優化網絡使用,FCM 會批量響應onMessageSentonSendError ,因此可能不會立即對每條消息進行確認。

在應用服務器上接收 XMPP 消息

當 FCM 接收到來自客戶端應用程序的上游消息傳遞調用時,它會生成必要的 XMPP 節以發送上游消息。 FCM 添加categoryfrom字段,然後向應用服務器發送如下所示的節:

<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 消息

為了響應上述上游消息,應用服務器必須使用相同的連接來發送包含唯一消息 ID 的 ACK 消息。如果 FCM 沒有收到 ACK,它可能會重新嘗試將消息發送到應用服務器。

<message id="">
  <gcm xmlns="google:mobile:data">
  {
      "to":"REGID",
      "message_id":"m-123"
      "message_type":"ack"
  }
  </gcm>
</message>

有關上游消息語法的更多信息,請參閱XMPP 連接服務器參考