หากเซิร์ฟเวอร์แอปของคุณใช้โปรโตคอล XMPP Connection Server ก็สามารถรับข้อความอัปสตรีมจากอุปกรณ์ของผู้ใช้ไปยังคลาวด์ได้ เพื่อเริ่มต้นข้อความอัปสตรีม แอปไคลเอ็นต์จะส่งคำขอที่มีสิ่งต่อไปนี้:
- ที่อยู่ของเซิร์ฟเวอร์แอปที่รับในรูปแบบ
SENDER_ID@fcm.googleapis.com
- รหัสข้อความที่ควรไม่ซ้ำกันสำหรับ รหัสผู้ส่ง แต่ละราย
- ข้อมูลข้อความประกอบด้วยคู่คีย์-ค่าของเพย์โหลดของข้อความ
เมื่อได้รับข้อมูลนี้ 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
เพื่อตอบสนองต่อข้อความอัปสตรีมดังข้างต้น เซิร์ฟเวอร์แอปต้องใช้การเชื่อมต่อเดียวกันเพื่อส่งข้อความ ACK ที่มีรหัสข้อความที่ไม่ซ้ำกัน หาก FCM ไม่ได้รับ ACK อาจลองส่งข้อความไปยังเซิร์ฟเวอร์แอปอีกครั้ง
<message id=""> <gcm xmlns="google:mobile:data"> { "to":"REGID", "message_id":"m-123" "message_type":"ack" } </gcm> </message>
ดู การอ้างอิงเซิร์ฟเวอร์การเชื่อมต่อ XMPP สำหรับข้อมูลเพิ่มเติมเกี่ยวกับไวยากรณ์ข้อความอัปสตรีม