Catch up on highlights from Firebase at Google I/O 2023. Learn more

เกี่ยวกับข้อความ FCM

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

ประเภทข้อความ

ด้วย FCM คุณสามารถส่งข้อความสองประเภทไปยังลูกค้า:

  • ข้อความแจ้งเตือน บางครั้งคิดว่าเป็น "ข้อความที่แสดง" FCM SDK จะจัดการสิ่งเหล่านี้โดยอัตโนมัติ
  • ข้อความข้อมูลซึ่งจัดการโดยแอปไคลเอนต์

ข้อความแจ้งเตือนประกอบด้วยชุดคีย์ที่ผู้ใช้มองเห็นได้ที่กำหนดไว้ล่วงหน้า ในทางตรงกันข้าม ข้อความข้อมูลจะมีเฉพาะคู่คีย์-ค่าที่คุณกำหนดเองเท่านั้น ข้อความแจ้งเตือนสามารถบรรจุเพย์โหลดข้อมูลเสริมได้ เพย์โหลดสูงสุดสำหรับข้อความทั้งสองประเภทคือ 4,000 ไบต์ ยกเว้นเมื่อส่งข้อความจากคอนโซล Firebase ซึ่งบังคับใช้ขีดจำกัด 1,024 อักขระ

ใช้สถานการณ์ วิธีส่ง
ข้อความแจ้งเตือน FCM SDK แสดงข้อความไปยังอุปกรณ์ของผู้ใช้ปลายทางในนามของแอปไคลเอ็นต์เมื่อทำงานอยู่เบื้องหลัง มิฉะนั้น หากแอปทำงานเบื้องหน้าเมื่อได้รับการแจ้งเตือน โค้ดของแอปจะเป็นตัวกำหนดลักษณะการทำงาน ข้อความแจ้งเตือนมีชุดคีย์ที่ผู้ใช้มองเห็นได้ที่กำหนดไว้ล่วงหน้าและเพย์โหลดข้อมูลเสริมของคู่คีย์-ค่าที่กำหนดเอง
  1. ในสภาพแวดล้อมที่เชื่อถือได้ เช่น Cloud Functions หรือเซิร์ฟเวอร์แอปของคุณ ให้ใช้ Admin SDK หรือ FCM Server Protocols : ตั้งค่าคีย์ notification อาจมีเพย์โหลดข้อมูลเสริม พับได้เสมอ

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

  2. ใช้ ตัวเขียนการแจ้งเตือน : ป้อนข้อความ ชื่อเรื่อง ฯลฯ แล้วส่ง เพิ่มเพย์โหลดข้อมูลเสริมโดยระบุข้อมูลที่กำหนดเอง
ข้อความข้อมูล แอปไคลเอนต์มีหน้าที่ในการประมวลผลข้อความข้อมูล ข้อความข้อมูลมีเฉพาะคู่คีย์-ค่าที่กำหนดเองโดยไม่มีชื่อคีย์ที่สงวนไว้ (ดูด้านล่าง) ในสภาพแวดล้อมที่เชื่อถือได้ เช่น Cloud Functions หรือเซิร์ฟเวอร์แอปของคุณ ให้ใช้ Admin SDK หรือ FCM Server Protocols : ตั้งค่าคีย์ data เท่านั้น

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

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

ข้อความแจ้งเตือน

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

ในการส่งข้อความแจ้งเตือนทางโปรแกรมโดยใช้ Admin SDK หรือโปรโตคอล FCM ให้ตั้งค่าคีย์ notification ด้วยชุดตัวเลือกคีย์-ค่าที่กำหนดไว้ล่วงหน้าที่จำเป็นสำหรับส่วนที่ผู้ใช้มองเห็นได้ของข้อความแจ้งเตือน ตัวอย่างเช่น นี่คือข้อความแจ้งเตือนในรูปแบบ JSON ในแอป IM ผู้ใช้สามารถคาดหวังที่จะเห็นข้อความที่มีชื่อเรื่องว่า "โปรตุเกส vs. เดนมาร์ก" และข้อความ "การจับคู่ที่ยอดเยี่ยม!" บนอุปกรณ์:

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"Portugal vs. Denmark",
      "body":"great match!"
    }
  }
}

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

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

