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

หากต้องการแก้ปัญหาการนำส่งข้อความที่ล้มเหลวอย่างต่อเนื่อง ให้ใช้เครื่องมือแก้ปัญหาของ 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 คุณจะดูข้อมูลต่อไปนี้สำหรับข้อความที่ส่งไปยัง SDK ของ FCM ในแพลตฟอร์ม Android หรือ Apple ได้ รวมถึงข้อความที่ส่งผ่านเครื่องมือแต่งข้อความแจ้งและ API ของ FCM

  • ส่งแล้ว - ระบบได้จัดคิวข้อความข้อมูลหรือข้อความแจ้งเตือนเพื่อ นำส่ง หรือส่งไปยังบริการของบุคคลที่สาม เช่น APNs เพื่อนำส่งเรียบร้อยแล้ว โปรดทราบว่าสถิติของ Sends อาจล่าช้า 2-3 ชั่วโมง ดูข้อมูลเพิ่มเติมได้ที่อายุของข้อความ
  • ได้รับ (ใช้ได้เฉพาะในอุปกรณ์ Android) - แอปได้รับข้อความข้อมูลหรือข้อความแจ้งแล้ว ข้อมูลนี้จะใช้ได้เมื่ออุปกรณ์ Android ที่รับมีการติดตั้ง FCM SDK 18.0.1 ขึ้นไป
  • การแสดงผล (ใช้ได้เฉพาะกับข้อความแจ้งเตือนในอุปกรณ์ Android) - การแจ้งเตือนแบบแสดงผลปรากฏในอุปกรณ์ขณะที่แอป ทำงานในเบื้องหลัง
  • เปิด - ผู้ใช้เปิดข้อความแจ้งเตือน รายงานเฉพาะ การแจ้งเตือนที่ได้รับเมื่อแอปอยู่ในเบื้องหลัง

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

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

  • แพลตฟอร์ม (iOS หรือ Android)
  • แอป
  • ป้ายกำกับข้อมูลวิเคราะห์ที่กำหนดเอง

การเพิ่มป้ายกำกับข้อมูลวิเคราะห์ในข้อความ

การติดป้ายกำกับข้อความมีประโยชน์อย่างยิ่งสำหรับการวิเคราะห์ที่กำหนดเอง ซึ่งช่วยให้คุณ กรองสถิติการนำส่งตามป้ายกำกับหรือชุดป้ายกำกับได้ คุณเพิ่มป้ายกำกับให้กับข้อความที่ส่งผ่าน HTTP v1 API ได้โดยตั้งค่าฟิลด์ fcmOptions.analyticsLabel ในออบเจ็กต์ข้อความ หรือในฟิลด์ AndroidFcmOptions หรือ ApnsFcmOptions ที่เฉพาะเจาะจงแพลตฟอร์ม

ป้ายกำกับข้อมูลวิเคราะห์คือสตริงข้อความในรูปแบบ ^[a-zA-Z0-9-_.~%]{1,50}$ ป้ายกำกับมีตัวอักษรพิมพ์เล็กและพิมพ์ใหญ่ ตัวเลข และสัญลักษณ์ต่อไปนี้ได้

  • -
  • ~
  • %

ความยาวสูงสุด 50 อักขระ คุณระบุป้ายกำกับที่ไม่ซ้ำกันได้สูงสุด 100 รายการต่อวัน ระบบจะไม่รายงานข้อความที่มีป้ายกำกับที่เพิ่มเกินขีดจำกัดนั้น

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

ข้อมูลการนำส่งแบบรวมโดยใช้ FCM Data API

Firebase Cloud Messaging Data API ช่วยให้คุณดึงข้อมูลที่จะช่วยให้เข้าใจผลลัพธ์ของคำขอข้อความที่กำหนดเป้าหมายไปยังแอปพลิเคชัน Android ได้ API จะให้ข้อมูลรวมในอุปกรณ์ Android ทั้งหมดที่เปิดใช้การเก็บรวบรวมข้อมูลในโปรเจ็กต์ ซึ่งรวมถึงรายละเอียดเกี่ยวกับ เปอร์เซ็นต์ของข้อความที่นำส่ง โดยไม่ล่าช้า รวมถึงจำนวนข้อความที่ล่าช้าหรือถูกทิ้งภายใน Android Transport Layer การประเมินข้อมูลนี้จะเผยให้เห็นแนวโน้มในวงกว้างในการนำส่งข้อความ และช่วยให้คุณ พบวิธีที่มีประสิทธิภาพในการปรับปรุงประสิทธิภาพของคำขอส่ง ดูข้อมูลเกี่ยวกับความพร้อมใช้งานของช่วงวันที่ในรายงานได้ที่ไทม์ไลน์ข้อมูลรวม

