ข้อความพุชแบบมัลติแคสต์ข้อความแรกที่ใช้หัวข้อ FCM

1. บทนำ

เป้าหมาย

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

เมื่อเสร็จแล้ว คุณจะใช้ประโยชน์จากโครงสร้างพื้นฐานของ FCM เพื่อจัดการกลุ่มย่อยเหล่านี้ รวมถึงข้อความพุชแบบหลายผู้รับผ่านกลุ่มย่อยได้

ภาพรวมของหัวข้อ

หัวข้อเป็นวิธีที่โครงสร้างพื้นฐานของ FCM รองรับในการเข้าถึงกลุ่มย่อยของอินสแตนซ์แอปด้วยข้อความ

FCM มี API สำหรับส่งข้อความและจัดการการติดตามหัวข้อเหล่านี้ การเชื่อมโยงและยกเลิกการเชื่อมโยงอินสแตนซ์ของแอปกับหัวข้อเรียกว่าการสมัครรับข้อมูลและการยกเลิกการสมัครรับข้อมูลตามลำดับ

ควรใช้หัวข้อสำหรับเนื้อหาที่เผยแพร่ต่อสาธารณะ เช่น ข้อความเกี่ยวกับการอัปเดตสภาพอากาศ หากต้องการส่งข้อความที่ละเอียดอ่อนของผู้ใช้ ให้ใช้ Firebase Admin SDK สำหรับการส่งข้อความแบบหลายผู้รับไปยังอุปกรณ์หลายเครื่อง

การส่งแบบหลายผู้รับตามหัวข้อได้รับการเพิ่มประสิทธิภาพเพื่ออัตราการรับส่งข้อมูล

สิ่งที่คุณจะได้เรียนรู้

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

สิ่งที่คุณจะสร้าง

  • แอป Android ที่สมัครรับข้อมูล/ยกเลิกการสมัครรับข้อมูลหัวข้อ และรับข้อความเมื่อมีการส่งไปยังหัวข้อ
  • การผสานรวมฝั่งเซิร์ฟเวอร์โดยใช้ Firebase Admin SDK ซึ่งจะใช้เพื่อส่งข้อความตามหัวข้อผ่าน FCM API

สิ่งที่คุณต้องมี

  • เบราว์เซอร์ที่คุณเลือก เช่น Chrome
  • IDE IntelliJ IDEA สำหรับการพัฒนาแอปพลิเคชัน Java
    • อย่าลืมเลือกใช้การรองรับ Gradle ขณะติดตั้ง
  • IDE ของ Android Studio สำหรับการพัฒนาแอปพลิเคชัน Android
  • อุปกรณ์ที่จะเรียกใช้แอปพลิเคชัน Android อย่างใดอย่างหนึ่งต่อไปนี้
    • โปรแกรมจำลอง Android (ต้องตั้งค่าใน Android Studio)
    • อุปกรณ์ Android จริงที่เชื่อมต่อกับคอมพิวเตอร์และตั้งค่าเป็นโหมดนักพัฒนาแอป
  • บัญชี Google สำหรับสร้างและจัดการโปรเจ็กต์ Firebase

2. การเริ่มตั้งค่า

รับรหัส

โคลนที่เก็บ GitHub จากบรรทัดคำสั่งโดยทำดังนี้

git clone https://github.com/firebase/quickstart-android.git fcm-codelab

ระบบจะโคลนโค้ดตัวอย่างไปยังไดเรกทอรี fcm-codelab

cd fcm-codelab

แอปเริ่มต้นสำหรับ Codelab นี้อยู่ในไดเรกทอรี messaging ของสาขา fcm-topics-codelab ทำตามขั้นตอนต่อไปนี้เพื่อเข้าถึงโค้ดเริ่มต้น โดยมี 2 ไดเรกทอรี ได้แก่ StockNewsApp และ StockNewsServer โดยโฟลเดอร์แรกมีแอป Android เริ่มต้น ส่วนโฟลเดอร์ที่ 2 มีโค้ดฝั่งเซิร์ฟเวอร์เริ่มต้น

git checkout fcm-topics-codelab
cd messaging/fcm-topics-codelab/starter

เวอร์ชันที่เสร็จสมบูรณ์ของ Codelab นี้จะอยู่ในไดเรกทอรี messaging/fcm-topics-codelab/completed

สร้างโปรเจ็กต์ Firebase

  1. ลงชื่อเข้าใช้คอนโซล Firebase โดยใช้บัญชี Google
  2. คลิกปุ่มเพื่อสร้างโปรเจ็กต์ใหม่ แล้วป้อนชื่อโปรเจ็กต์ (เช่น StockNews)
  3. คลิกต่อไป
  4. หากได้รับแจ้ง ให้อ่านและยอมรับข้อกำหนดของ Firebase แล้วคลิกต่อไป
  5. (ไม่บังคับ) เปิดใช้ความช่วยเหลือจาก AI ในคอนโซล Firebase (เรียกว่า "Gemini ใน Firebase")
  6. สำหรับ Codelab นี้ คุณไม่จำเป็นต้องใช้ Google Analytics ดังนั้นให้ปิดตัวเลือก Google Analytics
  7. คลิกสร้างโปรเจ็กต์ รอให้ระบบจัดสรรโปรเจ็กต์ แล้วคลิกดำเนินการต่อ