ข้อความข้อมูล

ตั้งค่าคีย์ที่เหมาะสมกับคู่คีย์-ค่าที่คุณกำหนดเองเพื่อส่งเพย์โหลดข้อมูลไปยังแอปไคลเอ็นต์

ตัวอย่างเช่น ต่อไปนี้เป็นข้อความในรูปแบบ JSON ในแอป IM เดียวกับด้านบน ซึ่งข้อมูลจะถูกห่อหุ้มไว้ในคีย์ data ทั่วไป และแอปไคลเอนต์คาดว่าจะตีความเนื้อหา:

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "data":{
      "Nick" : "Mario",
      "body" : "great match!",
      "Room" : "PortugalVSDenmark"
    }
  }
}

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

การเข้ารหัสสำหรับข้อความข้อมูล

Android Transport Layer (ดู สถาปัตยกรรม FCM ) ใช้การเข้ารหัสแบบจุดต่อจุด คุณอาจตัดสินใจเพิ่มการเข้ารหัสจากต้นทางถึงปลายทางให้กับข้อความข้อมูล ทั้งนี้ขึ้นอยู่กับความต้องการของคุณ FCM ไม่มีโซลูชันแบบครบวงจร อย่างไรก็ตาม มีโซลูชันภายนอกที่พร้อมใช้งาน เช่น Capillary หรือ DTLS

ข้อความแจ้งเตือนพร้อมเพย์โหลดข้อมูลเสริม

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

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

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

นี่คือข้อความในรูปแบบ JSON ที่มีทั้งคีย์ notification และคีย์ data :

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"Portugal vs. Denmark",
      "body":"great match!"
    },
    "data" : {
      "Nick" : "Mario",
      "Room" : "PortugalVSDenmark"
    }
  }
}

ปรับแต่งข้อความข้ามแพลตฟอร์ม

ทั้ง SDK ผู้ดูแลระบบ Firebase และโปรโตคอล FCM v1 HTTP อนุญาตให้คำขอข้อความของคุณตั้งค่าฟิลด์ทั้งหมดที่มีในวัตถุ message ซึ่งรวมถึง:

  • ชุดของฟิลด์ทั่วไปที่อินสแตนซ์ของแอป ทั้งหมด ที่ได้รับข้อความจะตีความ
  • ชุดฟิลด์เฉพาะแพลตฟอร์ม เช่น AndroidConfig และ WebpushConfig ตีความโดยอินสแตนซ์ของแอปที่ทำงานบนแพลตฟอร์มที่ระบุเท่านั้น

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

เมื่อใดควรใช้ฟิลด์ทั่วไป

ใช้ฟิลด์ทั่วไปเมื่อคุณ:

  • การกำหนดเป้าหมายอินสแตนซ์ของแอปใน ทุก แพลตฟอร์ม — Apple, Android และเว็บ
  • การส่งข้อความไปยังหัวข้อ

อินสแตนซ์ของแอปทั้งหมด โดยไม่คำนึงถึงแพลตฟอร์ม สามารถตีความฟิลด์ทั่วไปต่อไปนี้:

เมื่อใดควรใช้ฟิลด์เฉพาะแพลตฟอร์ม

ใช้ฟิลด์เฉพาะแพลตฟอร์มเมื่อคุณต้องการ:

  • ส่งฟิลด์ไปยังแพลตฟอร์มเฉพาะเท่านั้น
  • ส่งฟิลด์เฉพาะแพลตฟอร์ม นอกเหนือจาก ฟิลด์ทั่วไป

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

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

