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

1. บทนำ

เป้าหมาย

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

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

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

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

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

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

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

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

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

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

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

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

  • เบราว์เซอร์ที่คุณต้องการ เช่น Chrome
  • IntelliJ IDEA IDE สำหรับการพัฒนาแอปพลิเคชัน Java
    • อย่าลืมเลือกใช้การสนับสนุนสำหรับ Gradle ขณะติดตั้ง
  • Android Studio IDE สำหรับการพัฒนาแอปพลิเคชัน 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 ของ Branch ของ fcm-topics-codelab ทำตามขั้นตอนต่อไปนี้เพื่อเข้าถึงโค้ดเริ่มต้น ซึ่งประกอบด้วย 2 ไดเรกทอรี ได้แก่ StockNewsApp และ StockNewsServer แอปแรกมีแอป Android เริ่มต้นและในภายหลังมีโค้ดฝั่งเซิร์ฟเวอร์ของเงื่อนไขเริ่มต้น

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

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

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

  1. ในคอนโซล Firebase ให้คลิกเพิ่มโปรเจ็กต์ ตั้งชื่อโปรเจ็กต์ Firebase ว่า StockNews แล้วคลิกต่อไป หมายเหตุ: โปรดจำรหัสโปรเจ็กต์ของโปรเจ็กต์ Firebase (หรือคลิกไอคอนแก้ไขเพื่อตั้งค่ารหัสโปรเจ็กต์ที่ต้องการ)

fc08f9a7808e4553.png

  1. คุณข้ามการเปิดใช้ Google Analytics ได้ สำหรับวัตถุประสงค์ของ Codelab นี้ คุณไม่จำเป็นต้องใช้งาน คลิกต่อไป
  2. คลิกสร้างโครงการ

ยินดีด้วย คุณเพิ่งสร้างโปรเจ็กต์ Firebase ตอนนี้คุณสามารถคลิกชื่อโปรเจ็กต์เพื่อเข้าสู่คอนโซลได้

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

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

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

ตามวัตถุประสงค์ของ Codelab นี้ เราจะเพิ่มแอป Android Firebase

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 ไม่ติดตามการเปลี่ยนแปลงในเครื่องทั้งหมด คุณสามารถคลิก "เพิกเฉย" หรือ "X" ที่ด้านขวาบน (จะไม่มีการส่งการเปลี่ยนแปลงใดๆ กลับไปยังที่เก็บ Git)

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

b574ea0089ee87c6.png

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

4bc64eb3b99eb0ae.png

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

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

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

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

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

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

f04ff8f48d186dff.png

  • ใน AndroidManifest.xml มีการเพิ่มเครื่องจัดการ Callback 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 ประกอบด้วยรายการหมวดหมู่หุ้นทั้งหมดและชื่อหัวข้อที่เกี่ยวข้อง

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 อาจใช้เวลา 2-3 นาทีในการสร้างโปรเจ็กต์ รวมถึงการดึงทรัพยากร Dependency ที่จำเป็น

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

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

650fc733298588f8.png

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

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

  1. ก่อนอื่น เราต้องสร้างบัญชีบริการ Firebase ที่อนุญาตให้ผู้ดูแลระบบ Firebase SDK ให้สิทธิ์การเรียก 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. ณ จุดนี้ รหัสเซิร์ฟเวอร์พร้อมแล้ว เรียกใช้บิลด์ -> สร้างโปรเจ็กต์จากแถบเมนูด้านบน

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

  1. ใน FcmSender.java ให้ค้นหาฟังก์ชัน sendMessageToFcmRegistrationToken แล้วแทรกโทเค็นการลงทะเบียน FCM ที่คัดลอกมาจากส่วนเรียกใช้แอปเริ่มต้นลงในช่อง registrationToken
  2. ในฟังก์ชัน main ให้ยกเลิกการเลือกเฉพาะฟังก์ชัน sendMessageToFcmRegistrationToken แล้วคลิกเรียกใช้เพื่อเรียกใช้โค้ด
    1. ดูวิธีที่ตั้งค่าโทเค็นการลงทะเบียน FCM ในช่อง Token ของออบเจ็กต์ message
    2. นอกจากนี้ โปรดดูวิธีที่เราใช้ send API ของอินเทอร์เฟซ 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 ตามลำดับ ทั้งนี้ขึ้นอยู่กับการเปิด/ปิดสวิตช์
  • onBindViewHolder ของอะแดปเตอร์ RecyclerView เรียกใช้เมธอด setData เพื่อเชื่อมโยง 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. ในทำนองเดียวกัน ในเงื่อนไขอื่น คุณจะใช้การเรียก unsubscribeFromTopic API สิ่งที่จะเกิดขึ้นมีดังนี้
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

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

  • && : ตรรกะ 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 ค้นหาเมธอดชื่อ subscribeFcmRegistrationTokensToTopic คุณจะใช้การเรียก subscribeToTopic API ที่นี่

5d5709e7b3cbcb04.png

  1. มาสมัครใช้บริการอินสแตนซ์ของแอปในหัวข้อพลังงานกัน ซึ่งทำได้โดยการระบุข้อมูลสำหรับสองฟิลด์ต่อไปนี้ก่อน:
    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 เสร็จสมบูรณ์แล้ว ลองพิจารณาลองใช้หัวข้อสำหรับแพลตฟอร์มอื่นๆ โดยใช้คำแนะนำต่อไปนี้

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