ยินดีด้วย คุณเพิ่งสร้างโปรเจ็กต์ Firebase

3. การกำหนดค่าแอป Firebase เฉพาะแพลตฟอร์ม

การเปลี่ยนแปลงโค้ดส่วนใหญ่ที่จำเป็นต่อการเปิดใช้การรองรับ Firebase ได้รับการตรวจสอบในโปรเจ็กต์ที่คุณกำลังทํางานอยู่แล้ว อย่างไรก็ตาม หากต้องการเพิ่มการรองรับแพลตฟอร์มอุปกรณ์เคลื่อนที่ คุณต้องทำดังนี้

  • ลงทะเบียนแพลตฟอร์มที่ต้องการในโปรเจ็กต์ Firebase
  • ดาวน์โหลดไฟล์การกำหนดค่าเฉพาะแพลตฟอร์ม แล้วเพิ่มลงในโค้ด

ใน Codelab นี้ เราจะเพิ่มแอป Firebase สำหรับ Android

84e0b3199bef6d8a.pngกำหนดค่า Android

  1. ในคอนโซล Firebase ให้เลือกการตั้งค่าโปรเจ็กต์ที่ด้านบนของแถบนำทางด้านซ้ายในฟันเฟืองการตั้งค่า แล้วคลิกไอคอน Android ในส่วนแอปของคุณในหน้าทั่วไป

คุณควรเห็นกล่องโต้ตอบต่อไปนี้ 8254fc299e82f528.png

  1. ค่าที่สำคัญซึ่งต้องระบุคือชื่อแพ็กเกจ Android ตั้งเป็น com.ticker.stocknews
    1. ชื่อแพ็กเกจที่ระบุที่นี่ต้องเป็นชื่อเดียวกับชื่อแพ็กเกจที่ระบุใน AndroidManifest.xml ของโค้ด StockNewsApp เริ่มต้น หากต้องการค้นหาหรือเปลี่ยน ให้ทำตามขั้นตอนต่อไปนี้
      1. ในไดเรกทอรี StockNewsApp ให้เปิดไฟล์ app/src/main/AndroidManifest.xml
      2. ในองค์ประกอบ manifest ให้ค้นหาค่าสตริงของแอตทริบิวต์ package ค่านี้คือชื่อแพ็กเกจ Android
  1. ในกล่องโต้ตอบ Firebase ให้วางชื่อแพ็กเกจที่คัดลอกไว้ในช่องชื่อแพ็กเกจ Android
  2. คุณไม่จำเป็นต้องใช้ SHA-1 ของใบรับรองการลงนามสำหรับดีบักสำหรับ Codelab นี้ เนื่องจากแอปนี้จะไม่ได้รับการเผยแพร่ เว้นว่างไว้
  3. คลิกลงทะเบียนแอป
  4. ทำตามวิธีการในคอนโซล Firebase เพื่อดาวน์โหลดไฟล์การกำหนดค่า google-services.json
  5. คุณข้ามขั้นตอนการตั้งค่าที่เหลือได้ เนื่องจากมีการกำหนดค่าทุกอย่างไว้แล้วในโค้ดแอปเริ่มต้น คุณจะเห็นแอปแสดงอยู่ในหน้าหลักของคอนโซล Firebase
  6. คัดลอกไฟล์ google-services.json (ที่เพิ่งดาวน์โหลด) ไปยังไดเรกทอรี messaging/fcm-topics-codelab/starter/StockNewsApp/app

4. สร้างและเรียกใช้แอปของคุณ

คุณพร้อมที่จะเริ่มทำงานกับแอปแล้ว ก่อนอื่นให้สร้างและเรียกใช้แอป

นำเข้าแอปเริ่มต้น

เริ่ม Android Studio แล้วนำเข้า messaging/fcm-topics-codelab/starter/StockNewsApp จากไดเรกทอรีโค้ดเริ่มต้น

หลังจากโหลดโปรเจ็กต์แล้ว คุณอาจเห็นการแจ้งเตือนว่า Git ไม่ได้ติดตามการเปลี่ยนแปลงในเครื่องทั้งหมด คุณสามารถคลิก "Ignore" หรือ "X" ที่ด้านขวาบน (คุณจะไม่พุชการเปลี่ยนแปลงกลับไปยังที่เก็บ Git)

ที่มุมซ้ายบนของหน้าต่างโปรเจ็กต์ คุณควรเห็นสิ่งที่คล้ายกับรูปภาพด้านล่างหากอยู่ในมุมมอง Android (หากอยู่ในมุมมองโปรเจ็กต์ คุณจะต้องขยายโปรเจ็กต์เพื่อดูสิ่งเดียวกัน)

