如果您的應用程序服務器實現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
,您可以實現回調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 的 ACK 消息。如果 FCM 沒有收到 ACK,它可能會重試將消息發送到應用服務器。
<message id=""> <gcm xmlns="google:mobile:data"> { "to":"REGID", "message_id":"m-123" "message_type":"ack" } </gcm> </message>
有關上游消息語法的更多信息,請參閱XMPP 連接服務器參考。