API จะให้ข้อมูลทั้งหมดที่พร้อมใช้งานสำหรับแอปพลิเคชันที่กำหนด ดูเอกสารประกอบข้อมูลอ้างอิงของ API

ข้อมูลแบ่งออกเป็นส่วนๆ อย่างไร

ข้อมูลการนำส่งจะแบ่งตามแอปพลิเคชัน วันที่ และป้ายกำกับ Analytics การเรียก API จะแสดงข้อมูล สําหรับชุดค่าผสมของวันที่ แอปพลิเคชัน และป้ายกํากับการวิเคราะห์ทั้งหมด ตัวอย่างเช่น androidDeliveryDataออบเจ็กต์ JSON รายการเดียวจะมีลักษณะดังนี้

 {
  "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 หรือ เครื่องมือแต่งการแจ้งเตือน

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

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

ดูรายละเอียดเกี่ยวกับการเปิดใช้การส่งออกข้อมูลสำหรับ Android และ iOS ได้ที่ด้านล่าง

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

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

    • เปิดเครื่องมือแต่งการแจ้งเตือน แล้วคลิกเข้าถึง BigQuery ที่ด้านล่างของหน้า

    • จากหน้าการผสานรวม ในคอนโซล Firebase ให้คลิกลิงก์ในการ์ด BigQuery

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

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

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

เมื่อเปิดใช้การส่งออก BigQuery สำหรับ Cloud Messaging

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

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

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

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

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

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

อุปกรณ์ iOS ที่ใช้ FCM SDK 8.6.0 ขึ้นไป สามารถเปิดใช้การส่งออกข้อมูลการนำส่งข้อความของแอปได้ FCM รองรับการส่งออกข้อมูลสําหรับทั้งการแจ้งเตือนและการแจ้งเตือนในเบื้องหลัง ก่อนที่จะเปิดใช้ตัวเลือกเหล่านี้ คุณต้องสร้าง 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.extensionHelper()
      .exportDeliveryMetricsToBigQuery(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.extensionHelper().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

ข้อมูลใดบ้างที่ส่งออกไปยัง 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 ลำดับความสำคัญของข้อความ ค่าที่ใช้ได้คือ "normal" และ "high" ใน iOS ค่าเหล่านี้จะสอดคล้องกับลำดับความสำคัญของ APNs ที่ 5 และ 10
ttl INTEGER พารามิเตอร์นี้ระบุระยะเวลา (เป็นวินาที) ที่ควรเก็บข้อความไว้ในที่เก็บข้อมูลของ FCM หากอุปกรณ์ออฟไลน์
หัวข้อ STRING ชื่อของหัวข้อที่ส่งข้อความ (หากมี)
bulk_id INTEGER รหัสกลุ่มจะระบุกลุ่มของข้อความที่เกี่ยวข้อง เช่น การส่งไปยังหัวข้อที่เฉพาะเจาะจง
เหตุการณ์ STRING ประเภทของเหตุการณ์ ค่าที่เป็นไปได้มีดังนี้
  • MESSAGE_ACCEPTED: เซิร์ฟเวอร์ FCM ได้รับข้อความและคำขอถูกต้อง
  • MESSAGE_DELIVERED: ระบบได้นำส่งข้อความไปยัง FCM SDK ของแอปใน อุปกรณ์แล้ว โดยค่าเริ่มต้น ระบบจะไม่ส่งต่อช่องนี้ หากต้องการเปิดใช้ ให้ทำตามวิธีการที่ระบุไว้ใน 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 สามารถตั้งค่าป้ายกำกับข้อมูลวิเคราะห์เมื่อส่งข้อความเพื่อทำเครื่องหมาย ข้อความเพื่อวัตถุประสงค์ในการวิเคราะห์

คุณทำอะไรกับข้อมูลที่ส่งออกได้บ้าง

ส่วนต่อไปนี้มีตัวอย่างการค้นหาที่คุณเรียกใช้ใน 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;