b574ea0089ee87c6.png

โปรดทราบว่า Android Studio อาจใช้เวลาหลายวินาทีในการคอมไพล์โปรเจ็กต์ในเบื้องหลังเป็นครั้งแรก ในระหว่างนี้ คุณจะเห็นวงกลมหมุนในแถบสถานะที่ด้านล่างของ Android Studio

4bc64eb3b99eb0ae.png

เราขอแนะนำให้คุณรอจนกว่ากระบวนการนี้จะเสร็จสิ้นก่อนทำการเปลี่ยนแปลงโค้ด ซึ่งจะช่วยให้ Android Studio ดึงคอมโพเนนต์ที่จำเป็นทั้งหมดได้

นอกจากนี้ หากได้รับข้อความแจ้งว่า "โหลดซ้ำเพื่อให้การเปลี่ยนแปลงภาษามีผลไหม" หรือข้อความที่คล้ายกัน ให้เลือก "ใช่"

การตั้งค่าโปรแกรมจำลอง

หากต้องการความช่วยเหลือในการตั้งค่าโปรแกรมจำลอง Android โปรดดูบทความเรียกใช้แอป

ทำความเข้าใจโค้ดเริ่มต้นของแอป Android

  • โค้ดเริ่มต้นคือแอป Android ขนาดเล็กที่มีฟังก์ชันการทำงานและ UI น้อยที่สุด
  • ระบบได้เพิ่มการอ้างอิงไปยัง Firebase Messaging SDK ลงในไฟล์ app/build.gradle แล้ว

f04ff8f48d186dff.png

  • ใน AndroidManifest.xml มีการเพิ่มแฮนเดิลเลอร์การโทรกลับ MESSAGING_EVENT แล้ว
    • แฮนเดิลนี้ StockNewsMessagingService.java ขยายคลาส FirebaseMessagingService ซึ่งมีฟังก์ชันต่างๆ ที่เกี่ยวข้องกับ Firebase Cloud Messaging ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบของ FirebaseMessagingService b843c4d33ee53166.png
    88fad1960f4a6ff5.png
    • ระบบจะเรียกใช้ฟังก์ชัน onNewToken เมื่อสร้างหรือรีเฟรชโทเค็นการลงทะเบียน FCM ดูข้อมูลเพิ่มเติมได้ที่ตรวจสอบการสร้างโทเค็น
    • ระบบจะเรียกใช้onMessageReceivedฟังก์ชันเมื่อได้รับข้อความและแอปอยู่ในเบื้องหน้า ปัจจุบันระบบจะบันทึกข้อความที่ได้รับเท่านั้น
      • ดูข้อมูลเพิ่มเติมเกี่ยวกับความแตกต่างระหว่างการนำส่งและการจัดการข้อความในเบื้องหลังและเบื้องหน้าได้ที่รับข้อความในแอป Android
  • นอกจากนี้ ใน AndroidManifest.xml ยังมีคลาส Android Application ชื่อ StockNewsApplication ด้วย a4982a8731492dfc.pngccde692f7f68dc5a.png
    • คลาสนี้จะเป็นคลาสแรกที่สร้างอินสแตนซ์เมื่อแอปเริ่มต้น
    • ในฟังก์ชัน onCreate ของStockNewsApplication คลาส ระบบจะเพิ่มการเรียกการสร้างโทเค็นการลงทะเบียน FCM ซึ่งจะสร้างโทเค็นการลงทะเบียน FCM ที่ถูกต้องและบันทึกโทเค็นนั้น
  • MainActivity.java จะเพิ่ม RecyclerView ที่แสดงตัวเลือกหมวดหมู่หุ้น
  • SubscriptionAdapter.java ใช้ RecyclerView.Adapter ซึ่งวาดหน้าจอการเลือกหมวดหมู่หุ้น
    • หมวดหมู่หุ้นแต่ละหมวดหมู่จะมีชื่อและปุ่มเปิด/ปิดการติดตามอยู่ข้างๆ
    • การเปลี่ยนปุ่มสลับควรทำให้เกิดการเรียกใช้การสมัครใช้บริการ / ยกเลิกการสมัครใช้บริการหัวข้อ FCM
    • คุณจะใช้การเรียกเหล่านี้ในส่วนถัดไป
  • model/StockCategories.java class มีรายการหมวดหมู่หุ้นทั้งหมดและชื่อหัวข้อที่เกี่ยวข้อง

b32663ec4e865a18.png

เรียกใช้แอปเริ่มต้น

  1. เชื่อมต่ออุปกรณ์ Android กับคอมพิวเตอร์หรือเริ่มโปรแกรมจำลอง
  2. ในแถบเครื่องมือด้านบน ให้เลือกอุปกรณ์ Android หรือโปรแกรมจำลองเป้าหมาย แล้วกดปุ่มเรียกใช้

5b27fc5b237e06b9.png

  1. UI ของแอปจะมีลักษณะดังนี้