ตัวอย่าง: ข้อความแจ้งเตือนพร้อมตัวเลือกการส่งเฉพาะแพลตฟอร์ม

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

  • กำหนดระยะเวลาในการใช้งานที่ยาวนานสำหรับแพลตฟอร์ม Android และเว็บ ในขณะที่ตั้งค่าลำดับความสำคัญของข้อความ APN (แพลตฟอร์ม Apple) เป็นการตั้งค่าต่ำ
  • ตั้งค่าคีย์ที่เหมาะสมเพื่อกำหนดผลลัพธ์ที่ผู้ใช้แตะบนการแจ้งเตือนบน Android และ Apple — click_action และ category ตามลำดับ
{
  "message":{
     "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
     "notification":{
       "title":"Match update",
       "body":"Arsenal goal in added time, score is now 3-0"
     },
     "android":{
       "ttl":"86400s",
       "notification"{
         "click_action":"OPEN_ACTIVITY_1"
       }
     },
     "apns": {
       "headers": {
         "apns-priority": "5",
       },
       "payload": {
         "aps": {
           "category": "NEW_MESSAGE_CATEGORY"
         }
       }
     },
     "webpush":{
       "headers":{
         "TTL":"86400"
       }
     }
   }
 }

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

ตัวเลือกการจัดส่ง

FCM จัดเตรียมชุดตัวเลือกการส่งเฉพาะสำหรับข้อความที่ส่งไปยังอุปกรณ์ Android และอนุญาตให้ใช้ตัวเลือกที่คล้ายกันบนแพลตฟอร์มและเว็บของ Apple ตัวอย่างเช่น พฤติกรรมข้อความแบบ "พับได้" ได้รับการสนับสนุนบน Android ผ่านทาง FCM's collapse_key , บน Apple ผ่านทาง apns-collapse-id , และบน JavaScript/เว็บ ผ่าน Topic สำหรับรายละเอียด โปรดดูคำอธิบายในส่วนนี้และเอกสารอ้างอิงที่เกี่ยวข้อง

ข้อความที่ไม่สามารถยุบตัวและยุบได้

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

กรณีการใช้งานทั่วไปของข้อความที่ไม่สามารถยุบได้ ได้แก่ ข้อความแชทหรือข้อความสำคัญ ตัวอย่างเช่น ในแอป IM คุณต้องการส่งทุกข้อความ เนื่องจากทุกข้อความมีเนื้อหาที่แตกต่างกัน

สำหรับ Android มีขีดจำกัด 100 ข้อความที่เก็บไว้โดยไม่ยุบ หากถึงขีดจำกัด ข้อความที่เก็บไว้ทั้งหมดจะถูกยกเลิก เมื่ออุปกรณ์กลับมาออนไลน์อีกครั้ง จะได้รับข้อความพิเศษที่ระบุว่าถึงขีดจำกัดแล้ว จากนั้น แอปจะสามารถจัดการกับสถานการณ์ได้อย่างเหมาะสม โดยทั่วไปแล้วโดยการร้องขอการซิงค์แบบเต็มจากเซิร์ฟเวอร์แอป

ข้อความที่ยุบได้ คือข้อความที่อาจถูกแทนที่ด้วยข้อความใหม่หากยังไม่ได้ส่งไปยังอุปกรณ์

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

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

ข้อความหัวข้อที่ไม่มีเพย์โหลดสามารถยุบได้ตามค่าเริ่มต้น ข้อความแจ้งเตือนจะยุบได้เสมอและจะไม่สนใจพารามิเตอร์ collapse_key

ฉันควรใช้อันไหน

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

ใช้สถานการณ์ วิธีส่ง
ไม่ยุบตัว ทุกข้อความมีความสำคัญต่อแอปไคลเอนต์และจำเป็นต้องส่ง ยกเว้นข้อความแจ้งเตือน ข้อความทั้งหมดจะไม่ยุบตามค่าเริ่มต้น
พับได้ เมื่อมีข้อความที่ใหม่กว่าซึ่งแสดงข้อความที่เก่ากว่าซึ่งเกี่ยวข้องกับแอปไคลเอนต์ FCM จะแทนที่ข้อความที่เก่ากว่า ตัวอย่างเช่น: ข้อความที่ใช้ในการเริ่มต้นการซิงค์ข้อมูลจากเซิร์ฟเวอร์ หรือข้อความแจ้งเตือนที่ล้าสมัย ตั้งค่าพารามิเตอร์ที่เหมาะสมในคำขอข้อความของคุณ:
  • collapseKey บน Android
  • apns-collapse-id บน Apple
  • Topic บนเว็บ
  • collapse_key ในโปรโตคอลเดิม (ทุกแพลตฟอร์ม)

