在 Android 上傳送上游訊息

如果您使用的是舊版 FCM 傳送 API,強烈建議您遷移至 HTTP v1 API,或考慮使用 Admin SDK 建構傳送要求。

如果應用程式伺服器實作 XMPP 連線伺服器通訊協定,就能接收來自使用者裝置的雲端上游訊息。如要啟動上游訊息,用戶端應用程式會傳送要求,其中包含下列項目:

  • 接收應用程式伺服器的地址,格式為 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 會將回應批次傳送至 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 連線伺服器參考資料」。