ff5b1a1c53231c54.png

  1. แอปจะสร้างโทเค็นการลงทะเบียน FCM และบันทึกโทเค็น แต่ UI ของแอปจะไม่มีการเปลี่ยนแปลง
    1. คัดลอกและบันทึกโทเค็นการลงทะเบียน FCM เนื่องจากจะต้องใช้ในขั้นตอนถัดไป

927eb66bc909f36b.png

5. ส่งข้อความทดสอบ

ตอนนี้คุณพร้อมที่จะส่งข้อความทดสอบไปยังอินสแตนซ์ของแอปที่คุณตั้งค่าไว้ในขั้นตอนสุดท้ายแล้ว

นำเข้าโค้ดเซิร์ฟเวอร์เริ่มต้น

เริ่ม IntelliJ IDEA แล้วเปิดmessaging/fcm-topics-codelab/starter/StockNewsServerโปรเจ็กต์

มุมมองโปรเจ็กต์ในแถบนำทางด้านซ้ายควรมีลักษณะดังนี้

da20711f6527dff6.png

โปรดทราบว่า IntelliJ IDEA อาจใช้เวลาสักครู่ในการสร้างโปรเจ็กต์ รวมถึงดึงข้อมูลการอ้างอิงที่จำเป็น

ทำความเข้าใจโค้ดเริ่มต้นของเซิร์ฟเวอร์

  • โค้ดเริ่มต้นของเซิร์ฟเวอร์คือโปรเจ็กต์ Java ที่ใช้ Gradle
  • ไฟล์ build.gradle มีทรัพยากร Dependency ใน Firebase Admin SDK เพิ่มอยู่แล้ว SDK นี้ให้สิทธิ์เข้าถึงฟังก์ชันการทำงานต่างๆ ในการส่งข้อความ FCM

650fc733298588f8.png

  • สุดท้ายนี้ มี 2 คลาส ได้แก่
    • FcmSender.java: ชั้นเรียนนี้มีวิธีการจดบันทึกต่อไปนี้
      • initFirebaseSDK: เริ่มต้น SDK ของ firebase-admin
      • sendMessageToFcmRegistrationToken: ส่งข้อความไปยังโทเค็นการลงทะเบียน FCM
      • sendMessageToFcmTopic: ส่งข้อความไปยังหัวข้อ FCM
      • sendMessageToFcmTopicCondition: ส่งข้อความไปยังเงื่อนไขหัวข้อ FCM
    • FcmSubscriptionManager.java: คลาสนี้มีเมธอดที่อนุญาตให้จัดการการสมัครใช้บริการหัวข้อจากฝั่งเซิร์ฟเวอร์
      • initFirebaseSDK: เริ่มต้น SDK ของ firebase-admin
      • subscribeFcmRegistrationTokensToTopic: สมัครใช้โทเค็นการลงทะเบียน FCM กับหัวข้อ FCM
      • unsubscribeFcmRegistrationTokensFromTopic: ยกเลิกการสมัครรับข้อมูลโทเค็นการลงทะเบียน FCM จากหัวข้อ FCM

การตั้งค่าโค้ดเซิร์ฟเวอร์

  1. ก่อนอื่นเราต้องตั้งค่าบัญชีบริการ Firebase ที่อนุญาตให้ SDK ของ firebase-admin ให้สิทธิ์การเรียกใช้ FCM API
    1. ไปที่คอนโซล Firebase คลิกไอคอนรูปเฟืองข้างภาพรวมโปรเจ็กต์ในแถบนำทางด้านซ้าย แล้วเลือกการตั้งค่าโปรเจ็กต์ 8c2108d4d7c915e9.png
    2. ในหน้าการตั้งค่า ให้เลือกบัญชีบริการ แล้วคลิกสร้างบัญชีบริการ 84b128cc5dac0a85.png
    3. ตอนนี้ให้คลิกปุ่มสร้างคีย์ส่วนตัวใหม่ แล้วระบบจะเริ่มดาวน์โหลดไฟล์คีย์โดยอัตโนมัติ
    4. เปลี่ยนชื่อไฟล์คีย์เป็น service-account.json แล้วคัดลอกไปไว้ในโฟลเดอร์ messaging/fcm-topics-codelab/starter/StockNewsServer/src/main/resources
    5. ทั้ง FcmSender.java และ FcmSubscriptionManager.java จะโหลดไฟล์ service-account.json จาก classpath โดยใช้โค้ดต่อไปนี้ 8dffbee658e0bdd.png
  2. ตอนนี้โค้ดเซิร์ฟเวอร์พร้อมใช้งานแล้ว เรียกใช้ Build -> Build Project จากแถบเมนูด้านบน

