การทำความเข้าใจการส่งข้อความ

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

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

  • รายงานการส่งข้อความในคอนโซล Firebase รายการ
  • เมตริกการแสดงโฆษณา Android SDK ที่รวบรวมจาก Firebase Cloud Messaging Data API
  • การส่งออกข้อมูลที่ครอบคลุมไปยัง Google BigQuery

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

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

รายงานการส่งข้อความ

ในคอนโซล Firebase ให้ไปที่ DevOps และการมีส่วนร่วม > การรับส่งข้อความ > แท็บรายงาน เพื่อดูข้อมูลต่อไปนี้สำหรับข้อความที่ส่งไปยัง SDK ของ FCM ในแพลตฟอร์ม Android หรือ Apple รวมถึงข้อความที่ส่งโดยใช้ Notifications Composer และ FCM API

  • ส่ง - ข้อความข้อมูลหรือข้อความแจ้งเตือนอยู่ในคิวเพื่อส่งหรือส่งไปยังบริการของบุคคลที่สาม เช่น APN เพื่อส่งเรียบร้อยแล้ว โปรดทราบว่าสถิติการส่งอาจล่าช้า 2-3 ชั่วโมง ดูข้อมูลเพิ่มเติมได้ที่อายุการใช้งานของข้อความ
  • ได้รับ (ใช้ได้เฉพาะในอุปกรณ์ Android) - แอปได้รับข้อความข้อมูลหรือข้อความแจ้งแล้ว ข้อมูลนี้จะใช้ได้เมื่ออุปกรณ์ Android ที่รับมีการติดตั้ง FCM SDK 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

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

  • Android 20.1.0 ขึ้นไป
  • iOS 8.6.0 ขึ้นไป
  • Firebase Web SDK 12.14.0 ขึ้นไป

หากต้องการเริ่มต้นใช้งาน ให้ลิงก์โปรเจ็กต์กับ BigQuery โดยใช้คอนโซล Firebase

  1. เลือกตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้

    • ไปที่ DevOps และการมีส่วนร่วม > การรับส่งข้อความ > Notifications Composer จากนั้นคลิกเข้าถึง BigQuery ที่ด้านล่างของหน้า

    • ไปที่ การตั้งค่า > แท็บการผสานรวม จากนั้นใน BigQuery ให้คลิกลิงก์

      หน้านี้แสดงตัวเลือกการส่งออก FCM สำหรับแอปทั้งหมดที่เปิดใช้ FCM ในโปรเจ็กต์

  2. ทำตามวิธีการบนหน้าจอเพื่อเปิดใช้ BigQuery

ดูข้อมูลเพิ่มเติมได้ที่ลิงก์ Firebase กับ BigQuery

สิ่งที่จะเกิดขึ้นเมื่อเปิดใช้การส่งออก BigQuery สำหรับ Cloud Messaging

  • Firebase จะส่งออกข้อมูลของคุณไปยัง BigQuery โปรดทราบว่าการเผยแพร่ข้อมูลครั้งแรกสำหรับการส่งออกอาจใช้เวลาถึง 48 ชั่วโมงจึงจะเสร็จสมบูรณ์

  • หลังจากสร้างชุดข้อมูลแล้ว คุณจะเปลี่ยนแปลงตำแหน่งไม่ได้ แต่จะคัดลอกชุดข้อมูลไปยังตำแหน่งอื่นหรือย้าย (สร้างใหม่) ชุดข้อมูลไปยังตำแหน่งอื่นด้วยตนเองได้ ดูข้อมูลเพิ่มเติมได้ที่เปลี่ยนตำแหน่งชุดข้อมูล

  • Firebase จะตั้งค่าการซิงค์ข้อมูลจากโปรเจ็กต์ Firebase ไปยัง BigQuery เป็นประจำ การส่งออกรายวันเหล่านี้จะเริ่มเวลา 04:00 น. ตามเขตเวลาแปซิฟิก และมักจะเสร็จสิ้นภายใน 24 ชั่วโมง

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

หากต้องการปิดใช้งานการส่งออก BigQuery ให้ยกเลิกการลิงก์โปรเจ็กต์ในคอนโซล Firebase

เปิดใช้การส่งออกข้อมูลการนำส่งข้อความ

iOS+

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