การตั้งค่าลำดับความสำคัญของข้อความ

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

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

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

ต่อไปนี้คือตัวอย่างข้อความลำดับความสำคัญปกติที่ส่งผ่านโปรโตคอล FCM HTTP v1 เพื่อแจ้งสมาชิกนิตยสารว่ามีเนื้อหาใหม่ให้ดาวน์โหลด:

{
  "message":{
    "topic":"subscriber-updates",
    "notification":{
      "body" : "This week's edition is now available.",
      "title" : "NewsMagazine.com",
    },
    "data" : {
      "volume" : "3.21.15",
      "contents" : "http://www.news-magazine.com/world-week/21659772"
    },
    "android":{
      "priority":"normal"
    },
    "apns":{
      "headers":{
        "apns-priority":"5"
      }
    },
    "webpush": {
      "headers": {
        "Urgency": "high"
      }
    }
  }
}

สำหรับรายละเอียดเฉพาะแพลตฟอร์มเพิ่มเติมเกี่ยวกับการตั้งค่าลำดับความสำคัญของข้อความ:

การกำหนดอายุการใช้งานของข้อความ

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

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

บน Android และ Web/JavaScript คุณสามารถระบุอายุการใช้งานสูงสุดของข้อความได้ ค่าต้องเป็นระยะเวลาตั้งแต่ 0 ถึง 2,419,200 วินาที (28 วัน) และสอดคล้องกับระยะเวลาสูงสุดที่ FCM จัดเก็บและพยายามส่งข้อความ คำขอที่ไม่มีฟิลด์นี้เริ่มต้นเป็นระยะเวลาสูงสุดสี่สัปดาห์

ต่อไปนี้คือการใช้งานที่เป็นไปได้สำหรับคุณสมบัตินี้:

  • สายเรียกเข้าวิดีโอแชท
  • เหตุการณ์คำเชิญที่หมดอายุ
  • กิจกรรมในปฏิทิน

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

ตัวอย่างคำขอที่มี TTL มีดังนี้

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "data":{
      "Nick" : "Mario",
      "body" : "great match!",
      "Room" : "PortugalVSDenmark"
    },
    "apns":{
      "headers":{
        "apns-expiration":"1604750400"
      }
    },
    "android":{
      "ttl":"4500s"
    },
    "webpush":{
      "headers":{
        "TTL":"4500"
      }
    }
  }
}

อายุการใช้งานของข้อความ

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

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

หากเชื่อมต่ออุปกรณ์แต่อยู่ใน Doze ข้อความที่มีลำดับความสำคัญต่ำจะถูกจัดเก็บโดย FCM จนกว่าอุปกรณ์จะออกจาก Doze และนั่นคือจุดที่แฟ collapse_key มีบทบาท: หากมีข้อความที่มีคีย์ยุบ (และโทเค็นการลงทะเบียน) เดียวกันอยู่แล้วที่เก็บไว้และรอการจัดส่ง ข้อความเก่าจะถูกยกเลิกและข้อความใหม่จะเข้ามาแทนที่ (นั่นคือข้อความเก่า ข้อความถูกยุบโดยอันใหม่) อย่างไรก็ตาม หากไม่ได้ตั้งค่าคีย์การยุบ ทั้งข้อความใหม่และข้อความเก่าจะถูกเก็บไว้สำหรับการจัดส่งในอนาคต

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

หากต้องการข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับการส่งข้อความ:

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

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

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

การควบคุมและปรับขนาด

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

การควบคุมปริมาณข้อความที่ยุบได้

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

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

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

เราจำกัดข้อความที่ยุบได้ไว้ที่ 20 ข้อความต่อแอปต่ออุปกรณ์ โดยเติม 1 ข้อความทุก 3 นาที

การควบคุมเซิร์ฟเวอร์ XMPP

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

สำหรับแต่ละโครงการ FCM อนุญาตการเชื่อมต่อแบบขนาน 2,500 รายการ

อัตราข้อความสูงสุดไปยังอุปกรณ์เครื่องเดียว