การส่งข้อความทดสอบ

  1. ใน FcmSender.java ให้ค้นหาฟังก์ชัน sendMessageToFcmRegistrationToken แล้วแทรกโทเค็นการลงทะเบียน FCM ที่คัดลอกจากส่วนเรียกใช้แอปเริ่มต้นลงในช่อง registrationToken
  2. ในฟังก์ชัน main ให้ยกเลิกการแสดงความคิดเห็นเฉพาะฟังก์ชัน sendMessageToFcmRegistrationToken แล้วคลิกเรียกใช้เพื่อดำเนินการโค้ด
    1. สังเกตวิธีตั้งค่าโทเค็นการลงทะเบียน FCM ในTokenฟิลด์ของออบเจ็กต์ message
    2. นอกจากนี้ โปรดสังเกตว่าเราใช้ API ของ send ในอินเทอร์เฟซ FirebaseMessaging อย่างไร

52e4a3ec3f816473.png

  1. ซึ่งควรส่งข้อความไปยังอินสแตนซ์ของแอปที่คุณตั้งค่าไว้ในขั้นตอนก่อนหน้า
  2. เมื่ออินสแตนซ์ของแอปอยู่เบื้องหน้า คุณควรเห็นเนื้อหาข้อความที่บันทึกไว้

d3540ec1089f97dd.png

  1. และเมื่ออินสแตนซ์ของแอปอยู่ในเบื้องหลัง คุณจะเห็นข้อความปรากฏในถาดการแจ้งเตือน

31203deca59c03fe.png

ยอดเยี่ยม คุณใช้ Firebase Admin SDK เพื่อส่งข้อความไปยังอินสแตนซ์แอป อ่านเพิ่มเติมเกี่ยวกับการใช้ Firebase Admin SDK ในเซิร์ฟเวอร์

6. ใช้การติดตาม / เลิกติดตามหัวข้อ

ในขั้นตอนนี้ คุณจะใช้การดำเนินการสมัครรับข้อมูลและยกเลิกการสมัครรับข้อมูลหัวข้อในปุ่มเปิด/ปิดหมวดหมู่หุ้นของแอป Android

เมื่อผู้ใช้แอปสลับสวิตช์สำหรับหมวดหมู่หุ้นที่เฉพาะเจาะจง ระบบจะทำการเรียกการสมัครรับข้อมูลหรือยกเลิกการสมัครรับข้อมูลหัวข้อ

รหัสรีวิว

  • ไปที่คลาส SubscriptionAdapter.java ในโค้ดแอป Android แล้วค้นหาคลาส RecyclerViewViewHolder

6c0614199e684f6.png

  • เครื่องมือสร้างคลาสจะตั้งค่า Listener สำหรับการสลับการติดตามโดยใช้ setOnCheckedChangeListener
  • การดำเนินการสมัครรับข้อมูลและยกเลิกการสมัครรับข้อมูลจะดำเนินการโดยการเรียกใช้เมธอด subscribeToStockCategory และ unsubscribeFromStockCategory ตามลำดับ ทั้งนี้ขึ้นอยู่กับปุ่มเปิด/ปิดสวิตช์
  • setData เมธอดจะถูกเรียกใช้โดย onBindViewHolder ของ RecyclerView Adapter เพื่อเชื่อมโยง ViewHolder กับหมวดหมู่หุ้นที่เหมาะสม

ใช้การสมัครรับข้อมูลหัวข้อ

  1. ในเมธอด subscribeToStockCategory คุณจะใช้การเรียก API subscribeToTopic ของออบเจ็กต์ FirebaseMessaging โค้ดอาจมีลักษณะดังนี้
   void subscribeToStockCategory() {
      // Making call to FCM for subscribing to the topic for stockCategory
     FirebaseMessaging.getInstance().subscribeToTopic(stockCategory.getTopicName()).addOnSuccessListener(
          unused -> {
            // Subscribing action successful
            Log.i(TAG, "Subscribed to topic: " + stockCategory.getTopicName());
            Toast.makeText(itemView.getContext(), "Subscribed to " + stockCategory.getCategoryName(),
                Toast.LENGTH_SHORT).show();
          });
    }

ใช้การเลิกติดตามหัวข้อ

  1. ในทำนองเดียวกัน ในเงื่อนไข else คุณจะใช้การเรียก API ของ unsubscribeFromTopic โดยมีลักษณะดังนี้
void unsubscribeFromStockCategory() {
      // Making call to FCM for unsubscribing from the topic for stockCategory
      FirebaseMessaging.getInstance().unsubscribeFromTopic(stockCategory.getTopicName())
          .addOnSuccessListener(unused -> {
            // Unsubscribing action successful
            Log.i(TAG, "Unsubscribed from topic: " + stockCategory.getTopicName());
            Toast.makeText(itemView.getContext(), "Unsubscribed from " + stockCategory.getCategoryName(),
                Toast.LENGTH_SHORT).show();
          });
    }

มาลองใช้กันเลย

  1. เรียกใช้แอปและสลับตัวเลือกหมวดหมู่หุ้นเพื่อดำเนินการสมัครรับข้อมูลและยกเลิกการสมัครรับข้อมูล ซึ่งจะมีลักษณะดังนี้

สมัครรับข้อมูล

ยกเลิกการสมัคร

7. การส่งข้อความหัวข้อแรก