ก่อนที่จะเปิดใช้ตัวเลือกเหล่านี้ คุณต้องสร้างFCMลิงก์ -BigQuery สำหรับโปรเจ็กต์ ก่อนตามที่อธิบายไว้ในการส่งออกข้อมูล 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` ในออบเจ็กต์เพย์โหลด

เปิดใช้การส่งออกข้อมูลการนำส่งสำหรับการแจ้งเตือนในเบื้องหลัง

สำหรับข้อความเบื้องหลังที่ได้รับเมื่อแอปอยู่เบื้องหน้าหรือเบื้องหลัง คุณสามารถเรียกใช้ Data Export 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 ประเภทของข้อความ อาจเป็นข้อความแจ้งเตือนหรือข้อความข้อมูล Topic ใช้เพื่อระบุข้อความต้นฉบับสำหรับการส่งหัวข้อหรือแคมเปญ ข้อความที่ตามมาจะเป็นการแจ้งเตือนหรือข้อความข้อมูล
sdk_platform STRING แพลตฟอร์มของแอปผู้รับ
app_name STRING ชื่อแพ็กเกจสำหรับแอป Android หรือรหัสชุดสำหรับแอป iOS
collapse_key STRING คีย์การยุบจะระบุกลุ่มข้อความที่ยุบได้ เมื่ออุปกรณ์ไม่ได้เชื่อมต่อ ระบบจะจัดคิวเฉพาะข้อความสุดท้ายที่มีคีย์ยุบที่ระบุไว้เพื่อนำส่งในภายหลัง
Priority INTEGER ลำดับความสำคัญของข้อความ โดย 5 คือลำดับความสำคัญ "ปกติ" และ 10 คือลำดับความสำคัญ "สูง"
ttl INTEGER พารามิเตอร์นี้ระบุระยะเวลา (เป็นวินาที) ที่ควรเก็บข้อความไว้ในพื้นที่เก็บข้อมูล FCM หากอุปกรณ์ออฟไลน์
หัวข้อ STRING ชื่อของหัวข้อที่ส่งข้อความ (หากมี)
bulk_id INTEGER รหัสกลุ่มจะระบุกลุ่มข้อความที่เกี่ยวข้อง เช่น การส่งข้อความไปยังหัวข้อหนึ่งๆ
เหตุการณ์ STRING ประเภทของเหตุการณ์ ค่าที่เป็นไปได้มีดังนี้
  • MESSAGE_ACCEPTED: เซิร์ฟเวอร์ FCM ได้รับข้อความและคำขอถูกต้อง
  • MESSAGE_DELIVERED: ระบบได้ส่งข้อความไปยัง SDK ของ FCM ของแอปใน อุปกรณ์แล้ว โดยค่าเริ่มต้น ระบบจะไม่เผยแพร่ช่องนี้ หากต้องการเปิดใช้ ให้ทำตาม วิธีการที่ระบุไว้ใน setDeliveryMetricsExportToBigQuery(boolean)
  • MISSING_REGISTRATIONS: คำขอถูกปฏิเสธเนื่องจากไม่มีการลงทะเบียน
  • UNAUTHORIZED_REGISTRATION: ระบบปฏิเสธข้อความเนื่องจากผู้ส่งไม่ได้รับอนุญาตให้ส่งไปยังการลงทะเบียน
  • MESSAGE_RECEIVED_INTERNAL_ERROR: เกิดข้อผิดพลาดที่ไม่ได้ระบุเมื่อประมวลผลคำขอข้อความ
  • MISMATCH_SENDER_ID: คำขอส่งข้อความถูกปฏิเสธเนื่องจากรหัสผู้ส่งที่ส่งข้อความไม่ตรงกับรหัสที่ประกาศสำหรับปลายทาง
  • QUOTA_EXCEEDED: คำขอส่งข้อความถูกปฏิเสธเนื่องจากโควต้าไม่เพียงพอ
  • INVALID_REGISTRATION: คำขอส่งข้อความถูกปฏิเสธเนื่องจากการลงทะเบียนไม่ถูกต้อง
  • INVALID_PACKAGE_NAME: คำขอส่งข้อความถูกปฏิเสธเนื่องจากชื่อแพ็กเกจไม่ถูกต้อง
  • INVALID_APNS_CREDENTIAL: คำขอส่งข้อความถูกปฏิเสธเนื่องจาก ใบรับรอง APNS ไม่ถูกต้อง
  • INVALID_PARAMETERS: คำขอส่งข้อความถูกปฏิเสธเนื่องจาก พารามิเตอร์ไม่ถูกต้อง
  • PAYLOAD_TOO_LARGE: คำขอส่งข้อความถูกปฏิเสธเนื่องจากเพย์โหลดมีขนาดใหญ่เกินขีดจำกัด
  • AUTHENTICATION_ERROR: คำขอส่งข้อความถูกปฏิเสธเนื่องจาก ข้อผิดพลาดในการตรวจสอบสิทธิ์ (ตรวจสอบคีย์ API ที่ใช้ส่งข้อความ)
  • INVALID_TTL: คำขอส่งข้อความถูกปฏิเสธเนื่องจาก TTL ไม่ถูกต้อง
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;