สำหรับ Android คุณสามารถส่งข้อความได้สูงสุด 240 ข้อความ/นาที และ 5,000 ข้อความ/ชั่วโมง ไปยังอุปกรณ์เดียว เกณฑ์ที่สูงนี้มีขึ้นเพื่อให้มีการเข้าชมอย่างรวดเร็วในระยะสั้น เช่น เมื่อผู้ใช้โต้ตอบอย่างรวดเร็วผ่านการแชท ขีดจำกัดนี้ป้องกันข้อผิดพลาดในการส่งลอจิกจากการที่แบตเตอรี่ในอุปกรณ์หมดโดยไม่ตั้งใจ

สำหรับ iOS เราจะส่งคืนข้อผิดพลาดเมื่ออัตราเกินขีดจำกัด APN

ขีด จำกัด ข้อความอัปสตรีม

เราจำกัด ข้อความอัปสตรีมไว้ ที่ 1,500,000/นาทีต่อโปรเจ็กต์ เพื่อหลีกเลี่ยงไม่ให้เซิร์ฟเวอร์ปลายทางอัปสตรีมโอเวอร์โหลด

เราจำกัดข้อความอัปสตรีมต่ออุปกรณ์ที่ 1,000/นาที เพื่อป้องกันแบตเตอรี่หมดจากพฤติกรรมของแอพที่ไม่ดี

ขีดจำกัดข้อความหัวข้อ

อัตราการเพิ่ม/ลบการสมัครรับข้อมูลหัวข้อจำกัดอยู่ที่ 3,000 QPS ต่อโครงการ

สำหรับอัตราการส่งข้อความ โปรดดู Fanout Throttling

การควบคุม Fanout

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

การกระจายของข้อความไม่ได้เกิดขึ้นทันที ดังนั้นบางครั้งคุณจึงมีการกระจายของข้อความหลายรายการพร้อมกัน เราจำกัดจำนวน fanouts ข้อความพร้อมกันต่อโครงการที่ 1,000 หลังจากนั้น เราอาจปฏิเสธคำขอเพิ่มเติมหรือเลื่อนเวลาออกไปจนกว่าคำขอบางส่วนที่กำลังดำเนินการอยู่จะเสร็จสิ้น

อัตราการแจกแจงที่ทำได้จริงจะขึ้นอยู่กับจำนวนโปรเจ็กต์ที่ร้องขอการแจกแจงพร้อมกัน อัตรา Fanout 10,000 QPS สำหรับแต่ละโครงการไม่ใช่เรื่องแปลก แต่ตัวเลขดังกล่าวไม่ได้รับประกัน และเป็นผลมาจากโหลดทั้งหมดในระบบ สิ่งสำคัญคือต้องทราบว่าความสามารถในการกระจายที่มีอยู่นั้นถูกแบ่งตามโปรเจ็กต์ ไม่ใช่จากคำขอการกระจายทั้งหมด ดังนั้น หากโปรเจกต์ของคุณมี fanouts สองรายการที่กำลังดำเนินการอยู่ แต่ละ fanout จะเห็นเพียงครึ่งหนึ่งของอัตราการ fanout ที่มี วิธีที่แนะนำในการเพิ่มความเร็ว fanout สูงสุดคือให้ fanout ที่กำลังดำเนินการอยู่เพียง 1 รายการต่อครั้ง

พอร์ต FCM และไฟร์วอลล์ของคุณ

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

สำหรับอุปกรณ์ที่เชื่อมต่อบนเครือข่ายของคุณ FCM ไม่ได้ให้ IP ที่เฉพาะเจาะจง เนื่องจากช่วง IP ของเราเปลี่ยนแปลงบ่อยเกินไป และกฎไฟร์วอลล์ของคุณอาจล้าสมัย ซึ่งส่งผลต่อประสบการณ์ของผู้ใช้ ตามหลักการแล้ว รายการพอร์ตที่อนุญาต 5228-5230 & 443 โดยไม่มีข้อจำกัด IP อย่างไรก็ตาม หากคุณต้องมีการจำกัด IP คุณควรอนุญาตรายการที่อยู่ IP ทั้งหมดที่อยู่ใน goog.json รายการขนาดใหญ่นี้ได้รับการอัปเดตเป็นประจำ และขอแนะนำให้คุณอัปเดตกฎของคุณเป็นประจำทุกเดือน ปัญหาที่เกิดจากข้อจำกัด IP ของไฟร์วอลล์มักไม่ต่อเนื่องและวินิจฉัยได้ยาก

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