ในขั้นตอนนี้ คุณจะใช้โค้ดฝั่งเซิร์ฟเวอร์เพื่อส่งข้อความหัวข้อ FCM

ใช้การผสานรวมฝั่งเซิร์ฟเวอร์เพื่อส่งข้อความหัวข้อ

  1. ในโค้ดฝั่งเซิร์ฟเวอร์ ให้ไปที่ FcmSender.java แล้วค้นหาวิธีการที่ชื่อ sendMessageToFcmTopic

56381dd1b40cde9c.png

  1. ในบรรทัดแรก ให้ระบุหัวข้อ FCM ที่ต้องการส่งข้อความ
    • ซึ่งเป็นสตริงในรูปแบบ /topics/<Topic Name> เช่น /topics/Technology
  2. ในบรรทัดถัดไป ให้สร้างออบเจ็กต์ message ใหม่ (คล้ายกับออบเจ็กต์ที่กําหนดไว้ในฟังก์ชัน sendMessageToFcmRegistrationToken)
    • ความแตกต่างคือแทนที่จะตั้งค่าฟิลด์ Token ของออบเจ็กต์ message คุณจะตั้งค่าฟิลด์ Topic
Message message = Message.builder()
        .putData("FOOTECH", "$1000")
        .setNotification(
            Notification.builder()
                .setTitle("Investor confidence in Tech Stocks growing")
                .setBody("Foo Tech leading the way in stock growth for Tech sector.")
                .build())
        .setTopic(topicName)
        .build();
  1. ตอนนี้ให้เพิ่มการเรียกไปยังอินสแตนซ์ FirebaseMessaging เพื่อส่งข้อความ (เหมือนกับการเรียกส่งที่ทำในฟังก์ชัน sendMessageToFcmRegistrationToken)
FirebaseMessaging.getInstance().send(message);
  1. สุดท้าย ให้อัปเดตmainฟังก์ชันและเปิดใช้การเรียกไปยังฟังก์ชันsendMessageToFcmTopicเท่านั้น

9a6aa08dd7c28898.png

ส่งข้อความและตรวจสอบการรับ

  1. ก่อนส่งข้อความหัวข้อ ให้ตรวจสอบก่อนว่าอินสแตนซ์ของแอปได้สมัครรับข้อมูลหัวข้อที่คุณต้องการส่งแล้ว
    1. ซึ่งทำได้โดยการสลับปุ่มเปิด/ปิดที่เกี่ยวข้อง เช่น
    4668247408377712.png
  2. ตอนนี้คุณสามารถส่งข้อความตามหัวข้อได้โดยการเรียกใช้ฟังก์ชัน main ของ FcmSender.java
  3. เช่นเดียวกับก่อนหน้านี้ คุณควรจะดูการรับข้อความในอินสแตนซ์ของแอปได้
    1. อินสแตนซ์ของแอปในเบื้องหน้า
    c144721399f610fe.png
    1. อินสแตนซ์ของแอปในเบื้องหลัง
    44efc7dfd57e8e9a.png
  4. เคล็ดลับ: ลองยกเลิกการติดตามหัวข้อที่คุณส่งไป แล้วส่งข้อความอีกครั้ง คุณจะสังเกตได้ว่าระบบไม่ได้ส่งข้อความไปยังอินสแตนซ์ของแอป

8. การส่งข้อความเงื่อนไขของหัวข้อแรก

ฟีเจอร์เงื่อนไขของหัวข้อช่วยให้คุณส่งข้อความไปยังชุดค่าผสมของหัวข้อต่างๆ ได้ ซึ่งจะช่วยให้คุณกำหนดกลุ่มเป้าหมายได้ชัดเจนยิ่งขึ้น

ตัวอย่างเช่น ในแอป StockNews ให้พิจารณาความเป็นไปได้ในการส่งข้อความไปยังกลุ่มอินสแตนซ์ของแอปที่สมัครรับข้อมูลหัวข้อเทคโนโลยีหรือยานยนต์ กรณีดังกล่าวอาจเกิดขึ้นได้ เช่น หากมีเหตุการณ์สำคัญที่เกี่ยวข้องกับ Waymo

หัวข้อช่วยให้คุณแสดงการผสมผสานในรูปแบบของนิพจน์บูลีนได้โดยใช้โอเปอเรเตอร์ต่อไปนี้

  • && : AND เชิงตรรกะ เช่น 'Technology' in topics && 'Automotive' in topics - กำหนดเป้าหมายเฉพาะอินสแตนซ์ของแอปที่ติดตามทั้งหัวข้อเทคโนโลยีและยานยนต์
  • || : OR เชิงตรรกะ เช่น 'Technology' in topics || 'Automotive' in topics - กำหนดเป้าหมายอินสแตนซ์แอปที่ติดตามหัวข้อเทคโนโลยีหรือยานยนต์
  • () : วงเล็บสำหรับการจัดกลุ่ม เช่น 'Technology' in topics && ('Automotive' in topics || 'Energy' in topics) - กำหนดเป้าหมายเฉพาะอินสแตนซ์ของแอปที่ติดตามหัวข้อเทคโนโลยีและหัวข้อรถยนต์หรือพลังงาน

