如果您的應用程式伺服器 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
欄位,然後傳送
將 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 連線伺服器參考資料 ,進一步瞭解上游訊息語法。