พอร์ต TCP ที่จะเปิด:

  • 5228
  • 5229
  • 5230
  • 443

ชื่อโฮสต์ที่จะเปิด:

  • mtalk.google.com
  • mtalk4.google.com
  • mtalk-staging.google.com
  • mtalk-dev.google.com
  • alt1-mtalk.google.com
  • alt2-mtalk.google.com
  • alt3-mtalk.google.com
  • alt4-mtalk.google.com
  • alt5-mtalk.google.com
  • alt6-mtalk.google.com
  • alt7-mtalk.google.com
  • alt8-mtalk.google.com
  • android.apis.google.com
  • device-provisioning.googleapis.com
  • firebaseinstallations.googleapis.com

การแปลที่อยู่เครือข่ายและ/หรือไฟร์วอลล์ Stateful Packet Inspection:

หากเครือข่ายของคุณใช้ Network Address Translation (NAT) หรือ Stateful Packet Inspection (SPI) ให้ใช้งานการเชื่อมต่อของเราผ่านพอร์ต 5228-5230 โดยใช้เวลา 30 นาทีขึ้นไป สิ่งนี้ช่วยให้เราสามารถเชื่อมต่อที่เชื่อถือได้ในขณะที่ลดการใช้แบตเตอรี่ของอุปกรณ์เคลื่อนที่ของผู้ใช้

ข้อมูลรับรอง

คุณอาจต้องใช้ข้อมูลรับรองต่อไปนี้จากโปรเจ็กต์ Firebase ทั้งนี้ขึ้นอยู่กับฟีเจอร์ FCM ที่คุณใช้:

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

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

รหัสผู้ส่ง ค่าตัวเลขที่ไม่ซ้ำกันที่สร้างขึ้นเมื่อคุณสร้างโปรเจ็กต์ Firebase ซึ่งมีอยู่ในแท็บ Cloud Messaging ของแผง การตั้งค่า คอนโซล Firebase รหัสผู้ส่งใช้เพื่อระบุผู้ส่งแต่ละรายที่สามารถส่งข้อความไปยังแอปไคลเอนต์ได้
โทเค็นการเข้าถึง โทเค็น OAuth 2.0 อายุสั้นที่อนุญาตคำขอไปยัง HTTP v1 API โทเค็นนี้เชื่อมโยงกับบัญชีบริการที่เป็นของโครงการ Firebase ของคุณ หากต้องการสร้างและหมุนเวียนโทเค็นการเข้าถึง ให้ทำตามขั้นตอนที่อธิบายไว้ใน Authorize Send Requests
รหัสเซิร์ฟเวอร์ (สำหรับโปรโตคอลเดิม)

คีย์เซิร์ฟเวอร์ที่อนุญาตให้เซิร์ฟเวอร์แอปของคุณเข้าถึงบริการของ Google รวมถึงการส่งข้อความผ่านโปรโตคอลดั้งเดิมของ Firebase Cloud Messaging คุณได้รับรหัสเซิร์ฟเวอร์เมื่อคุณสร้างโปรเจ็กต์ Firebase คุณสามารถดูได้ในแท็บ Cloud Messaging ของแผง การตั้งค่า คอนโซล Firebase

ข้อสำคัญ: อย่ารวมรหัสเซิร์ฟเวอร์ไว้ที่ใดก็ได้ในรหัสไคลเอนต์ของคุณ นอกจากนี้ ตรวจสอบให้แน่ใจว่าใช้คีย์เซิร์ฟเวอร์เท่านั้นในการอนุญาตเซิร์ฟเวอร์แอปของคุณ คีย์ Android, แพลตฟอร์ม Apple และเบราว์เซอร์ถูกปฏิเสธโดย FCM