| เลือกแพลตฟอร์ม | iOS+ Android Web Flutter Unity C++ |
หากต้องการรับข้อความ คุณสามารถใช้บริการที่ขยาย FirebaseMessagingService ได้
บริการของคุณควรลบล้าง Callback onMessageReceived และ onDeletedMessages ดูตัวอย่างที่เสร็จสมบูรณ์ได้ในตัวอย่างคู่มือเริ่มใช้งานฉบับย่อ Firebase Cloud Messaging
onMessageReceived มีไว้สำหรับข้อความเกือบทุกประเภท ยกเว้นข้อความต่อไปนี้
ข้อความแจ้งเตือนที่ส่งเมื่อแอปอยู่เบื้องหลัง ในกรณีนี้ ระบบจะส่งการแจ้งเตือนไปยังถาดระบบของอุปกรณ์ การแตะการแจ้งเตือนของผู้ใช้จะเปิดตัวเปิดแอปโดยค่าเริ่มต้น
ข้อความที่มีทั้งเพย์โหลดการแจ้งเตือนและข้อมูลเมื่อได้รับในเบื้องหลัง ในกรณีนี้ ระบบจะส่งการแจ้งเตือนไปยังถาดระบบของอุปกรณ์ และส่งเพย์โหลดข้อมูลในส่วนเสริมของ Intent ของกิจกรรม Launcher
บทสรุปมีดังนี้:
| สถานะแอป | การแจ้งเตือน | ข้อมูล | ทั้งสอง |
|---|---|---|---|
| พื้นหน้า | onMessageReceived |
onMessageReceived |
onMessageReceived |
| ข้อมูลเบื้องต้น | ถาดระบบ | onMessageReceived |
การแจ้งเตือน: ถาดระบบ ข้อมูล: ในส่วนเพิ่มเติมของ Intent |
ดูข้อมูลเพิ่มเติมเกี่ยวกับประเภทข้อความได้ที่การแจ้งเตือนและข้อความข้อมูล
Callback onMessageReceived มีกรอบเวลาการดำเนินการสั้นๆ ปัจจัยหลายอย่างอาจส่งผลต่อระยะเวลาของกรอบเวลานี้ ซึ่งรวมถึงความล่าช้าของระบบปฏิบัติการ เวลาเริ่มต้นของแอป เทรดหลักถูกบล็อกโดยการดำเนินการอื่นๆ หรือการเรียก onMessageReceived ก่อนหน้านี้ใช้เวลานานเกินไป
ด้วยเหตุนี้ คุณจึงควรหลีกเลี่ยงงานที่ใช้เวลานาน (เช่น การดึงรูปภาพจากเซิร์ฟเวอร์เพื่อแสดงในการแจ้งเตือน) ใน onMessageReceived และกำหนดเวลางานโดยใช้ WorkManager เพื่อจัดการงานที่อาจใช้เวลามากกว่า 2-3 วินาทีจึงจะเสร็จสมบูรณ์แทน ดูข้อมูลเพิ่มเติมเกี่ยวกับลำดับความสำคัญของข้อความและผลกระทบต่อการประมวลผลได้ที่การประมวลผลข้อความสำหรับข้อความที่มีลำดับความสำคัญสูงและปกติ
แก้ไขไฟล์ Manifest ของแอป
หากต้องการใช้ FirebaseMessagingService คุณต้องเพิ่มรายการต่อไปนี้ในไฟล์ Manifest ของแอป
<service
android:name=".java.MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
เราขอแนะนำให้ตั้งค่าเริ่มต้นเพื่อปรับแต่งลักษณะที่ปรากฏของการแจ้งเตือน คุณสามารถระบุไอคอนเริ่มต้นที่กำหนดเองและสีเริ่มต้นที่กำหนดเองซึ่งจะใช้เมื่อใดก็ตามที่ไม่ได้ตั้งค่าที่เทียบเท่าในเพย์โหลดการแจ้งเตือน
เพิ่มบรรทัดต่อไปนี้ภายในแท็ก application เพื่อตั้งค่าไอคอนเริ่มต้นที่กำหนดเองและสีแบบกำหนดเอง
<!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
See README(https://goo.gl/l4GJaQ) for more. -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_stat_ic_notification" />
<!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
notification message. See README(https://goo.gl/6BKBk7) for more. -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/colorAccent" />
Android จะแสดงและใช้ไอคอนเริ่มต้นที่กำหนดเองสำหรับ
ข้อความแจ้งเตือนทั้งหมดที่ส่งจากNotifications Composerในคอนโซล Firebase
ข้อความแจ้งเตือนที่ไม่ได้ตั้งค่าไอคอนอย่างชัดเจนในเพย์โหลดการแจ้งเตือน
หากไม่ได้ตั้งค่าไอคอนเริ่มต้นที่กำหนดเองและไม่ได้ตั้งค่าไอคอนในเพย์โหลดการแจ้งเตือน Android จะแสดงไอคอนแอปพลิเคชันที่แสดงผลเป็นสีขาว
ลบล้าง onMessageReceived
การลบล้างเมธอด FirebaseMessagingService.onMessageReceived จะช่วยให้คุณดำเนินการตามออบเจ็กต์ RemoteMessage ที่ได้รับและรับข้อมูลข้อความได้ ดังนี้
Kotlin
override fun onMessageReceived(remoteMessage: RemoteMessage) { // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: ${remoteMessage.from}") // Check if message contains a data payload. if (remoteMessage.data.isNotEmpty()) { Log.d(TAG, "Message data payload: ${remoteMessage.data}") // Check if data needs to be processed by long running job if (needsToBeScheduled()) { // For long-running tasks (10 seconds or more) use WorkManager. scheduleJob() } else { // Handle message within 10 seconds handleNow() } } // Check if message contains a notification payload. remoteMessage.notification?.let { Log.d(TAG, "Message Notification Body: ${it.body}") } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. }
Java
@Override public void onMessageReceived(RemoteMessage remoteMessage) { // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: " + remoteMessage.getFrom()); // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); if (/* Check if data needs to be processed by long running job */ true) { // For long-running tasks (10 seconds or more) use WorkManager. scheduleJob(); } else { // Handle message within 10 seconds handleNow(); } } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. }
ลบล้าง onDeletedMessages
ในบางสถานการณ์ FCM อาจไม่ส่งข้อความ กรณีนี้จะเกิดขึ้นเมื่อมีข้อความที่รอดำเนินการสำหรับแอปของคุณในอุปกรณ์หนึ่งๆ มากเกินไป (>100 ข้อความ) ในขณะที่เชื่อมต่อ หรือหากอุปกรณ์ไม่ได้เชื่อมต่อกับ FCM นานกว่า 1 เดือน ในกรณีเหล่านี้ คุณอาจได้รับการติดต่อกลับที่หมายเลข FirebaseMessagingService.onDeletedMessages() เมื่ออินสแตนซ์ของแอปได้รับ Callback นี้ อินสแตนซ์ควรทำการซิงค์แบบเต็มกับเซิร์ฟเวอร์แอป หากคุณไม่ได้ส่งข้อความไปยังแอปในอุปกรณ์นั้นภายใน 4 สัปดาห์ที่ผ่านมา FCM จะไม่โทรหา onDeletedMessages()
จัดการข้อความแจ้งเตือนในแอปที่ทำงานอยู่เบื้องหลัง
เมื่อแอปทำงานอยู่เบื้องหลัง Android จะส่งข้อความแจ้งเตือนไปยังถาดระบบ การแตะการแจ้งเตือนของผู้ใช้จะเปิดตัวเปิดแอปโดยค่าเริ่มต้น
ซึ่งรวมถึงข้อความที่มีทั้งเพย์โหลดการแจ้งเตือนและเพย์โหลดข้อมูล (และข้อความทั้งหมดที่ส่งจาก Notifications Composer ในคอนโซล Firebase) ในกรณีเหล่านี้ ระบบจะส่งการแจ้งเตือนไปยังถาดระบบของอุปกรณ์ และส่งเพย์โหลดข้อมูลในส่วนเสริมของ Intent ของกิจกรรม Launcher
หากต้องการดูข้อมูลเชิงลึกเกี่ยวกับการส่งข้อความไปยังแอป ให้ไปที่แดชบอร์ดDevOps และการมีส่วนร่วม > การรับส่งข้อความ > รายงานในคอนโซล Firebase แดชบอร์ดนี้จะบันทึกจำนวนข้อความที่ส่งและเปิดในอุปกรณ์ Apple และอุปกรณ์ Android พร้อมกับข้อมูล "การแสดงผล" (การแจ้งเตือนที่ผู้ใช้เห็น) สำหรับแอป Android