Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

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

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

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 หรือสูงกว่า
  • การแสดงผล (ใช้ได้เฉพาะกับข้อความแจ้งเตือนบนอุปกรณ์ 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 ) ข้อมูลนี้ให้ข้อมูลเชิงลึกเกี่ยวกับการส่งข้อความจากแบ็กเอนด์ 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 สำหรับ Cloud Messaging:

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

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

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

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

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

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

ตัวยึด63

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

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

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

ต้องทำการโทรต่อไปนี้สำหรับทุกการแจ้งเตือนที่ได้รับ:

สวิฟต์

// 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 ใน payload object

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

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

สวิฟต์

// 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

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

สคีมาของตารางที่ส่งออกคือ:

_PARTITIONเวลา ประทับเวลา คอลัมน์เทียมนี้มีการประทับเวลาสำหรับการเริ่มต้นของวัน (ใน UTC) ซึ่งมีการโหลดข้อมูล สำหรับพาร์ติชัน YYYYMMDD คอลัมน์เทียมนี้มีค่า TIMESTAMP('YYYY-MM-DD')
เหตุการณ์_timestamp ประทับเวลา การประทับเวลาเหตุการณ์ตามที่บันทึกโดยเซิร์ฟเวอร์
โครงการ_number จำนวนเต็ม หมายเลขโครงการระบุโครงการที่ส่งข้อความ
ข้อความ_id STRING ID ข้อความระบุข้อความ สร้างจาก ID แอปและการประทับเวลา ในบางกรณี ID ข้อความอาจไม่ซ้ำกัน
อินสแตนซ์_id STRING รหัสเฉพาะของแอปที่ส่งข้อความถึง (หากมี) อาจเป็นรหัสอินสแตนซ์หรือรหัสการติดตั้ง Firebase
ข้อความ_ประเภท STRING ประเภทของข้อความ สามารถเป็นข้อความแจ้งเตือนหรือข้อความข้อมูล หัวข้อใช้เพื่อระบุข้อความต้นฉบับสำหรับหัวข้อหรือแคมเปญที่ส่ง ข้อความที่ตามมาเป็นข้อความแจ้งเตือนหรือข้อมูล
sdk_platform STRING แพลตฟอร์มของแอปผู้รับ
ชื่อแอป STRING ชื่อแพ็กเกจสำหรับแอป Android หรือรหัสชุดสำหรับแอป iOS
ยุบ_คีย์ STRING ปุ่มยุบระบุกลุ่มของข้อความที่สามารถยุบได้ เมื่ออุปกรณ์ไม่ได้เชื่อมต่อ เฉพาะข้อความสุดท้ายที่มีปุ่มยุบที่กำหนดเท่านั้นที่จะถูกจัดคิวสำหรับการจัดส่งในที่สุด
ลำดับความสำคัญ จำนวนเต็ม ลำดับความสำคัญของข้อความ ค่าที่ถูกต้องคือ "ปกติ" และ "สูง" บน iOS สิ่งเหล่านี้สอดคล้องกับลำดับความสำคัญของ APN 5 และ 10
ttl จำนวนเต็ม พารามิเตอร์นี้ระบุระยะเวลา (เป็นวินาที) ข้อความควรเก็บไว้ในที่จัดเก็บ FCM หากอุปกรณ์ออฟไลน์
หัวข้อ STRING ชื่อของหัวข้อที่ส่งข้อความ (ถ้ามี)
หมายเลขจำนวนมาก จำนวนเต็ม รหัสกลุ่มจะระบุกลุ่มของข้อความที่เกี่ยวข้อง เช่น ข้อความเฉพาะที่ส่งไปยังหัวข้อหนึ่งๆ
เหตุการณ์ 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;