如果您的應用程式伺服器實作了 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
時,您可以實作回呼 onMessageSent
和 onSendError
,檢查上游訊息的狀態。如果發生錯誤,onSendError
會傳回含有錯誤代碼的 SendException
。例如,如果用戶端嘗試在達到 20 則訊息的限制後嘗試傳送更多訊息,則會傳回 SendException#ERROR_TOO_MANY_MESSAGES
。
如果裝置處於離線狀態,或是 FCM 服務無法將上游訊息轉送至伺服器,Android 用戶端應用程式執行個體最多可累積 20 個待處理訊息。如果這類訊息在 FCM 成功傳送前過期,onSendError
會傳回 SendException#ERROR_TTL_EXCEEDED
。
為盡量減少網路用量,FCM 會將回應批次傳送至 onMessageSent
和 onSendError
,因此每則訊息的確認訊息可能不會立即傳送。
在應用程式伺服器上接收 XMPP 訊息
當 FCM 收到來自用戶端應用程式的上游訊息傳遞呼叫時,會產生傳送上游訊息所需的 XMPP 段落。FCM 會新增 category
和 from
欄位,然後將結構定義傳送至應用程式伺服器:
<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 的確認訊息。如果 FCM 未收到 ACK,可能會嘗試將訊息傳送至應用程式伺服器。
<message id=""> <gcm xmlns="google:mobile:data"> { "to":"REGID", "message_id":"m-123" "message_type":"ack" } </gcm> </message>
如要進一步瞭解上游訊息語法,請參閱「XMPP 連線伺服器參考資料」。