อ่านเพิ่มเติมเกี่ยวกับวิธีสร้างคำขอส่งเพื่อใช้ฟังก์ชันนี้

ใช้การผสานรวมฝั่งเซิร์ฟเวอร์เพื่อส่งข้อความเกี่ยวกับเงื่อนไขของหัวข้อ

  1. กลับไปที่โค้ดฝั่งเซิร์ฟเวอร์ ให้ไปที่ FcmSender.java แล้วค้นหาวิธีการที่ชื่อ sendMessageToFcmTopicCondition

3719a86c274522cf.png

  1. ในบรรทัดแรก สำหรับตัวแปร topicCondition ให้ระบุเงื่อนไขหัวข้อที่ต้องการส่งข้อความ คุณสามารถตั้งค่าได้ดังนี้ 'Technology' in topics && 'Automotive' in topics
  2. ในบรรทัดถัดไป ให้สร้างออบเจ็กต์ message ใหม่ (คล้ายกับออบเจ็กต์ที่กําหนดไว้ในฟังก์ชัน sendMessageToFcmTopic)
    1. ความแตกต่างคือแทนที่จะตั้งค่าฟิลด์ Topic ของออบเจ็กต์ คุณจะตั้งค่าฟิลด์ Condition
    Message message = Message.builder()
        .putData("FOOCAR", "$500")
        .setNotification(
            Notification.builder()
                .setTitle("Foo Car shows strong Q2 results")
                .setBody("Foo Car crosses 1B miles. Stocks rally.")
                .build())
        .setCondition(topicCondition)
        .build();
  1. ตอนนี้ให้เพิ่มการเรียกไปยังอินสแตนซ์ FirebaseMessaging เพื่อส่งข้อความ (เหมือนกับการเรียกส่งที่ทำในฟังก์ชัน sendMessageToFcmTopic)
FirebaseMessaging.getInstance().send(message);
  1. สุดท้าย ให้อัปเดตmainฟังก์ชันและเปิดใช้การเรียกไปยังฟังก์ชันsendMessageToFcmTopicConditionเท่านั้น

db9588d40d2a0da6.png

ส่งข้อความและตรวจสอบการรับ

  1. ก่อนส่งข้อความหัวข้อ โปรดตรวจสอบก่อนว่าอินสแตนซ์ของแอปเป็นไปตามเงื่อนไขหัวข้อที่ระบุโดยการสมัครรับข้อมูลอินสแตนซ์ของแอปทั้งหัวข้อเทคโนโลยีและยานยนต์
  2. ตอนนี้คุณสามารถส่งข้อความตามหัวข้อได้โดยการเรียกใช้ฟังก์ชัน main ของ FcmSender.java
  3. เช่นเดียวกับก่อนหน้านี้ คุณควรจะดูการรับข้อความในอินสแตนซ์ของแอปได้
    1. อินสแตนซ์ของแอปในเบื้องหน้า
    6f612ace15aa6515.png
    1. อินสแตนซ์ของแอปในเบื้องหลัง
    78044a56ac2359cb.png
  4. โบนัส: ตอนนี้คุณยกเลิกการติดตามหัวข้อเทคโนโลยีและส่งข้อความเงื่อนไขของหัวข้ออีกครั้งได้แล้ว คุณควรสังเกตว่าอินสแตนซ์ของแอปไม่ได้รับข้อความ

9. สรุปการแข่งขัน

มาทบทวนกันอย่างรวดเร็วถึงสิ่งที่คุณได้เรียนรู้มาจนถึงตอนนี้

  • วิธีเริ่มการสมัครรับข้อมูล / ยกเลิกการสมัครรับข้อมูลหัวข้อจากอินสแตนซ์ของแอป
  • การส่งข้อความไปยังหัวข้อและการยืนยันการรับในอินสแตนซ์แอปที่สมัครใช้บริการ
  • การส่งข้อความไปยังเงื่อนไขของหัวข้อและการยืนยันการรับในอินสแตนซ์แอปที่เป็นไปตามเงื่อนไข

ในส่วนถัดไป คุณจะได้เรียนรู้เกี่ยวกับวิธีสมัครรับข้อมูล / ยกเลิกการสมัครรับข้อมูลอินสแตนซ์ของแอปไปยังหัวข้อโดยไม่ต้องสร้างอินสแตนซ์การเรียกจากฝั่งไคลเอ็นต์

c0dc20655d392690.gif

10. จัดการการสมัครรับข้อมูลหัวข้อจากฝั่งเซิร์ฟเวอร์

จนถึงตอนนี้ใน Codelab นี้ การเรียกใช้การสมัครรับข้อมูลและการยกเลิกการสมัครรับข้อมูลหัวข้อทั้งหมดจะเริ่มต้นจากอินสแตนซ์ของแอป

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

