หากใช้ FCMAPI เพื่อสร้างคำขอส่งแบบเป็นโปรแกรม คุณอาจพบว่าเมื่อเวลาผ่านไป คุณกำลังสิ้นเปลืองทรัพยากรโดยการส่งข้อความไปยังอุปกรณ์ที่ไม่ได้ใช้งานซึ่งมีการลงทะเบียนที่ล้าสมัย สถานการณ์นี้อาจส่งผลต่อข้อมูลการนำส่งข้อความที่รายงานในFirebaseคอนโซลหรือข้อมูลที่ส่งออกไปยัง BigQuery ซึ่งแสดงเป็นการลดลงของอัตราการนำส่งอย่างมาก (แต่ไม่ถูกต้องจริง) คำแนะนำนี้จะกล่าวถึงมาตรการบางอย่างที่คุณสามารถใช้เพื่อช่วยให้มั่นใจว่าการกำหนดเป้าหมายข้อความจะมีประสิทธิภาพและมีการรายงานการนำส่งที่ถูกต้อง
การจดทะเบียนที่ล้าสมัยและหมดอายุ
การลงทะเบียนที่ล้าสมัยจะเชื่อมโยงกับอุปกรณ์ที่ไม่ได้ใช้งานซึ่งไม่ได้เชื่อมต่อกับ FCM เป็นเวลานานกว่า 1 เดือน เมื่อเวลาผ่านไป โอกาสที่อุปกรณ์จะเชื่อมต่อกับ FCM อีกครั้งจะลดลงเรื่อยๆ ระบบไม่น่าจะส่งข้อความและ การส่งต่อหัวข้อสำหรับการลงทะเบียนที่ล้าสมัยเหล่านี้ได้
การจดทะเบียนอาจล้าสมัยได้จากหลายสาเหตุ เช่น อุปกรณ์ที่เชื่อมโยงกับการลงทะเบียนอาจสูญหาย ถูกทำลาย หรือเก็บไว้ในที่เก็บและถูกลืม
สำหรับ Android เมื่อการจดทะเบียนไม่มีการใช้งานเป็นเวลา 270 วัน FCM จะถือว่าหมดอายุและจะล้างข้อมูล เมื่อการจดทะเบียนหมดอายุ FCM จะทำเครื่องหมายว่าไม่ถูกต้องและปฏิเสธการส่งไปยังโดเมนนั้น โปรดทราบว่าบริการการติดตั้ง Firebase (FIS) เป็นผู้จัดการรหัสการติดตั้ง Firebase (FID) ไม่ใช่ FCM ในกรณีที่พบได้ยากซึ่งอุปกรณ์เชื่อมต่ออีกครั้งและแอปเปิดขึ้นหลังจากที่ระบบล้างข้อมูลการลงทะเบียน แล้ว แอปไคลเอ็นต์จะลงทะเบียนอีกครั้งด้วย FCM โดยใช้ FID ที่ดึงมาจาก FIS โปรดทราบว่า FID อาจเปลี่ยนแปลงได้ ดูรายละเอียดเกี่ยวกับเวลาที่ออก FID ใหม่ได้ที่จัดการการติดตั้ง Firebase
สำหรับแพลตฟอร์มอื่นๆ เช่น iOS FCM จะอาศัยบริการพุชพื้นฐาน (เช่น APNs) ซึ่งไม่มีการหมดอายุตามระยะเวลา 270 วันที่ไม่มีการใช้งานเหมือนกัน เราขอแนะนำให้คุณรักษาความสดใหม่ของการจดทะเบียน และนำการจดทะเบียนที่ล้าสมัยออก
แนวทางปฏิบัติแนะนำขั้นพื้นฐาน
มีแนวทางปฏิบัติพื้นฐานบางอย่างที่คุณควรปฏิบัติตามในแอปใดก็ตามที่ใช้ FCM API เพื่อสร้างคำขอส่งแบบเป็นโปรแกรม แนวทางปฏิบัติแนะนำหลักๆ มีดังนี้
- ดึงข้อมูลรหัสการติดตั้ง Firebase (FID) จาก FCM แล้วจัดเก็บไว้ในเซิร์ฟเวอร์แอป บทบาทสำคัญของเซิร์ฟเวอร์คือการติดตาม FID ที่ลงทะเบียนของไคลเอ็นต์แต่ละรายและเก็บรายการ FID ที่ใช้งานอยู่ซึ่งอัปเดตแล้ว เราขอแนะนำเป็นอย่างยิ่งให้ใช้ การประทับเวลาการลงทะเบียนในฐานข้อมูล และอัปเดตทุกครั้งที่มีการอัปโหลด การลงทะเบียน
- รักษาความใหม่ของการจดทะเบียนและนำการจดทะเบียนที่ล้าสมัยออก นอกจากการนำการจดทะเบียนที่ FCM ไม่ถือว่า ถูกต้องอีกต่อไปออกแล้ว คุณอาจต้องตรวจสอบสัญญาณอื่นๆ ที่บ่งบอกว่าการจดทะเบียนล้าสมัยและนำออกโดยเชิงรุก คู่มือนี้จะกล่าวถึงตัวเลือกบางอย่าง ในการดำเนินการดังกล่าว
เรียกข้อมูลและจัดเก็บรหัสการติดตั้ง Firebase
เมื่อเริ่มต้นแอปครั้งแรก FCM SDK จะลงทะเบียนอินสแตนซ์ของแอป กับ FCM และแสดงรหัสการติดตั้ง Firebase (FID) นี่คือตัวระบุที่คุณต้องใส่ในคำขอส่งที่กำหนดเป้าหมายจาก API หรือใช้สำหรับการสมัครรับข้อมูลหัวข้อ
เราขอแนะนำให้บันทึก FID ไปยังเซิร์ฟเวอร์แอปพร้อมกับประทับเวลา ทุกครั้งที่อัปโหลด การอัปเดตการประทับเวลาในคำขออัปโหลดทุกครั้งจะช่วยให้เซิร์ฟเวอร์ทราบเวลาที่เปิดอินสแตนซ์แอปครั้งล่าสุดและซิงค์กับแบ็กเอนด์ของ FCM ได้สำเร็จ
คุณควรจัดการการลงทะเบียนและการอัปเดตดังนี้ ทั้งนี้ขึ้นอยู่กับว่าได้เปิดใช้หรือปิดใช้การเริ่มต้นอัตโนมัติ (รวมถึงไม่รองรับ) หรือไม่
- (แนะนำ) เมื่อเปิดใช้การเริ่มต้นอัตโนมัติ SDK จะ
ต่ออายุการลงทะเบียนและตรวจสอบการเปลี่ยนแปลงโดยอัตโนมัติ ระบบจะเรียกใช้
onRegistered()การเรียกกลับเป็นประจำในการซิงค์กิจวัตรระหว่างการเริ่มต้นแอป รวมถึง เมื่อเกิดการเปลี่ยนแปลง FID เพียงใช้การเรียกกลับนี้เพื่ออัปโหลด FID ไปยังเซิร์ฟเวอร์และบันทึกการประทับเวลาปัจจุบัน - เมื่อปิดใช้การเริ่มต้นอัตโนมัติ: ระบบจะไม่เรียกใช้แฮนเดิล
onRegistered()โดยอัตโนมัติเมื่อเริ่มต้น หากต้องการติดตามการลงทะเบียนและ ให้ข้อมูลเป็นปัจจุบัน ให้เรียกใช้register()เมื่อเริ่มต้นแอป เช่น ใน Android ให้เรียกใช้ในonCreate()ของกิจกรรมหลัก การเรียกที่สำเร็จจะทริกเกอร์กระบวนการลงทะเบียน FCM โดยใช้ FID และส่งไปยังonRegistered()การเรียกกลับ ซึ่งจะช่วยให้แอปอัปโหลด FID และอัปเดตการประทับเวลาใน เซิร์ฟเวอร์ได้
ตัวอย่าง: จัดเก็บ FID และการประทับเวลาใน Cloud Firestore
เช่น คุณอาจใช้ Cloud Firestore เพื่อจัดเก็บ FID ในคอลเล็กชันที่ชื่อว่า
fcmRegistrations รหัสเอกสารแต่ละรายการในคอลเล็กชันจะสอดคล้องกับรหัสผู้ใช้
และเอกสารจะจัดเก็บ FID ปัจจุบันและการประทับเวลาที่อัปเดตล่าสุด ใช้ฟังก์ชัน
set ตามที่แสดงในตัวอย่าง Kotlin นี้
private fun sendRegistrationToServer(installationId: String?) {
// If you're running your own server, call API to send registration details and today's date for the user
// Example shown uses Firestore
// Add FID and timestamp to Firestore for this user
val deviceFid = hashMapOf(
"installationId" to installationId,
"timestamp" to FieldValue.serverTimestamp(),
)
// Get user ID from Firebase Auth or your own server
Firebase.firestore.collection("fcmRegistrations").document("myuserid")
.set(deviceFid)
}
เมื่อใดก็ตามที่ลงทะเบียนหรืออัปเดตรหัสการติดตั้ง Firebase สำเร็จ ระบบจะเรียกใช้แฮนเดิลการเรียกกลับ
onRegistered()
คุณควรใช้ Callback นี้เพื่ออัปโหลด FID และ
อัปเดตการประทับเวลา
override fun onRegistered(installationId: String) {
Log.d(TAG, "Registered installation ID: $installationId")
// Send the Firebase Installation ID (FID) to your app server. Your app
// server should save the FID and update the timestamp upon receipt.
sendRegistrationToServer(installationId)
}
สำหรับอินสแตนซ์ที่ปิดใช้การเริ่มต้นอัตโนมัติ ให้เรียกใช้
register()
เมื่อแอปเริ่มต้น (เช่น ใน onCreate()) เพื่อทริกเกอร์ขั้นตอนการลงทะเบียนและการนำส่ง FID
ผ่าน
onRegistered():
// Trigger manual registration if auto-initialization is turned off.
FirebaseMessaging.getInstance().register()
.addOnCompleteListener(this) { task ->
if (task.isSuccessful) {
// The registration callback onRegistered() will be invoked with the current FID.
} else {
Log.w(TAG, "Failed to register with Firebase Cloud Messaging", task.exception)
}
}
รักษาความใหม่ของการจดทะเบียนและนำการจดทะเบียนที่ล้าสมัยออก
การพิจารณาว่าการลงทะเบียนเป็นข้อมูลล่าสุดหรือล้าสมัยอาจไม่ใช่เรื่องง่ายเสมอไป คุณควรกำหนดเกณฑ์สำหรับเวลาที่คุณ พิจารณาว่าการจดทะเบียนล้าสมัยแล้ว เพื่อให้ครอบคลุมทุกกรณี โดยค่าเริ่มต้น FCM จะถือว่าการลงทะเบียน ล้าสมัยหากอินสแตนซ์แอปไม่ได้เชื่อมต่อเป็นเวลา 1 เดือน การลงทะเบียนที่เก่ากว่า 1 เดือนมักจะเป็นอุปกรณ์ที่ไม่ได้ใช้งาน ส่วนอุปกรณ์ที่ใช้งานอยู่จะรีเฟรชการลงทะเบียน
ระยะเวลา 1 เดือนอาจสั้นหรือยาวเกินไป ทั้งนี้ขึ้นอยู่กับ Use Case ของคุณ ดังนั้นคุณจึงต้องเป็นผู้กำหนดเกณฑ์ที่เหมาะกับคุณ
ตรวจหาคำตอบที่ไม่ถูกต้องจากแบ็กเอนด์ของ FCM
โปรดตรวจหาการตอบกลับที่ไม่ถูกต้องจาก FCM และตอบกลับโดยลบการลงทะเบียนที่ทราบว่าไม่ถูกต้องหรือหมดอายุแล้วออกจากระบบ เมื่อใช้ HTTP v1 API ข้อความแสดงข้อผิดพลาดเหล่านี้อาจบ่งชี้ว่าคำขอส่งของคุณ กำหนดเป้าหมายการลงทะเบียนที่ไม่ถูกต้องหรือหมดอายุแล้ว
UNREGISTERED(HTTP 404)INVALID_ARGUMENT(HTTP 400)
หากคุณมั่นใจว่าเพย์โหลดของข้อความถูกต้องและคุณได้รับการตอบกลับอย่างใดอย่างหนึ่งต่อไปนี้ สำหรับการลงทะเบียนที่กำหนดเป้าหมาย คุณสามารถลบบันทึกการลงทะเบียนนี้ได้ เนื่องจากการลงทะเบียนนี้จะไม่มีวันถูกต้องอีก เช่น หากต้องการลบการลงทะเบียนที่ไม่ถูกต้องออกจาก Cloud Firestore คุณสามารถติดตั้งใช้งานและเรียกใช้ฟังก์ชัน เช่นเดียวกับฟังก์ชันต่อไปนี้
// Firebase Installation ID comes from the client FCM SDKs
const firebaseInstallationId = 'YOUR_FIREBASE_INSTALLATION_ID';
const message = {
data: {
// Information you want to send inside of notification
},
fid: firebaseInstallationId
};
// Send message to device with provided Firebase Installation ID
getMessaging().send(message)
.then((response) => {
// Response is a message ID string.
})
.catch((error) => {
// Delete registration for user if error code is UNREGISTERED or INVALID_ARGUMENT.
if (error.errorCode == "messaging/registration-token-not-registered") {
// If you're running your own server, call API to delete the registration for the user
// Example shown uses Firestore
// Get user ID from Firebase Auth or your own server
Firebase.firestore.collection("fcmRegistrations").document(user.uid).delete()
}
});
FCM จะส่งคืนการตอบกลับที่ไม่ถูกต้องหากการลงทะเบียนสำหรับอุปกรณ์ Android หมดอายุหลังจากไม่มีการใช้งานเป็นเวลา 270 วัน หรือหากไคลเอ็นต์ยกเลิกการลงทะเบียนอย่างชัดเจน หากต้องการติดตามความล้าสมัยอย่างแม่นยำมากขึ้นตามคำจำกัดความของคุณเอง คุณสามารถนำการลงทะเบียนที่ล้าสมัยออกได้
อัปเดตการจดทะเบียนเป็นประจำ
ไม่ว่าการลงทะเบียนจะอิงตาม FID หรือโทเค็นการลงทะเบียนเดิม เซิร์ฟเวอร์ควรจะอัปเดตการประทับเวลาการลงทะเบียนในฐานข้อมูลทุกครั้งที่มีคำขออัปโหลด การประทับเวลาดังกล่าวทำหน้าที่เป็นสัญญาณสำหรับการติดตั้งแอป ซึ่งช่วยให้ไคลเอ็นต์เปิดแอปและซิงค์กับแบ็กเอนด์ของ FCM ได้สำเร็จ ใช้กลยุทธ์ที่เหมาะสมโดยขึ้นอยู่กับ API ที่คุณใช้
API รหัสการติดตั้ง Firebase (แนะนำ)
สำหรับแอปไคลเอ็นต์ที่ใช้ FID API คุณไม่จำเป็นต้องกำหนดเวลางานที่ทำงานในเบื้องหลังเป็นระยะๆ ในแอปไคลเอ็นต์เพื่อดึงหรือรีเฟรชการลงทะเบียน SDK
จะจัดการการรีเฟรชโดยอัตโนมัติภายใต้การเริ่มต้นอัตโนมัติ
และส่ง FID ปัจจุบันที่ถูกต้องไปยัง
onRegistered()
การเรียกกลับในการซิงค์ตามปกติระหว่างการเริ่มต้นแอป
หากต้องการอัปเดตเซิร์ฟเวอร์อยู่เสมอ ให้ใช้กลยุทธ์การอัปโหลดเมื่อเริ่มต้นที่อธิบายไว้ใน ดึงและจัดเก็บรหัสการติดตั้ง Firebase
- เปิดใช้การเริ่มต้นอัตโนมัติ: SDK จะตรวจสอบโดยอัตโนมัติว่าระบบได้ส่ง FID ล่าสุดไปยังเซิร์ฟเวอร์ของคุณในการซิงค์ตามปกติระหว่างการเริ่มต้นแอป
- ปิดใช้หรือไม่มีการรองรับการเริ่มต้นอัตโนมัติ: เรียกใช้
register()เมื่อแอปเริ่มต้น (เช่น ใน Android ในonCreate()ของกิจกรรมหลัก) เพื่อบังคับลำดับการลงทะเบียนและทริกเกอร์การนำส่ง FID ไปยังonRegistered()การเรียกกลับ
กลยุทธ์เหล่านี้รับประกันว่าเซิร์ฟเวอร์ของคุณจะมี FID ที่ใช้งานล่าสุดอยู่เสมอและสามารถ กู้คืนจากการอัปโหลดที่ไม่สำเร็จได้โดยอัตโนมัติ ทำให้แอปพลิเคชันมีความยืดหยุ่นสูง
API โทเค็นการลงทะเบียนที่เลิกใช้งานแล้ว
หากคุณใช้โทเค็นการลงทะเบียนเดิม SDK ของไคลเอ็นต์จะไม่จัดการการรีเฟรชโดยอัตโนมัติในการซิงค์ตามปกติ ดังนั้น เราขอแนะนำให้ คุณเรียกข้อมูลและอัปเดตโทเค็นการลงทะเบียนทั้งหมดในเซิร์ฟเวอร์เป็นระยะๆ โดยคุณต้องดำเนินการต่อไปนี้
- เพิ่มตรรกะของแอปในแอปไคลเอ็นต์เพื่อเรียกโทเค็นปัจจุบันโดยใช้การเรียก API ที่เหมาะสม (เช่น
token(completion):สำหรับแพลตฟอร์ม Apple หรือgetToken()สำหรับ Android) จากนั้นส่งโทเค็นปัจจุบันไปยังเซิร์ฟเวอร์ของแอปเพื่อจัดเก็บ (พร้อมการประทับเวลา) ซึ่งอาจเป็นงานรายเดือนที่กำหนดค่าให้ครอบคลุมไคลเอ็นต์หรือโทเค็นทั้งหมด - เพิ่มตรรกะของเซิร์ฟเวอร์เพื่ออัปเดตการประทับเวลาของโทเค็นเป็นระยะๆ ไม่ว่าโทเค็นจะมีการเปลี่ยนแปลงหรือไม่ก็ตาม
ดูตัวอย่างตรรกะของ Android สําหรับการอัปเดตโทเค็นเดิมโดยใช้ WorkManager ได้ที่การจัดการโทเค็น Cloud Messaging ในบล็อกของ Firebase
ไม่ว่าคุณจะใช้รูปแบบการกำหนดเวลาใด โปรดอย่าลืมอัปเดตโทเค็นเป็นระยะๆ ความถี่ในการอัปเดตเดือนละครั้งช่วยให้แบตเตอรี่ไม่ได้รับผลกระทบมากนัก และตรวจพบโทเค็นการลงทะเบียนที่ไม่มีการใช้งาน การรีเฟรชนี้ยังช่วยให้มั่นใจได้ว่าอุปกรณ์ที่ไม่มีการใช้งานจะรีเฟรชการลงทะเบียนเมื่อกลับมาใช้งานอีกครั้ง การรีเฟรชบ่อยกว่าสัปดาห์ละครั้งไม่ก่อให้เกิดประโยชน์ใดๆ
นำการลงทะเบียนที่ล้าสมัยออก
ก่อนส่งข้อความไปยังอุปกรณ์ โปรดตรวจสอบว่าการประทับเวลาของการลงทะเบียนอุปกรณ์อยู่ภายในระยะเวลาของหน้าต่างความล้าสมัย ตัวอย่างเช่น คุณสามารถ
ใช้ Cloud Functions for Firebase เพื่อเรียกใช้การตรวจสอบรายวันเพื่อให้แน่ใจว่า
การประทับเวลาอยู่ภายในระยะเวลาของกรอบเวลาความล้าที่กำหนด เช่น const
EXPIRATION_TIME = 1000 * 60 * 60 * 24 * 30; จากนั้นนำการลงทะเบียนที่ล้าสมัยออกได้โดยทำดังนี้
exports.pruneRegistrations = functions.pubsub.schedule('every 24 hours').onRun(async (context) => {
// Get all documents where the timestamp exceeds is not within the past month
const staleRegistrationsResult = await admin.firestore().collection('fcmRegistrations')
.where("timestamp", "<", Date.now() - EXPIRATION_TIME)
.get();
// Delete devices with stale registrations
staleRegistrationsResult.forEach(function(doc) { doc.ref.delete(); });
});
ยกเลิกการสมัครรับข้อมูลที่ล้าสมัยจากหัวข้อ
หากใช้หัวข้อ คุณอาจต้องยกเลิกการลงทะเบียนที่ล้าสมัยจากหัวข้อที่ลงทะเบียนไว้ด้วย โดยมี 2 ขั้นตอนดังนี้
- แอปควรสมัครรับหัวข้ออีกครั้งทุกครั้งที่รหัสการติดตั้ง Firebase (FID) เปลี่ยนแปลง ซึ่งจะช่วยให้การสมัครใช้บริการปรากฏอีกครั้งโดยอัตโนมัติเมื่อแอปกลับมาทำงานอีกครั้ง
- หากอินสแตนซ์ของแอปไม่ได้ใช้งานเป็นเวลา 1 เดือน (หรือช่วงเวลาที่ข้อมูลไม่เป็นปัจจุบันของคุณเอง) คุณควรยกเลิกการติดตามหัวข้อจากอินสแตนซ์ดังกล่าวโดยใช้ Firebase Admin SDK เพื่อลบการแมประหว่างรหัสการติดตั้ง Firebase กับหัวข้อออกจากแบ็กเอนด์ FCM
ข้อดีของ 2 ขั้นตอนนี้คือการส่งต่อจะเกิดขึ้นเร็วขึ้นเนื่องจากมี การลงทะเบียนที่ล้าสมัยน้อยลงที่จะส่งต่อ และอินสแตนซ์แอปที่ล้าสมัยจะ สมัครรับข้อมูลอีกครั้งโดยอัตโนมัติเมื่อกลับมาใช้งานได้อีกครั้ง
วัดความสำเร็จในการนำส่ง
หากต้องการทราบภาพรวมการนำส่งข้อความที่แม่นยำที่สุด คุณควรส่งข้อความไปยังอินสแตนซ์แอปที่ใช้งานอยู่เท่านั้น ซึ่งมีความสำคัญอย่างยิ่งหากคุณส่งข้อความไปยังหัวข้อที่มีผู้ติดตามจำนวนมากเป็นประจำ เนื่องจากหากผู้ติดตามบางส่วนไม่มีการใช้งานจริง สถิติการนำส่งของคุณอาจได้รับผลกระทบอย่างมากเมื่อเวลาผ่านไป
ก่อนกำหนดเป้าหมายข้อความไปยังอินสแตนซ์ของแอป ให้พิจารณาสิ่งต่อไปนี้
- Google Analytics, ข้อมูลที่บันทึกใน BigQuery หรือสัญญาณการติดตามอื่นๆ ระบุว่าการลงทะเบียนใช้งานอยู่หรือไม่
- การนำส่งครั้งก่อนๆ ล้มเหลวอย่างต่อเนื่องในช่วงระยะเวลาหนึ่งหรือไม่
- มีการอัปเดตรหัสการติดตั้ง Firebase ในเซิร์ฟเวอร์ของคุณในช่วงเดือนที่ผ่านมาหรือไม่
- สำหรับอุปกรณ์ Android FCM Data API
รายงานเปอร์เซ็นต์สูงของการนำส่งข้อความไม่สำเร็จเนื่องจาก
droppedDeviceInactiveหรือไม่
ดูข้อมูลเพิ่มเติมเกี่ยวกับการนำส่งได้ที่ทำความเข้าใจการนำส่งข้อความ