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

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

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

เมื่อใช้ FCM คุณจะส่งข้อความ 2 ประเภทไปยังลูกค้าได้ ดังนี้

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

กรณีที่ควรใช้ช่องทั่วไป

ใช้ช่องทั่วไปเมื่อคุณทำสิ่งต่อไปนี้

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

อินสแตนซ์แอปทั้งหมด ไม่ว่าจะแพลตฟอร์มใดก็ตาม จะตีความช่องทั่วไปต่อไปนี้ได้

กรณีที่ควรใช้ช่องเฉพาะแพลตฟอร์ม

ใช้ช่องเฉพาะแพลตฟอร์มเมื่อต้องการทําสิ่งต่อไปนี้

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

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

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

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

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

  • ตั้งค่าลำดับความสำคัญของข้อความ 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 ผ่าน collapse_key ของ FCM, ใน Apple ผ่าน apns-collapse-id และใน JavaScript/เว็บผ่าน Topic ดูรายละเอียดได้ใน คำอธิบายในส่วนนี้และเอกสารอ้างอิงที่เกี่ยวข้อง

ข้อความที่ยุบไม่ได้หรือยุบได้

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

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

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

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

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

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

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

ฉันควรใช้รุ่นใด

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

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

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

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

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

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

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

{
  "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 และเว็บ/JavaScript คุณจะระบุอายุการใช้งานสูงสุดของข้อความได้ ค่านี้ต้องเป็นระยะเวลาตั้งแต่ 0 ถึง 2,419,200 วินาที (28 วัน) และสอดคล้องกับระยะเวลาสูงสุดที่ FCM จัดเก็บและพยายามส่งข้อความ คำขอที่ไม่มีช่องนี้จะมีค่าเริ่มต้นเป็นระยะเวลาสูงสุด 4 สัปดาห์

การใช้งานฟีเจอร์นี้ที่เป็นไปได้บางส่วนมีดังนี้

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

จำนวนข้อความสูงสุดของหัวข้อ

อัตราการเพิ่ม/นำการสมัครใช้บริการหัวข้อออกจำกัดไว้ที่ 3,000 QPS ต่อโปรเจ็กต์

โปรดดูอัตราการส่งข้อความที่การควบคุมแฟนเอาต์

การควบคุมแฟนเอาต์

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

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

อัตราการ Fanout ที่เกิดขึ้นจริงจะขึ้นอยู่กับจำนวนโปรเจ็กต์ที่ขอการ Fanout พร้อมกัน อัตรา Fanout ที่ 10,000 QPS สำหรับแต่ละโปรเจ็กต์ไม่ใช่เรื่องปกติ แต่ตัวเลขดังกล่าวไม่ใช่การรับประกัน และเป็นผลจากภาระงานทั้งหมดในระบบ โปรดทราบว่าความสามารถในการ Fanout ที่ใช้ได้จะแบ่งเป็นโปรเจ็กต์ต่างๆ ไม่ใช่คำขอการ Fanout ดังนั้น หากโปรเจ็กต์ของคุณมี Fanout 2 รายการที่ดำเนินการอยู่ การ 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

ไฟร์วอลล์การแปลงที่อยู่เครือข่ายและ/หรือการตรวจสอบแพ็กเก็ตเก็บสถานะ:

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

การโต้ตอบกับ VPN และการข้ามได้

Firebase Cloud Messaging มีขั้นตอนต่างๆ เพื่อให้แน่ใจว่าการเชื่อมต่อการรับส่งข้อความพุชจากโทรศัพท์ไปยังเซิร์ฟเวอร์นั้นเชื่อถือได้และพร้อมใช้งานบ่อยที่สุดเท่าที่จะทำได้ การใช้ VPN ทำให้การดำเนินการนี้ยุ่งยากมากขึ้น

VPN จะมาสก์ข้อมูลสำคัญที่ FCM ต้องใช้ในการปรับแต่งการเชื่อมต่อเพื่อเพิ่มความเสถียรและอายุการใช้งานแบตเตอรี่ให้สูงสุด ในบางกรณี VPN จะขัดขวางการเชื่อมต่อระยะเวลานาน ซึ่งส่งผลให้ผู้ใช้ได้รับประสบการณ์ที่ไม่ดีเนื่องจากไม่ได้รับข้อความหรือข้อความล่าช้า หรือมีค่าใช้จ่ายแบตเตอรี่สูง เมื่อมีการกำหนดค่า VPN ที่อนุญาตให้เราดำเนินการได้ เราจะข้าม VPN โดยใช้การเชื่อมต่อที่เข้ารหัส (ผ่านเครือข่าย Wi-Fi พื้นฐานหรือ LTE) เพื่อให้ผู้ใช้ได้รับประสบการณ์ที่เชื่อถือได้และเป็นมิตรกับแบตเตอรี่ การใช้งาน VPN ที่ข้ามได้ของ FCM มีไว้สำหรับช่องทางข้อความ Push ของ FCM โดยเฉพาะ การเข้าชม FCM อื่นๆ เช่น การเข้าชมการลงทะเบียน จะใช้ VPN หากเปิดใช้งานอยู่ เมื่อการเชื่อมต่อ FCM ข้าม VPN แล้ว VPN จะสูญเสียสิทธิประโยชน์เพิ่มเติมที่ VPN อาจมี เช่น การมาสก์ IP

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

หากไม่ได้กำหนดค่า VPN ให้ข้ามได้ Firebase Cloud Messaging จะใช้เครือข่าย VPN เพื่อเชื่อมต่อกับเซิร์ฟเวอร์ ซึ่งอาจส่งผลให้ข้อความล่าช้าและอาจส่งผลให้มีการใช้แบตเตอรี่มากขึ้น เนื่องจาก Cloud Messaging พยายามรักษาการเชื่อมต่อผ่านการเชื่อมต่อ VPN

ข้อมูลเข้าสู่ระบบ

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

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

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

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

คีย์เซิร์ฟเวอร์ที่ให้สิทธิ์เซิร์ฟเวอร์แอปในการเข้าถึงบริการของ Google ซึ่งรวมถึงการส่งข้อความผ่านโปรโตคอลเดิมของ Firebase Cloud Messaging ที่เลิกใช้งานแล้ว

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