หากต้องการแก้ปัญหาการส่งข้อความที่ล้มเหลวอย่างต่อเนื่อง ให้ใช้เครื่องมือแก้ปัญหา FCM และดูบล็อกโพสต์นี้เพื่อทำความเข้าใจสาเหตุต่างๆ ที่อาจทำให้คุณไม่เห็นข้อความ นอกจากนี้ คุณยังไปที่แดชบอร์ดสถานะ FCM เพื่อดูว่ามีการหยุดชะงักของบริการที่ส่งผลต่อ FCM หรือไม่
นอกจากนี้ FCM ยังมีเครื่องมือ 3 ชุดที่จะช่วยให้คุณได้รับข้อมูลเชิงลึกเกี่ยวกับการประเมินความสำเร็จและกลยุทธ์ในการรับส่งข้อความในวงกว้าง ดังนี้
- รายงานการส่งข้อความในคอนโซล Firebase รายการ
- เมตริกการแสดงโฆษณา Android SDK ที่รวบรวมจาก Firebase Cloud Messaging Data API
- การส่งออกข้อมูลที่ครอบคลุมไปยัง Google BigQuery
การส่งออกข้อมูลไปยัง BigQuery และแท็บรายงานในคอนโซล Firebase ต้องใช้ Google Analytics เพื่อให้ทำงานได้ คุณเปิดใช้ Google Analytics ได้ในแท็บ
โปรดทราบว่าการรายงานสถิติจำนวนมากในหน้านี้อาจล่าช้าได้ถึง 24 ชั่วโมงเนื่องจากการจัดกลุ่มข้อมูลวิเคราะห์
รายงานการส่งข้อความ
ในคอนโซล Firebase ให้ไปที่แท็บ DevOps และการมีส่วนร่วม > การรับส่งข้อความ > รายงาน เพื่อดูข้อมูลต่อไปนี้สำหรับข้อความที่ส่งไปยัง FCM SDK ของแพลตฟอร์ม Android หรือ Apple รวมถึงข้อความที่ส่งโดยใช้ Notifications Composer และ FCM API
- ส่ง - ข้อความข้อมูลหรือข้อความแจ้งเตือนอยู่ในคิวเพื่อส่งหรือส่งไปยังบริการของบุคคลที่สาม เช่น APN เพื่อส่งเรียบร้อยแล้ว โปรดทราบว่าสถิติการส่งอาจล่าช้า 2-3 ชั่วโมง ดูข้อมูลเพิ่มเติมได้ที่อายุการใช้งานของข้อความ
- ได้รับแล้ว (ใช้ได้เฉพาะในอุปกรณ์ Android) - แอปได้รับข้อความข้อมูลหรือข้อความแจ้งเตือนแล้ว ข้อมูลนี้จะพร้อมใช้งานเมื่ออุปกรณ์ Android ที่รับมี SDK FCM เวอร์ชัน 18.0.1 ขึ้นไปติดตั้งอยู่
- การแสดงผล (ใช้ได้กับข้อความแจ้งเตือนในอุปกรณ์ Android เท่านั้น) - การแจ้งเตือนที่แสดงได้ปรากฏในอุปกรณ์ขณะที่แอปอยู่เบื้องหลัง
- เปิด - ผู้ใช้เปิดข้อความแจ้งเตือน รายงานเฉพาะการแจ้งเตือนที่ได้รับเมื่อแอปอยู่เบื้องหลังเท่านั้น
ข้อมูลนี้ใช้ได้กับข้อความทั้งหมดที่มีเพย์โหลดการแจ้งเตือนและข้อความข้อมูลที่ติดป้ายกำกับทั้งหมด ดูข้อมูลเพิ่มเติมเกี่ยวกับป้ายกำกับได้ที่หัวข้อการเพิ่มป้ายกำกับ Analytics ลงในข้อความ
เมื่อดูรายงานข้อความ คุณสามารถกำหนดช่วงวันที่สำหรับข้อมูลที่แสดงได้ โดยมีตัวเลือกในการส่งออกเป็น CSV นอกจากนี้ คุณยังกรองตามเกณฑ์ต่อไปนี้ได้ด้วย
- แพลตฟอร์ม (iOS หรือ Android)
- แอป
- ป้ายกำกับการวิเคราะห์ที่กำหนดเอง
การเพิ่มป้ายกำกับ Analytics ลงในข้อความ
การติดป้ายกำกับข้อความมีประโยชน์อย่างมากสำหรับการวิเคราะห์ที่กำหนดเอง ซึ่งช่วยให้คุณกรองสถิติการนำส่งตามป้ายกำกับหรือชุดป้ายกำกับได้ คุณสามารถเพิ่มป้ายกำกับให้กับข้อความที่ส่งโดยใช้ HTTP v1 API ได้โดยตั้งค่าช่อง fcmOptions.analyticsLabel ในออบเจ็กต์ message หรือในช่อง AndroidFcmOptions หรือ ApnsFcmOptions ที่เจาะจงแพลตฟอร์ม
ป้ายกำกับ Analytics คือสตริงข้อความในรูปแบบ ^[a-zA-Z0-9-_.~%]{1,50}$
ป้ายกำกับสามารถมีตัวอักษรพิมพ์เล็กและพิมพ์ใหญ่ ตัวเลข และสัญลักษณ์ต่อไปนี้
-~%
ความยาวสูงสุดคือ 50 อักขระ คุณระบุป้ายกำกับที่ไม่ซ้ำกันได้สูงสุด 100 รายการต่อวัน โดยระบบจะไม่รายงานข้อความที่มีป้ายกำกับที่เพิ่มเกินขีดจำกัดดังกล่าว
ในแท็บรายงานการรับส่งข้อความของคอนโซล Firebase คุณสามารถค้นหารายการป้ายกำกับที่มีอยู่ทั้งหมดและใช้ป้ายกำกับเดียวหรือหลายป้ายร่วมกันเพื่อกรองสถิติที่แสดงได้
ข้อมูลการแสดงโฆษณาที่รวบรวมโดยใช้ FCM Data API
Firebase Cloud Messaging Data API ช่วยให้คุณดึงข้อมูลที่ช่วยให้เข้าใจผลลัพธ์ของคำขอข้อความที่กำหนดเป้าหมายไปยังแอปพลิเคชัน Android ได้ API จะให้ข้อมูลรวมในอุปกรณ์ Android ทั้งหมดที่เปิดใช้การเก็บรวบรวมข้อมูลในโปรเจ็กต์ ซึ่งรวมถึงรายละเอียดเกี่ยวกับเปอร์เซ็นต์ของข้อความที่ส่งโดยไม่ล่าช้า ตลอดจนจำนวนข้อความที่ล่าช้าหรือถูกยกเลิกภายในเลเยอร์การรับส่งข้อมูลของ Android การประเมินข้อมูลนี้จะช่วยให้เห็นแนวโน้มโดยรวมในการส่งข้อความ และช่วยให้คุณค้นพบวิธีที่มีประสิทธิภาพในการปรับปรุงประสิทธิภาพของคำขอส่งข้อความ ดูข้อมูลเกี่ยวกับความพร้อมใช้งานของช่วงวันที่ในรายงานได้ที่ไทม์ไลน์ของข้อมูลรวม
API จะให้ข้อมูลทั้งหมดที่มีอยู่สำหรับแอปพลิเคชันหนึ่งๆ ดูเอกสารอ้างอิง API
ระบบแจกแจงข้อมูลอย่างไร
ข้อมูลการนำส่งจะแบ่งตามแอปพลิเคชัน วันที่ และป้ายกำกับ Analytics
การเรียก API จะแสดงผลข้อมูลสำหรับชุดค่าผสมของวันที่ แอปพลิเคชัน และป้ายกำกับการวิเคราะห์ทุกชุด ตัวอย่างเช่น ออบเจ็กต์ JSON androidDeliveryData รายการเดียวจะมีลักษณะดังนี้
{
"appId": "1:23456789:android:a93a5mb1234efe56",
"date": {
"year": 2021,
"month": 1,
"day": 1
},
"analyticsLabel": "foo",
"data": {
"countMessagesAccepted": "314159",
"messageOutcomePercents": {
"delivered": 71,
"pending": 15
},
"deliveryPerformancePercents": {
"deliveredNoDelay": 45,
"delayedDeviceOffline": 11
}
}
วิธีตีความเมตริก
ข้อมูลการนำส่งจะแสดงเปอร์เซ็นต์ของข้อความที่ตรงกับเมตริกแต่ละรายการต่อไปนี้ ข้อความเดียวอาจตรงกับเมตริกหลายรายการ เนื่องจากข้อจำกัดด้านวิธีรวบรวมข้อมูลและระดับความละเอียดที่เราใช้รวมเมตริก ผลลัพธ์ของข้อความบางรายการจึงไม่แสดงในเมตริกเลย ดังนั้นเปอร์เซ็นต์ด้านล่างจึงรวมกันไม่ถึง 100%
จำนวนข้อความที่ยอมรับ
จำนวนเดียวที่รวมอยู่ในชุดข้อมูลคือจำนวนข้อความที่ FCM ยอมรับเพื่อส่งไปยังอุปกรณ์ Android เปอร์เซ็นต์ทั้งหมดจะใช้ค่านี้เป็นตัวส่วน โปรดทราบว่าจำนวนนี้จะไม่รวมข้อความที่กำหนดเป้าหมายไปยังผู้ใช้ที่ปิดใช้การรวบรวมข้อมูลการใช้งานและการวินิจฉัยในอุปกรณ์ของตน
เปอร์เซ็นต์ผลลัพธ์ของข้อความ
ฟิลด์ที่รวมอยู่ในออบเจ็กต์ MessageOutcomePercents จะให้ข้อมูลเกี่ยวกับผลลัพธ์ของคำขอข้อความ หมวดหมู่ทั้งหมดจะแยกออกจากกัน ซึ่งจะตอบคำถามต่างๆ ได้ เช่น "ข้อความของฉันถูกส่งหรือไม่" และ "สาเหตุที่ทำให้ข้อความถูกยกเลิกคืออะไร"
ตัวอย่างเช่น ค่าที่สูงสำหรับช่อง droppedTooManyPendingMessages อาจบ่งบอกว่าอินสแตนซ์ของแอปได้รับข้อความที่ไม่สามารถยุบได้ในปริมาณที่เกินขีดจำกัดของ FCM ซึ่งอยู่ที่ 100 ข้อความที่รอดำเนินการ
เพื่อลดปัญหานี้ โปรดตรวจสอบว่าแอปของคุณจัดการการเรียกใช้ onDeletedMessages และพิจารณาส่งข้อความที่ยุบได้ ในทำนองเดียวกัน เปอร์เซ็นต์ที่สูงสำหรับ droppedDeviceInactive อาจเป็นสัญญาณให้คุณอัปเดตโทเค็นการลงทะเบียนในเซิร์ฟเวอร์ นำโทเค็นที่ไม่มีการใช้งานออก และยกเลิกการสมัครรับข้อมูลจากหัวข้อ ดูแนวทางปฏิบัติแนะนำในส่วนนี้ได้ที่หัวข้อจัดการโทเค็นการลงทะเบียน FCM
เปอร์เซ็นต์ประสิทธิภาพการแสดงโฆษณา
ช่องในออบเจ็กต์ DeliveryPerformancePercents จะให้ข้อมูลเกี่ยวกับข้อความที่ส่งเรียบร้อยแล้ว ซึ่งจะตอบคำถามต่างๆ ได้ เช่น "ข้อความของฉันล่าช้าหรือไม่" และ "ทำไมข้อความจึงล่าช้า" ตัวอย่างเช่น ค่าที่สูงสำหรับ delayedMessageThrottled จะบ่งชี้อย่างชัดเจนว่าคุณกำลังส่งข้อความเกินขีดจำกัดสูงสุดต่ออุปกรณ์ และควรปรับอัตราการส่งข้อความ
เปอร์เซ็นต์ข้อมูลเชิงลึกเกี่ยวกับข้อความ
ออบเจ็กต์นี้ให้ข้อมูลเพิ่มเติมเกี่ยวกับการส่งข้อความทั้งหมด ช่อง priorityLowered แสดงเปอร์เซ็นต์ของข้อความที่ยอมรับซึ่งมีการลดลำดับความสำคัญจาก HIGH เป็น NORMAL หากค่านี้สูง ให้ลองส่งข้อความที่มีลำดับความสำคัญสูงให้น้อยลง หรือตรวจสอบว่าคุณแสดงการแจ้งเตือนเสมอเมื่อมีการส่งข้อความที่มีลำดับความสำคัญสูง ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบเกี่ยวกับลำดับความสำคัญของข้อความ
ข้อมูลนี้แตกต่างจากข้อมูลที่ส่งออกไปยัง BigQuery อย่างไร
การส่งออก BigQuery จะแสดงบันทึกข้อความแต่ละรายการเกี่ยวกับการยอมรับข้อความโดยแบ็กเอนด์ FCM และการนำส่งข้อความใน SDK บนอุปกรณ์ (ขั้นตอนที่ 2 และ 4 ของสถาปัตยกรรม FCM) ข้อมูลนี้มีประโยชน์ในการตรวจสอบว่าข้อความแต่ละรายการได้รับการยอมรับและส่งแล้ว อ่านข้อมูลเพิ่มเติมเกี่ยวกับการส่งออกข้อมูล BigQuery ในส่วนถัดไป
ในทางตรงกันข้าม Firebase Cloud Messaging Data API จะให้รายละเอียดที่รวบรวมเกี่ยวกับสิ่งที่เกิดขึ้นในเลเยอร์การรับส่งข้อมูลของ Android โดยเฉพาะ (หรือขั้นตอนที่ 3 ของสถาปัตยกรรม FCM) ข้อมูลนี้จะให้ข้อมูลเชิงลึกเกี่ยวกับการส่งข้อความจากแบ็กเอนด์ FCM ไปยัง Android SDK โดยเฉพาะ ซึ่งมีประโยชน์อย่างยิ่งในการแสดงแนวโน้มสาเหตุที่ข้อความล่าช้าหรือถูกยกเลิกระหว่างการส่งนี้
ในบางกรณี ชุดข้อมูลทั้ง 2 ชุดอาจไม่ตรงกันทุกประการเนื่องจากสาเหตุต่อไปนี้
- เมตริกที่รวบรวมจะสุ่มตัวอย่างข้อความทั้งหมดเพียงบางส่วนเท่านั้น
- เมตริกที่รวบรวมจะปัดเศษ
- เราจะไม่แสดงเมตริกที่ต่ำกว่าเกณฑ์ความเป็นส่วนตัว
- ผลลัพธ์ของข้อความบางส่วนหายไปเนื่องจากการเพิ่มประสิทธิภาพวิธีที่เราจัดการการเข้าชมจำนวนมาก
ข้อจำกัดของ API
ไทม์ไลน์ข้อมูลรวม
API จะแสดงข้อมูลย้อนหลัง 7 วัน แต่ข้อมูลที่ API นี้แสดงจะล่าช้าสูงสุด 5 วัน ตัวอย่างเช่น ในวันที่ 20 มกราคม ข้อมูลของวันที่ 9-15 มกราคมจะพร้อมใช้งาน แต่ข้อมูลของวันที่ 16 มกราคมเป็นต้นไปจะยังไม่พร้อมใช้งาน นอกจากนี้ ข้อมูลที่ให้ไว้เป็นข้อมูลที่รวบรวมอย่างเต็มความสามารถ ในกรณีที่ข้อมูลหยุดทำงาน FCM จะดำเนินการแก้ไขปัญหาและจะไม่เติมข้อมูลย้อนหลังหลังจากที่ปัญหาได้รับการแก้ไขแล้ว ในกรณีที่เกิดการหยุดทำงานเป็นวงกว้าง ข้อมูลอาจไม่พร้อมใช้งานเป็นเวลา 1 สัปดาห์หรือนานกว่านั้น
ความครอบคลุมของข้อมูล
เมตริกที่ได้จาก Firebase Cloud Messaging Data API มีไว้เพื่อให้ข้อมูลเชิงลึกเกี่ยวกับแนวโน้มโดยรวมของการนำส่งข้อความ อย่างไรก็ตาม วิธีการเหล่านี้ไม่ครอบคลุมสถานการณ์ข้อความทั้งหมด 100% สถานการณ์ต่อไปนี้เป็นผลลัพธ์ที่ทราบซึ่งไม่แสดงในเมตริก
ข้อความที่หมดอายุ
หาก Time To Live (TTL) หมดอายุหลังจากสิ้นสุดวันที่บันทึกที่ระบุ ระบบจะไม่นับข้อความเป็น droppedTtlExpired ในวันที่นี้
ข้อความไปยังอุปกรณ์ที่ไม่ได้ใช้งาน
ข้อความที่ส่งไปยังอุปกรณ์ที่ไม่ได้ใช้งานอาจปรากฏหรือไม่ปรากฏในชุดข้อมูล ทั้งนี้ขึ้นอยู่กับเส้นทางข้อมูลที่ใช้ ซึ่งอาจทำให้เกิดการนับผิดพลาดในช่อง droppedDeviceInactive และ pending
ข้อความไปยังอุปกรณ์ที่มีค่ากำหนดของผู้ใช้บางอย่าง
ผู้ใช้ที่ปิดใช้การรวบรวมข้อมูลการใช้งานและการวินิจฉัยในอุปกรณ์จะไม่รวมข้อความไว้ในการนับของเรา เพื่อให้เป็นไปตามค่ากำหนดของผู้ใช้
การปัดเศษและค่าต่ำสุด
FCM จะปัดเศษและไม่รวมจำนวนที่ปริมาณไม่มากพอโดยเจตนา
การส่งออกข้อมูล BigQuery
คุณสามารถส่งออกข้อมูลข้อความไปยัง BigQuery เพื่อวิเคราะห์เพิ่มเติมได้ BigQuery ช่วยให้คุณวิเคราะห์ข้อมูลโดยใช้ BigQuery SQL, ส่งออกข้อมูลไปยังผู้ให้บริการคลาวด์รายอื่น หรือใช้ข้อมูลสำหรับโมเดล ML ที่กำหนดเองได้ การส่งออกไปยัง BigQuery จะรวมข้อมูลทั้งหมดที่มีอยู่สำหรับข้อความ ไม่ว่าจะเป็นข้อความประเภทใด หรือส่งข้อความโดยใช้ API หรือ Notifications Composer ก็ตาม
สำหรับข้อความที่ส่งไปยังอุปกรณ์ที่มี SDK เวอร์ชันขั้นต่ำต่อไปนี้ คุณจะมีตัวเลือกเพิ่มเติมในการเปิดใช้การส่งออกข้อมูลการนำส่งข้อความสำหรับแอปของคุณFCM
- Android 20.1.0 ขึ้นไป
- iOS 8.6.0 ขึ้นไป
- Firebase Web SDK 12.14.0 ขึ้นไป
หากต้องการเริ่มต้นใช้งาน ให้ลิงก์โปรเจ็กต์กับ BigQuery โดยใช้คอนโซล Firebase ดังนี้
เลือกตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้
ไปที่ DevOps และความผูกพัน > การรับส่งข้อความ > Notifications Composer แล้วคลิกเข้าถึง BigQuery ที่ด้านล่างของหน้า
ไปที่
Settings > แท็บ Integrations จากนั้นใน BigQuery ให้คลิกลิงก์หน้านี้แสดงตัวเลือกการส่งออก FCM สำหรับแอปทั้งหมดที่เปิดใช้ FCM ในโปรเจ็กต์
ทำตามวิธีการบนหน้าจอเพื่อเปิดใช้ BigQuery
ดูข้อมูลเพิ่มเติมได้ที่ลิงก์ Firebase กับ BigQuery
สิ่งที่จะเกิดขึ้นเมื่อเปิดใช้การส่งออก BigQuery สำหรับ Cloud Messaging
Firebase จะส่งออกข้อมูลของคุณไปยัง BigQuery โปรดทราบว่าการเผยแพร่ข้อมูลครั้งแรกสำหรับการส่งออกอาจใช้เวลาถึง 48 ชั่วโมงจึงจะเสร็จสมบูรณ์
- คุณสามารถกำหนดเวลาการทดแทนข้อมูลด้วยตนเองได้สูงสุด 30 วันที่ผ่านมา
หลังจากสร้างชุดข้อมูลแล้ว คุณจะเปลี่ยนแปลงตำแหน่งไม่ได้ แต่จะคัดลอกชุดข้อมูลไปยังตำแหน่งอื่นหรือย้าย (สร้างใหม่) ชุดข้อมูลไปยังตำแหน่งอื่นด้วยตนเองได้ ดูข้อมูลเพิ่มเติมได้ที่เปลี่ยนตำแหน่งชุดข้อมูล
Firebase จะตั้งค่าการซิงค์ข้อมูลจากโปรเจ็กต์ Firebase ไปยัง BigQuery เป็นประจำ การส่งออกรายวันเหล่านี้จะเริ่มเวลา 04:00 น. ตามเขตเวลาแปซิฟิก และมักจะเสร็จสิ้นภายใน 24 ชั่วโมง
แอปทั้งหมดในโปรเจ็กต์ลิงก์อยู่กับ BigQuery โดยค่าเริ่มต้น และแอปที่เพิ่มในโปรเจ็กต์ภายหลังจะลิงก์กับ BigQuery โดยอัตโนมัติด้วยเช่นกัน คุณสามารถจัดการแอปที่ส่งข้อมูลได้
หากต้องการปิดใช้งานการส่งออก BigQuery ให้ยกเลิกการลิงก์โปรเจ็กต์ในคอนโซล Firebase
เปิดใช้การส่งออกข้อมูลการนำส่งข้อความ
iOS+
อุปกรณ์ iOS ที่ใช้ SDK FCM เวอร์ชัน 8.6.0 ขึ้นไปสามารถเปิดใช้การส่งออกข้อมูลการนำส่งข้อความของแอปได้ FCM รองรับการส่งออกข้อมูลสำหรับการแจ้งเตือนทั้งแบบแจ้งเตือนและแบบเบื้องหลัง ระบบจะปิดใช้การส่งออกข้อมูลโดยค่าเริ่มต้นที่ระดับแอป การเปิดใช้แบบเป็นโปรแกรมที่ระดับอินสแตนซ์แอปช่วยให้คุณขอสิทธิ์จากผู้ใช้ปลายทางเพื่อวิเคราะห์ข้อมูลการส่งข้อความได้ (แนะนำ) เมื่อตั้งค่าทั้ง 2 อย่าง ค่าระดับอินสแตนซ์แอปจะลบล้างค่าระดับแอป
ก่อนเปิดใช้ตัวเลือกเหล่านี้ คุณต้องสร้างลิงก์ FCM-BiqQuery สำหรับโปรเจ็กต์ก่อนตามที่อธิบายไว้ในการส่งออกข้อมูล BigQuery
เปิดใช้การส่งออกข้อมูลการนำส่งสำหรับการแจ้งเตือน
เนื่องจากมีเพียงการแจ้งเตือนเท่านั้นที่เรียกให้ส่วนขยายแอปบริการการแจ้งเตือนทำงานได้ คุณจึงต้องเพิ่มส่วนขยายบริการการแจ้งเตือนลงในแอปและเรียกใช้ API นี้ภายในส่วนขยายบริการเพื่อเปิดใช้การติดตามข้อความที่แสดง ดูเอกสารประกอบของ Apple เกี่ยวกับการแก้ไขเนื้อหาในการแจ้งเตือนที่ส่งใหม่
ต้องทำการเรียกต่อไปนี้สำหรับการแจ้งเตือนทุกรายการที่ได้รับSwift
// For alert notifications, call the API inside the service extension: class NotificationService: UNNotificationServiceExtension { override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { Messaging.serviceExtension().exportDeliveryMetrics(withMessageInfo:request.content.userInfo) } }
Objective-C
// For alert notifications, call the API inside the service extension: @implementation NotificationService - (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent *_Nonnull))contentHandler { [[FIRMessaging extensionHelper] exportDeliveryMetricsToBigQueryWithMessageInfo:request.content.userInfo]; } @end
หากคุณสร้างคำขอส่งโดยใช้ HTTP v1 API ให้ตรวจสอบว่าได้ระบุ `mutable-content = 1` ในออบเจ็กต์เพย์โหลด
เปิดใช้การส่งออกข้อมูลการนำส่งสำหรับการแจ้งเตือนในเบื้องหลัง
สำหรับข้อความเบื้องหลังที่ได้รับเมื่อแอปอยู่เบื้องหน้าหรือเบื้องหลัง คุณสามารถเรียกใช้ API การส่งออกข้อมูลภายในเครื่องจัดการข้อความข้อมูลของแอปหลักได้ ต้องทำการเรียกนี้สำหรับการแจ้งเตือนทุกรายการที่ได้รับ ดังนี้
Swift
// For background notifications, call the API inside the // UIApplicationDelegate or NSApplicationDelegate method: func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any]) { Messaging.serviceExtension().exportDeliveryMetricsToBigQuery(withMessageInfo:userInfo) }
Objective-C
// For background notifications, call the API inside the // UIApplicationDelegate or NSApplicationDelegate method: @implementation AppDelegate - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { [[FIRMessaging extensionHelper] exportDeliveryMetricsToBigQueryWithMessageInfo:userInfo]; } @end
Android
อุปกรณ์ Android ที่มี FCM SDK 20.1.0 ขึ้นไปสามารถเปิดใช้การส่งออกข้อมูลการนำส่งข้อความของแอปได้ ระบบจะปิดใช้การส่งออกข้อมูลโดยค่าเริ่มต้นที่ระดับแอป การเปิดใช้แบบเป็นโปรแกรมที่ระดับอินสแตนซ์แอปช่วยให้คุณขอสิทธิ์จากผู้ใช้ปลายทางเพื่อวิเคราะห์ข้อมูลการส่งข้อความได้ (แนะนำ) เมื่อตั้งค่าทั้ง 2 อย่าง ค่าระดับอินสแตนซ์แอปจะลบล้างค่าระดับแอป
ก่อนเปิดใช้ตัวเลือกเหล่านี้ คุณต้องสร้างลิงก์ FCM-BiqQuery สำหรับโปรเจ็กต์ก่อนตามที่อธิบายไว้ในการส่งออกข้อมูล BigQuery
เปิดใช้การส่งออกข้อมูลการนำส่งสำหรับอินสแตนซ์แอป
ในกรณีส่วนใหญ่ เราขอแนะนำให้เปิดใช้การส่งออกข้อมูลการนำส่งข้อความเฉพาะที่ระดับอินสแตนซ์แอป และปิดใช้ที่ระดับแอป
FirebaseMessaging.getInstance().setDeliveryMetricsExportToBigQuery(true);
เปิดใช้การส่งออกข้อมูลการแสดงโฆษณาสำหรับแอป
หากต้องการเปิดใช้การส่งออกที่ระดับแอป โปรดอย่าเรียกใช้เมธอด setDeliveryMetricsExportToBigQuery และเพิ่มพร็อพเพอร์ตี้ต่อไปนี้ลงในออบเจ็กต์แอปพลิเคชันในไฟล์ Manifest ของแอป
<application> <meta-data android:name="delivery_metrics_exported_to_big_query_enabled" android:value="true" /> </application>
เว็บ
SDK FCM สำหรับเว็บเวอร์ชัน 12.14.0 ขึ้นไปอนุญาตให้ส่งออกข้อมูลการแสดงโฆษณาได้ ระบบจะปิดใช้การส่งออกข้อมูลโดยค่าเริ่มต้นที่ระดับแอป การเปิดใช้แบบเป็นโปรแกรมที่ระดับอินสแตนซ์แอปช่วยให้คุณขอสิทธิ์จากผู้ใช้ปลายทางเพื่อวิเคราะห์ข้อมูลการส่งข้อความได้ (แนะนำ) เมื่อตั้งค่าทั้ง 2 อย่าง ค่าระดับอินสแตนซ์แอปจะลบล้างค่าระดับแอป เมื่อผู้ใช้ปลายทางให้ความยินยอมหรือปฏิเสธการเก็บรวบรวมข้อมูล แอปควรตั้งค่าแฟล็กเปิดหรือปิดใช้การทดสอบสำหรับอินสแตนซ์แอปแต่ละรายการ ดังนี้
// userConsent holds the decision of the user to give big query export consent. const userConsent = ...; const messaging = getMessagingInSw(app); experimentalSetDeliveryMetricsExportedToBigQueryEnabled(messaging, userConsent);
ข้อมูลใดบ้างที่ส่งออกไปยัง BigQuery
โปรดทราบว่าการกำหนดเป้าหมายโทเค็นที่ไม่มีการอัปเดตหรือการลงทะเบียนที่ไม่มีการใช้งานอาจทำให้สถิติเหล่านี้บางรายการเพิ่มขึ้น
สคีมาของตารางที่ส่งออกมีดังนี้
| _PARTITIONTIME | การประทับเวลา | คอลัมน์จำลองนี้ประกอบด้วยการประทับเวลาสำหรับช่วงเริ่มต้นของวัน (ในเขตเวลา UTC) ที่โหลดข้อมูล สำหรับพาร์ติชัน YYYYMMDD คอลัมน์จำลองนี้จะมีค่า TIMESTAMP('YYYY-MM-DD') |
| event_timestamp | การประทับเวลา | การประทับเวลาของเหตุการณ์ตามที่เซิร์ฟเวอร์บันทึกไว้ |
| project_number | INTEGER | หมายเลขโปรเจ็กต์จะระบุโปรเจ็กต์ที่ส่งข้อความ |
| message_id | STRING | รหัสข้อความจะระบุข้อความ รหัสข้อความที่สร้างจากรหัสแอปและการประทับเวลาอาจไม่ซ้ำกันทั่วโลกในบางกรณี |
| instance_id | STRING | รหัสที่ไม่ซ้ำกันของแอปที่ส่งข้อความถึง (หากมี) ซึ่งอาจเป็นรหัสอินสแตนซ์หรือรหัสการติดตั้ง Firebase ก็ได้ |
| message_type | STRING | ประเภทของข้อความ อาจเป็นข้อความแจ้งเตือนหรือข้อความข้อมูล หัวข้อจะใช้เพื่อระบุข้อความต้นฉบับสำหรับการส่งหัวข้อหรือแคมเปญ ข้อความต่อมาจะเป็นการแจ้งเตือนหรือข้อความข้อมูล |
| sdk_platform | STRING | แพลตฟอร์มของแอปผู้รับ |
| app_name | STRING | ชื่อแพ็กเกจสำหรับแอป Android หรือรหัสชุดสำหรับแอป iOS |
| collapse_key | STRING | คีย์การยุบจะระบุกลุ่มข้อความที่ยุบได้ เมื่ออุปกรณ์ไม่ได้เชื่อมต่อ ระบบจะจัดคิวเฉพาะข้อความสุดท้ายที่มีคีย์การยุบที่ระบุเพื่อนำส่งในภายหลัง |
| Priority | INTEGER | ลำดับความสำคัญของข้อความ 5 คือลำดับความสำคัญ "ปกติ" และ 10 คือลำดับความสำคัญ "สูง" |
| ttl | INTEGER | พารามิเตอร์นี้ระบุระยะเวลา (เป็นวินาที) ที่ควรเก็บข้อความไว้ในพื้นที่เก็บข้อมูล FCM หากอุปกรณ์ออฟไลน์ |
| หัวข้อ | STRING | ชื่อหัวข้อที่มีการส่งข้อความ (หากมี) |
| bulk_id | INTEGER | รหัสกลุ่มจะระบุกลุ่มข้อความที่เกี่ยวข้อง เช่น การส่งข้อความไปยังหัวข้อหนึ่งๆ |
| เหตุการณ์ | STRING | ประเภทของเหตุการณ์
ค่าที่เป็นไปได้มีดังนี้
|
| analytics_label | STRING | เมื่อใช้ HTTP v1 API คุณจะตั้งค่าป้ายกำกับ Analytics ได้เมื่อส่งข้อความ เพื่อทำเครื่องหมายข้อความเพื่อวัตถุประสงค์ด้านการวิเคราะห์ |
คุณทำอะไรกับข้อมูลที่ส่งออกได้บ้าง
ส่วนต่อไปนี้แสดงตัวอย่างการค้นหาที่คุณเรียกใช้ใน BigQuery กับข้อมูล FCM ที่ส่งออกได้
นับข้อความที่ส่งตามแอป
SELECT app_name, COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
_PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
AND event = 'MESSAGE_ACCEPTED'
AND message_id != ''
GROUP BY 1;นับอินสแตนซ์แอปที่ไม่ซ้ำซึ่งเป็นเป้าหมายของข้อความ
SELECT COUNT(DISTINCT instance_id)
FROM `project ID.firebase_messaging.data`
WHERE
_PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
AND event = 'MESSAGE_ACCEPTED';นับข้อความแจ้งเตือนที่ส่ง
SELECT COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
_PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
AND event = 'MESSAGE_ACCEPTED'
AND message_type = 'DISPLAY_NOTIFICATION';นับข้อความข้อมูลที่ส่ง
SELECT COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
_PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
AND event = 'MESSAGE_ACCEPTED'
AND message_type = 'DATA_MESSAGE';นับข้อความที่ส่งไปยังหัวข้อหรือแคมเปญ
SELECT COUNT(1)
FROM `project ID.firebase_messaging.data`
WHERE
_PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
AND event = 'MESSAGE_ACCEPTED'
AND bulk_id = your bulk id AND message_id != '';หากต้องการติดตามเหตุการณ์สำหรับข้อความที่ส่งไปยังหัวข้อหนึ่งๆ ให้แก้ไขการค้นหานี้เพื่อแทนที่ AND message_id != '' ด้วย AND message_id = <your message id>;
คำนวณระยะเวลาการกระจายสำหรับหัวข้อหรือแคมเปญที่กำหนด
เวลาเริ่มต้นของการกระจายคือเวลาที่ได้รับคำขอเดิม และเวลาสิ้นสุดคือเวลาที่สร้างข้อความสุดท้ายที่กำหนดเป้าหมายไปยังอินสแตนซ์เดียว
SELECT TIMESTAMP_DIFF( end_timestamp, start_timestamp, MILLISECOND ) AS fanout_duration_ms, end_timestamp, start_timestamp FROM ( SELECT MAX(event_timestamp) AS end_timestamp FROM `project ID.firebase_messaging.data` WHERE _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD') AND event = 'MESSAGE_ACCEPTED' AND bulk_id = your bulk id ) sent CROSS JOIN ( SELECT event_timestamp AS start_timestamp FROM `project ID.firebase_messaging.data` WHERE _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD') AND event = 'MESSAGE_ACCEPTED' AND bulk_id = your bulk id AND message_type = 'TOPIC' ) initial_message;
นับเปอร์เซ็นต์ของข้อความที่ส่ง
SELECT messages_sent, messages_delivered, messages_delivered / messages_sent * 100 AS percent_delivered FROM ( SELECT COUNT(DISTINCT CONCAT(message_id, instance_id)) AS messages_sent FROM `project ID.firebase_messaging.data` WHERE _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD') AND event = 'MESSAGE_ACCEPTED' ) sent CROSS JOIN ( SELECT COUNT(DISTINCT CONCAT(message_id, instance_id)) AS messages_delivered FROM `project ID.firebase_messaging.data` WHERE _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD') AND (event = 'MESSAGE_DELIVERED' AND message_id IN ( SELECT message_id FROM `project ID.firebase_messaging.data` WHERE _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD') AND event = 'MESSAGE_ACCEPTED' GROUP BY 1 ) ) delivered;
ติดตามเหตุการณ์ทั้งหมดสำหรับรหัสข้อความและรหัสอินสแตนซ์ที่ระบุ
SELECT *
FROM `project ID.firebase_messaging.data`
WHERE
_PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD')
AND message_id = 'your message id'
AND instance_id = 'your instance id'
ORDER BY event_timestamp;คำนวณเวลาในการตอบสนองสำหรับรหัสข้อความและรหัสอินสแตนซ์ที่ระบุ
SELECT TIMESTAMP_DIFF( MAX(delivered_time), MIN(accepted_time), MILLISECOND ) AS latency_ms FROM ( SELECT event_timestamp AS accepted_time FROM `project ID.firebase_messaging.data` WHERE _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD') AND message_id = 'your message id' AND instance_id = 'your instance id' AND event = 'MESSAGE_ACCEPTED' ) sent CROSS JOIN ( SELECT event_timestamp AS delivered_time FROM `project ID.firebase_messaging.data` WHERE _PARTITIONTIME = TIMESTAMP('date as YYYY-MM-DD') AND message_id = 'your message id' AND instance_id = 'your instance id' AND (event = 'MESSAGE_DELIVERED' ) delivered;