การส่งข้อความอัปสตรีมบน Android

หากเซิร์ฟเวอร์แอปของคุณใช้โปรโตคอลเซิร์ฟเวอร์การเชื่อมต่อ XMPP ก็จะรับข้อความขาเข้าจากอุปกรณ์ของผู้ใช้ไปยังระบบคลาวด์ได้ หากต้องการเริ่มข้อความขาขึ้น แอปไคลเอ็นต์จะส่งคําขอที่มีข้อมูลต่อไปนี้

  • ที่อยู่ของเซิร์ฟเวอร์แอปฝั่งที่รับในรูปแบบ SENDER_ID@fcm.googleapis.com
  • รหัสข้อความที่ควรไม่ซ้ำกันสำหรับรหัสผู้ส่งแต่ละรหัส
  • ข้อมูลข้อความที่ประกอบด้วยคู่คีย์-ค่าของเพย์โหลดข้อความ

เมื่อได้รับข้อมูลนี้ FCM จะสร้าง stanza ของ 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 ได้รับคําเรียกการรับส่งข้อความจากแอปไคลเอ็นต์ ระบบจะสร้าง stanza 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>

กำลังส่งข้อความ ACK

ในการตอบกลับข้อความจากฝั่งต้นทาง เช่น ด้านบน เซิร์ฟเวอร์แอปต้องใช้การเชื่อมต่อเดียวกันเพื่อส่งข้อความ ACK ที่มีรหัสข้อความที่ไม่ซ้ำกัน หาก FCM ไม่ได้รับ ACK ระบบอาจลองส่งข้อความไปยังเซิร์ฟเวอร์แอปอีกครั้ง

<message id="">
  <gcm xmlns="google:mobile:data">
  {
      "to":"REGID",
      "message_id":"m-123"
      "message_type":"ack"
  }
  </gcm>
</message>

ดูข้อมูลเพิ่มเติมเกี่ยวกับไวยากรณ์ข้อความขาเข้าได้ที่ข้อมูลอ้างอิงเซิร์ฟเวอร์การเชื่อมต่อ XMPP