Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

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

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

FCM มีชุดเครื่องมือสามชุดที่จะช่วยให้คุณได้รับข้อมูลเชิงลึกเกี่ยวกับการส่งข้อความ:

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

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

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

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

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

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

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

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

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

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

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

ป้ายกำกับ Analytics คือสตริงข้อความในรูปแบบ ^[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

ข้อมูลถูกแบ่งอย่างไร?

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

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

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

ข้อจำกัดของ API

ไทม์ไลน์ข้อมูลรวม

API จะส่งคืนข้อมูลย้อนหลัง 7 วัน อย่างไรก็ตาม ข้อมูลที่ส่งคืนโดย API นี้จะล่าช้าไม่เกิน 5 วัน ตัวอย่างเช่น ในวันที่ 20 มกราคม ข้อมูลสำหรับวันที่ 9 มกราคม - 15 มกราคมจะพร้อมใช้งาน แต่ไม่ใช่สำหรับวันที่ 16 มกราคมหรือหลังจากนั้น นอกจากนี้ ข้อมูลจะถูกจัดเตรียมอย่างดีที่สุด ในกรณีที่ข้อมูลขาดหาย FCM จะดำเนินการแก้ไขล่วงหน้าและจะไม่เติมข้อมูลใหม่หลังจากแก้ไขปัญหาแล้ว ในกรณีที่เกิดไฟฟ้าดับครั้งใหญ่ ข้อมูลอาจไม่พร้อมใช้งานเป็นเวลาหนึ่งสัปดาห์หรือนานกว่านั้น

ความครอบคลุมของข้อมูล

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

ข้อความที่ยุบ

ข้อความที่ถูก ยุบ โดยข้อความอื่นจะไม่ปรากฏในชุดข้อมูล

ข้อความไปยังอุปกรณ์ที่ไม่ได้ใช้งาน

ข้อความที่ส่งไปยังอุปกรณ์ที่ไม่ได้ใช้งานอาจแสดงหรือไม่ปรากฏในชุดข้อมูล ทั้งนี้ขึ้นอยู่กับเส้นทางข้อมูลที่ใช้ ซึ่งอาจนำไปสู่การนับผิดใน 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 สำหรับการรับส่งข้อความในระบบคลาวด์:

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

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

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

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

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

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

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

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

เนื่องจากมีเพียงการแจ้งเตือนเท่านั้นที่สามารถทริกเกอร์ส่วนขยายแอปบริการแจ้งเตือนได้ คุณต้องเพิ่มส่วนขยายบริการแจ้งเตือนไปยังแอปของคุณและเรียก 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)
  }
}

วัตถุประสงค์-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.extensionHelper().exportDeliveryMetricsToBigQuery(withMessageInfo:userInfo)
}

วัตถุประสงค์-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 จำนวนเต็ม หมายเลขโครงการระบุโครงการที่ส่งข้อความ
message_id STRING รหัสข้อความระบุข้อความ สร้างขึ้นจาก App ID และการประทับเวลา ในบางกรณี ID ข้อความอาจไม่ซ้ำกันทั่วโลก
อินสแตนซ์_id STRING รหัสเฉพาะของแอพที่ส่งข้อความถึง (ถ้ามี) อาจเป็น ID อินสแตนซ์หรือ ID การติดตั้ง Firebase
message_type STRING ประเภทของข้อความ สามารถเป็นข้อความแจ้งเตือนหรือข้อความข้อมูล หัวข้อใช้เพื่อระบุข้อความต้นฉบับสำหรับหัวข้อหรือแคมเปญที่ส่ง ข้อความต่อมาอาจเป็นข้อความแจ้งเตือนหรือข้อมูล
sdk_platform STRING แพลตฟอร์มของแอปผู้รับ
app_name STRING ชื่อแพ็กเกจสำหรับแอป Android หรือรหัสชุดสำหรับแอป iOS
ยุบ_key STRING คีย์ยุบระบุกลุ่มข้อความที่สามารถยุบได้ เมื่อไม่ได้เชื่อมต่ออุปกรณ์ เฉพาะข้อความสุดท้ายที่มีคีย์ยุบที่กำหนดเท่านั้นที่จะถูกจัดคิวสำหรับการจัดส่งในท้ายที่สุด
ลำดับความสำคัญ จำนวนเต็ม ลำดับความสำคัญของข้อความ ค่าที่ถูกต้องคือ "ปกติ" และ "สูง" บน iOS สิ่งเหล่านี้สอดคล้องกับลำดับความสำคัญของ APN 5 และ 10
ttl จำนวนเต็ม พารามิเตอร์นี้ระบุระยะเวลา (เป็นวินาที) ที่ข้อความควรเก็บไว้ในที่เก็บข้อมูล FCM หากอุปกรณ์ออฟไลน์
หัวข้อ STRING ชื่อของหัวข้อที่ส่งข้อความ (ถ้ามี)
bulk_id จำนวนเต็ม ID จำนวนมากจะระบุกลุ่มของข้อความที่เกี่ยวข้อง เช่น การส่งไปยังหัวข้อโดยเฉพาะ
เหตุการณ์ 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>; .

คำนวณระยะเวลา fanout สำหรับหัวข้อหรือแคมเปญที่กำหนด

เวลาเริ่มต้นของ fanout คือเมื่อได้รับคำขอเดิม และเวลาสิ้นสุดคือเวลาที่ข้อความแต่ละข้อความล่าสุดที่กำหนดเป้าหมายไปยังอินสแตนซ์เดียว

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;