在 Android 上傳送上游訊息

如果您的應用程式伺服器 XMPP Connection Server 通訊協定 可以接收使用者裝置上的上游訊息至雲端。 如要啟動上游訊息,用戶端應用程式會傳送包含以下內容的要求:

  • 接收應用程式伺服器位址,格式為 SENDER_ID@fcm.googleapis.com
  • 每個寄件者 ID 專屬的郵件 ID。
  • 訊息資料,組成訊息酬載的鍵/值組合。

FCM 會在收到這項資料後建立一個 XMPP 段落,然後傳送到應用程式伺服器。 加入一些關於傳送端裝置和應用程式的額外資訊。

從 Android 用戶端應用程式傳送上游訊息

Android 應用程式可以使用 FirebaseMessaging.send

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

處理上游訊息回呼

有了 FirebaseMessaging,您可以實作 回呼 onMessageSentonSendError 來檢查上游的狀態 訊息。在錯誤情況下,onSendError 會傳回 SendException 傳回。舉例來說,如果用戶端嘗試 在達到 20 則訊息的上限後傳送更多訊息, SendException#ERROR_TOO_MANY_MESSAGES

裝置處於離線狀態或 FCM 時 無法使用服務 將上游訊息轉送至您的伺服器,Android 用戶端應用程式執行個體 最多累積 20 則待處理訊息。 這類訊息在 FCM 成功傳送前到期 但 onSendError 會傳回 SendException#ERROR_TTL_EXCEEDED

為達到最佳網路用量,FCM 會批次處理對 onMessageSent 的回應 和 onSendError,因此可能不會立即確認每則訊息。

在應用程式伺服器上接收 XMPP 訊息

當 FCM 從用戶端應用程式收到上游訊息呼叫時,就會產生 傳送上游訊息所需的 XMPP 段落。 FCM 會新增 categoryfrom 欄位,然後傳送 將 stanza 複製到應用程式伺服器,如下所示:

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

傳送確認訊息

為了回應如上述上游訊息,應用程式伺服器 必須使用相同的連線傳送確認訊息, 郵件 ID如果 FCM 沒有收到 ACK,可能會重試傳送 訊息傳送至應用程式伺服器

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

請參閱「XMPP 連線伺服器參考資料」。 ,進一步瞭解上游訊息語法。