ในส่วนนี้ คุณจะได้เรียนรู้วิธีใช้ Firebase Admin SDK เพื่อสมัครรับข้อมูลและยกเลิกการสมัครรับข้อมูลโทเค็นการลงทะเบียน FCM เป็นกลุ่มในหัวข้อหนึ่งๆ โดยการเรียกจากฝั่งเซิร์ฟเวอร์

ใช้การสมัครรับข้อมูลฝั่งเซิร์ฟเวอร์ของโทเค็นการลงทะเบียน FCM ไปยังหัวข้อ FCM

  1. ในโค้ดเซิร์ฟเวอร์ ให้ไปที่FcmSubscriptionManager.java class ค้นหาเมธอดที่ชื่อ subscribeFcmRegistrationTokensToTopic คุณจะใช้การเรียก API ของ subscribeToTopic ที่นี่

5d5709e7b3cbcb04.png

  1. มาสมัครรับข้อมูลอินสแตนซ์ของแอปในหัวข้อพลังงานกัน โดยก่อนอื่นให้ระบุข้อมูลสำหรับ 2 ฟิลด์ต่อไปนี้
    1. registrationTokens: รายการสตริงที่คั่นด้วยคอมมาซึ่งแสดงโทเค็นการลงทะเบียน FCM ที่คุณต้องการสร้างการติดตามหัวข้อ
    2. topicName: ชื่อหัวข้อสำหรับหัวข้อพลังงาน เช่น /topics/Energy
  2. ในบรรทัดถัดไป ให้ใช้การเรียกตามบรรทัดต่อไปนี้
TopicManagementResponse response = FirebaseMessaging.getInstance().subscribeToTopic(
        registrationTokens, topicName);
  1. คุณสามารถตรวจสอบ TopicManagementResponse เพื่อดูสถิติผลลัพธ์ระดับสูงบางอย่างได้ เช่น การพิมพ์จำนวนการสมัครรับหัวข้อที่สร้างสำเร็จโดยใช้ getSuccessCount
System.out.printf("Num tokens successfully subscribed %d", response.getSuccessCount());
  1. สุดท้าย ในฟังก์ชัน main ให้เปิดใช้การเรียกไปยังฟังก์ชัน subscribeFcmRegistrationTokensToTopic เท่านั้น

สร้างการสมัครใช้บริการและส่งข้อความหัวข้อ

  1. ตอนนี้คุณพร้อมที่จะสร้างการสมัครใช้บริการหัวข้อและส่งข้อความไปยังหัวข้อแล้ว
  2. เรียกใช้ฟังก์ชัน main ของชั้นเรียน FcmSubscriptionManager.java การดำเนินการนี้จะสร้างการสมัครใช้บริการหัวข้อ
  3. ตอนนี้ให้ตั้งค่าโค้ดเพื่อส่งข้อความ เช่นเดียวกับก่อนหน้านี้
    1. ใน FcmSender.java ให้ค้นหาฟังก์ชัน sendMessageToFcmTopic
    2. ตั้งค่า topicName เป็นหัวข้อพลังงาน เช่น /topics/Energy.
    3. สร้างออบเจ็กต์ Message และกำหนดเป้าหมายไปยังหัวข้อโดยใช้ setTopic
    4. สุดท้าย ให้อัปเดตเมธอด main เพื่อเปิดใช้ฟังก์ชัน sendMessageToFcmTopic เท่านั้น
  4. เรียกใช้ฟังก์ชัน main ของ FcmSender.java การดำเนินการนี้จะส่งข้อความไปยังอินสแตนซ์แอปของคุณ และคุณจะสังเกตเห็นข้อความในแอปได้ดังนี้
    1. อินสแตนซ์ของแอปในเบื้องหน้า
    40ab6cf71e0e4116.png
    1. อินสแตนซ์ของแอปในเบื้องหลัง
    8fba81037198209e.png

ใช้การยกเลิกการสมัครรับข้อมูลโทเค็นการลงทะเบียน FCM จากหัวข้อ FCM ทางฝั่งเซิร์ฟเวอร์

  1. หากต้องการยกเลิกการติดตามหัวข้อฝั่งเซิร์ฟเวอร์ ให้ใช้ unsubscribeFromTopic API นี้ คุณจะเพิ่มโค้ดที่เกี่ยวข้องลงในunsubscribeFcmRegistrationTokensFromTopicฟังก์ชันของคลาส FcmSubscriptionManager.java

8d9e8ea9d34016bd.png

  1. คุณจะต้องใช้โค้ดการยกเลิกการสมัครรับอีเมลฝั่งเซิร์ฟเวอร์และตรวจสอบผลลัพธ์โดยการส่งข้อความหัวข้อ

11. ขอแสดงความยินดี

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

947def3eb33b1e4a.gif

ขั้นตอนต่อไปคืออะไร

ตอนนี้คุณได้ทำ Codelab เสร็จแล้ว ลองดูหัวข้อสำหรับแพลตฟอร์มอื่นๆ โดยใช้คำแนะนำต่อไปนี้

เอกสารอ้างอิง