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

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

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

เมื่อได้รับข้อมูลนี้ FCM จะสร้างบท XMPP เพื่อส่งไปยังเซิร์ฟเวอร์แอป โดยเพิ่มข้อมูลเพิ่มเติมเกี่ยวกับอุปกรณ์ส่งและแอป

ส่งข้อความอัปสตรีมจากแอปไคลเอนต์ Android

แอป Android สามารถส่งข้อความต้นน้ำใช้ FirebaseMessaging.send :

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());

คอตลิน+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")
})

จัดการการโทรกลับข้อความต้นน้ำ

ด้วย 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 ที่มี ID ข้อความที่ไม่ซ้ำกัน หาก FCM ไม่ได้รับ ACK ระบบอาจลองส่งข้อความไปยังเซิร์ฟเวอร์แอปอีกครั้ง

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

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