Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

在 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 連接服務器參考