Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

在 Android 上發送上游消息

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

  • 在格式接收應用程序服務器的地址SENDER_ID@fcm.googleapis.com
  • 一個消息的ID應該是為每個唯一的發送者ID
  • 包含消息負載的鍵值對的消息數據。

當收到此數據時,FCM 會構建一個 XMPP 節以發送到應用程序服務器,並添加一些有關發送設備和應用程序的附加信息。

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

Android應用可以發送使用上游消息FirebaseMessaging.send

爪哇

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

科特林+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連接服務器參考有關上游消息語法的更多信息。