Giới thiệu về tin nhắn FCM

Firebase Cloud Messaging (FCM) cung cấp nhiều tùy chọn và khả năng nhắn tin. Thông tin trong trang này nhằm giúp bạn hiểu các loại thông báo FCM khác nhau và những gì bạn có thể làm với chúng.

Các loại tin nhắn

Với FCM, bạn có thể gửi hai loại tin nhắn cho khách hàng:

  • Tin nhắn thông báo, đôi khi được coi là "tin nhắn hiển thị". Những điều này được FCM SDK xử lý tự động.
  • Tin nhắn dữ liệu, được xử lý bởi ứng dụng khách.

Tin nhắn thông báo chứa một tập hợp các khóa mà người dùng có thể nhìn thấy được xác định trước. Ngược lại, thông báo dữ liệu chỉ chứa các cặp khóa-giá trị tùy chỉnh do người dùng xác định. Tin nhắn thông báo có thể chứa tải trọng dữ liệu tùy chọn. Tải trọng tối đa cho cả hai loại tin nhắn là 4000 byte, ngoại trừ khi gửi tin nhắn từ bảng điều khiển Firebase, bảng điều khiển này thực thi giới hạn 1000 ký tự.

Sử dụng kịch bản Làm cách nào để gửi
Tin nhắn thông báo FCM SDK hiển thị thông báo tới các thiết bị của người dùng cuối thay mặt cho ứng dụng khách khi ứng dụng này chạy ở chế độ nền. Ngược lại, nếu ứng dụng đang chạy ở nền trước khi nhận được thông báo thì mã của ứng dụng sẽ xác định hành vi. Tin nhắn thông báo có một tập hợp các khóa hiển thị cho người dùng được xác định trước và tải trọng dữ liệu tùy chọn gồm các cặp khóa-giá trị tùy chỉnh.
  1. Trong môi trường đáng tin cậy như Cloud Functions hoặc máy chủ ứng dụng của bạn, hãy sử dụng SDK quản trị hoặc API HTTP v1 . Đặt phím notification . Có thể có tải trọng dữ liệu tùy chọn. Luôn có thể thu gọn.

    Xem một số ví dụ về hiển thị thông báo và gửi tải trọng yêu cầu.

  2. Sử dụng Trình soạn thảo thông báo : Nhập Nội dung tin nhắn, Tiêu đề, v.v. và gửi. Thêm tải trọng dữ liệu tùy chọn bằng cách cung cấp dữ liệu Tùy chỉnh.
Thông báo dữ liệu Ứng dụng khách chịu trách nhiệm xử lý tin nhắn dữ liệu. Thông báo dữ liệu chỉ có cặp khóa-giá trị tùy chỉnh không có tên khóa dành riêng (xem bên dưới). Trong môi trường đáng tin cậy như Cloud Functions hoặc máy chủ ứng dụng của bạn, hãy sử dụng SDK quản trị hoặc Giao thức máy chủ FCM . Trong yêu cầu gửi, Đặt khóa data .

Sử dụng tin nhắn thông báo khi bạn muốn FCM SDK xử lý việc tự động hiển thị thông báo khi ứng dụng của bạn đang chạy ở chế độ nền. Sử dụng tin nhắn dữ liệu khi bạn muốn xử lý tin nhắn bằng mã ứng dụng khách của riêng bạn.

FCM có thể gửi tin nhắn thông báo bao gồm tải trọng dữ liệu tùy chọn. Trong những trường hợp như vậy, FCM xử lý việc hiển thị tải trọng thông báo và ứng dụng khách sẽ xử lý tải trọng dữ liệu.

Tin nhắn thông báo

Để thử nghiệm hoặc để tiếp thị và thu hút lại người dùng, bạn có thể gửi tin nhắn thông báo bằng bảng điều khiển Firebase . Bảng điều khiển Firebase cung cấp thử nghiệm A/B dựa trên phân tích để giúp bạn tinh chỉnh và cải thiện thông điệp tiếp thị.

Để gửi tin nhắn thông báo theo chương trình bằng cách sử dụng SDK quản trị viên hoặc giao thức FCM, hãy đặt khóa notification với bộ tùy chọn khóa-giá trị cần thiết được xác định trước cho phần mà người dùng có thể nhìn thấy của tin nhắn thông báo. Ví dụ: đây là tin nhắn thông báo có định dạng JSON trong ứng dụng IM. Người dùng có thể mong đợi nhìn thấy thông báo có tiêu đề "Bồ Đào Nha vs. Đan Mạch" và nội dung "trận đấu tuyệt vời!" trên thiết bị:

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

Tin nhắn thông báo được gửi đến khay thông báo khi ứng dụng ở chế độ nền. Đối với các ứng dụng ở nền trước, tin nhắn được xử lý bằng chức năng gọi lại.

Xem tài liệu tham khảo đối tượng thông báo Giao thức HTTP v1 để biết danh sách đầy đủ các khóa được xác định trước có sẵn để xây dựng thông báo thông báo.

Thông điệp dữ liệu

Đặt khóa thích hợp với các cặp khóa-giá trị tùy chỉnh của bạn để gửi tải trọng dữ liệu đến ứng dụng khách.

Ví dụ: đây là một tin nhắn có định dạng JSON trong cùng một ứng dụng IM như trên, trong đó thông tin được gói gọn trong khóa data chung và ứng dụng khách dự kiến ​​sẽ diễn giải nội dung:

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

Ví dụ trên cho thấy việc sử dụng trường dữ liệu cấp cao nhất hoặc trường data chung, được khách hàng trên tất cả các nền tảng nhận được thông báo diễn giải. Trên mỗi nền tảng, ứng dụng khách sẽ nhận được trọng tải dữ liệu trong chức năng gọi lại.

Mã hóa tin nhắn dữ liệu

Lớp truyền tải Android (xem kiến ​​trúc FCM ) sử dụng mã hóa điểm-điểm. Tùy thuộc vào nhu cầu của mình, bạn có thể quyết định thêm mã hóa hai đầu vào tin nhắn dữ liệu. FCM không cung cấp giải pháp toàn diện. Tuy nhiên, có sẵn các giải pháp bên ngoài như Capillary hoặc DTLS .

Tin nhắn thông báo với tải trọng dữ liệu tùy chọn

Theo lập trình hoặc thông qua bảng điều khiển Firebase, bạn có thể gửi tin nhắn thông báo chứa tải trọng tùy chọn gồm các cặp khóa-giá trị tùy chỉnh. Trong Trình soạn thảo thông báo , hãy sử dụng các trường Dữ liệu tùy chỉnh trong Tùy chọn nâng cao .

Hành vi của ứng dụng khi nhận được tin nhắn bao gồm cả tải trọng thông báo và dữ liệu tùy thuộc vào việc ứng dụng ở chế độ nền hay nền trước—về cơ bản, ứng dụng đó có hoạt động hay không tại thời điểm nhận.

  • Khi ở chế độ nền , các ứng dụng sẽ nhận được tải trọng thông báo trong khay thông báo và chỉ xử lý tải trọng dữ liệu khi người dùng nhấn vào thông báo.
  • Khi ở nền trước , ứng dụng của bạn sẽ nhận được một đối tượng tin nhắn có sẵn cả hai tải trọng.

Đây là thông báo có định dạng JSON chứa cả khóa notification và khóa data :

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

Tùy chỉnh tin nhắn trên các nền tảng

SDK quản trị Firebase và giao thức HTTP FCM v1 đều cho phép các yêu cầu tin nhắn của bạn đặt tất cả các trường có sẵn trong đối tượng message . Điêu nay bao gôm:

  • một tập hợp các trường chung được diễn giải bởi tất cả các phiên bản ứng dụng nhận được thông báo.
  • tập hợp các trường dành riêng cho nền tảng, chẳng hạn như AndroidConfigWebpushConfig , chỉ được diễn giải bởi các phiên bản ứng dụng chạy trên nền tảng được chỉ định.

Khối dành riêng cho nền tảng giúp bạn linh hoạt tùy chỉnh tin nhắn cho các nền tảng khác nhau để đảm bảo rằng chúng được xử lý chính xác khi nhận được. Phần phụ trợ FCM sẽ tính đến tất cả các tham số được chỉ định và tùy chỉnh thông báo cho từng nền tảng.

Khi nào nên sử dụng các trường chung

Sử dụng các trường chung khi bạn:

  • Nhắm mục tiêu các phiên bản ứng dụng trên tất cả các nền tảng - Apple, Android và web
  • Gửi tin nhắn theo chủ đề

Tất cả các phiên bản ứng dụng, bất kể nền tảng, đều có thể diễn giải các trường phổ biến sau:

Khi nào nên sử dụng các trường dành riêng cho nền tảng

Sử dụng các trường dành riêng cho nền tảng khi bạn muốn:

  • Chỉ gửi các trường đến các nền tảng cụ thể
  • Gửi các trường dành riêng cho nền tảng bên cạnh các trường chung

Bất cứ khi nào bạn chỉ muốn gửi giá trị đến các nền tảng cụ thể, đừng sử dụng các trường chung; sử dụng các trường dành riêng cho nền tảng. Ví dụ: để chỉ gửi thông báo tới nền tảng và web của Apple chứ không phải tới Android, bạn phải sử dụng hai nhóm trường riêng biệt, một cho Apple và một cho web.

Khi bạn gửi tin nhắn với các tùy chọn gửi cụ thể , hãy sử dụng các trường dành riêng cho nền tảng để đặt chúng. Bạn có thể chỉ định các giá trị khác nhau cho mỗi nền tảng nếu muốn. Tuy nhiên, ngay cả khi bạn muốn đặt cùng một giá trị trên các nền tảng, bạn phải sử dụng các trường dành riêng cho nền tảng. Điều này là do mỗi nền tảng có thể diễn giải giá trị hơi khác nhau—ví dụ: thời gian tồn tại được đặt trên Android là thời gian hết hạn tính bằng giây, trong khi trên Apple, thời gian tồn tại được đặt là ngày hết hạn .

Ví dụ: tin nhắn thông báo với các tùy chọn gửi dành riêng cho nền tảng

Yêu cầu gửi v1 sau đây sẽ gửi tiêu đề và nội dung thông báo chung tới tất cả các nền tảng, nhưng cũng gửi một số thông tin ghi đè dành riêng cho nền tảng. Cụ thể là yêu cầu:

  • đặt thời gian tồn tại lâu dài cho nền tảng Android và Web, đồng thời đặt mức độ ưu tiên của thông báo APN (nền tảng Apple) ở cài đặt thấp
  • đặt các phím thích hợp để xác định kết quả của một lần người dùng nhấn vào thông báo trên Android và Apple - click_actioncategory tương ứng.
{
  "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"
       }
     }
   }
 }

Xem tài liệu tham khảo HTTP v1 để biết chi tiết đầy đủ về các khóa có sẵn trong các khối dành riêng cho nền tảng trong nội dung thư. Để biết thêm thông tin về cách xây dựng yêu cầu gửi có chứa nội dung thư, hãy xem Xây dựng yêu cầu gửi .

Tùy chọn giao hàng

FCM cung cấp một bộ tùy chọn gửi cụ thể cho tin nhắn được gửi tới thiết bị Android và cho phép các tùy chọn tương tự trên nền tảng và web của Apple. Ví dụ: hành vi thông báo "có thể thu gọn" được hỗ trợ trên Android thông qua collapse_key của FCM, trên Apple thông qua apns-collapse-id và trên JavaScript/Web thông qua Topic . Để biết chi tiết, hãy xem mô tả trong phần này và tài liệu tham khảo liên quan.

Tin nhắn không thể thu gọn và có thể thu gọn

Một tin nhắn không thể thu gọn biểu thị rằng mỗi tin nhắn riêng lẻ đã được gửi đến thiết bị. Tin nhắn không thể thu gọn sẽ cung cấp một số nội dung hữu ích, trái ngược với tin nhắn có thể thu gọn như "ping" không có nội dung tới ứng dụng di động để liên hệ với máy chủ nhằm tìm nạp dữ liệu.

Một số trường hợp sử dụng điển hình của tin nhắn không thể thu gọn là tin nhắn trò chuyện hoặc tin nhắn quan trọng. Ví dụ: trong ứng dụng IM, bạn muốn gửi mọi tin nhắn vì mỗi tin nhắn đều có nội dung khác nhau.

Đối với Android, có giới hạn 100 tin nhắn có thể được lưu trữ mà không bị thu gọn. Nếu đạt đến giới hạn, tất cả tin nhắn được lưu trữ sẽ bị loại bỏ. Khi thiết bị trực tuyến trở lại, thiết bị sẽ nhận được một thông báo đặc biệt cho biết đã đạt đến giới hạn. Sau đó, ứng dụng có thể xử lý tình huống này một cách chính xác, thường bằng cách yêu cầu đồng bộ hóa hoàn toàn từ máy chủ ứng dụng.

Tin nhắn có thể thu gọn là tin nhắn có thể được thay thế bằng tin nhắn mới nếu nó chưa được gửi đến thiết bị.

Trường hợp sử dụng phổ biến của tin nhắn có thể thu gọn là tin nhắn dùng để yêu cầu ứng dụng di động đồng bộ hóa dữ liệu từ máy chủ. Một ví dụ là một ứng dụng thể thao cập nhật cho người dùng tỷ số mới nhất. Chỉ tin nhắn gần đây nhất có liên quan.

Để đánh dấu tin nhắn là có thể thu gọn trên Android, hãy đưa tham số collapse_key vào tải trọng tin nhắn. Theo mặc định, khóa thu gọn là tên gói ứng dụng được đăng ký trong bảng điều khiển Firebase. Máy chủ FCM có thể lưu trữ đồng thời bốn tin nhắn có thể thu gọn khác nhau trên mỗi thiết bị, mỗi tin nhắn có một khóa thu gọn khác nhau. Nếu bạn vượt quá con số này, FCM chỉ giữ bốn khóa thu gọn và không đảm bảo khóa nào sẽ được giữ.

Các tin nhắn theo chủ đề không có tải trọng sẽ được thu gọn theo mặc định. Thông báo thông báo luôn có thể thu gọn và sẽ bỏ qua tham số collapse_key .

Tôi nên sử dụng cái nào?

Thông báo có thể thu gọn là lựa chọn tốt hơn từ quan điểm hiệu suất, miễn là ứng dụng của bạn không cần sử dụng thông báo không thể thu gọn. Tuy nhiên, nếu bạn sử dụng thông báo có thể thu gọn, hãy nhớ rằng FCM chỉ cho phép FCM sử dụng tối đa bốn khóa thu gọn khác nhau cho mỗi mã thông báo đăng ký tại bất kỳ thời điểm nào. Bạn không được vượt quá con số này, nếu không nó có thể gây ra những hậu quả khó lường.

Sử dụng kịch bản Làm cách nào để gửi
Không thể thu gọn Mọi tin nhắn đều quan trọng đối với ứng dụng khách và cần được gửi. Ngoại trừ tin nhắn thông báo, theo mặc định, tất cả tin nhắn đều không thể thu gọn được.
Có thể thu gọn Khi có một tin nhắn mới hơn hiển thị một tin nhắn cũ hơn, có liên quan không liên quan đến ứng dụng khách, FCM sẽ thay thế tin nhắn cũ hơn. Ví dụ: tin nhắn được sử dụng để bắt đầu đồng bộ hóa dữ liệu từ máy chủ hoặc tin nhắn thông báo đã lỗi thời. Đặt tham số thích hợp trong yêu cầu tin nhắn của bạn:
  • collapseKey trên Android
  • apns-collapse-id trên Apple
  • Topic trên Web
  • collapse_key trong các giao thức cũ (tất cả các nền tảng)

Đặt mức độ ưu tiên của tin nhắn

Bạn có hai tùy chọn để chỉ định mức độ ưu tiên gửi cho các thư xuôi dòng: mức độ ưu tiên bình thường và mức độ ưu tiên cao. Mặc dù hành vi hơi khác nhau giữa các nền tảng, việc gửi tin nhắn bình thường và có mức độ ưu tiên cao sẽ hoạt động như sau:

  • Ưu tiên bình thường. Các tin nhắn có mức độ ưu tiên thông thường sẽ được gửi ngay lập tức khi ứng dụng chạy ở nền trước. Đối với các ứng dụng chạy nền, việc phân phối có thể bị trì hoãn. Đối với các thư ít nhạy cảm về thời gian hơn, chẳng hạn như thông báo về email mới, giữ cho giao diện người dùng của bạn được đồng bộ hóa hoặc đồng bộ hóa dữ liệu ứng dụng ở chế độ nền, hãy chọn mức độ ưu tiên gửi bình thường.

  • Ưu tiên cao. FCM cố gắng gửi tin nhắn có mức độ ưu tiên cao ngay lập tức ngay cả khi thiết bị ở chế độ Ngủ sâu. Tin nhắn có mức độ ưu tiên cao dành cho nội dung nhạy cảm về thời gian, người dùng có thể nhìn thấy.

Dưới đây là ví dụ về thông báo ưu tiên thông thường được gửi qua giao thức FCM HTTP v1 để thông báo cho người đăng ký tạp chí rằng có nội dung mới để tải xuống:

{
  "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"
      }
    }
  }
}

Để biết thêm chi tiết cụ thể về nền tảng về cài đặt mức độ ưu tiên của tin nhắn:

Đặt thời gian tồn tại của tin nhắn

FCM thường gửi tin nhắn ngay sau khi chúng được gửi. Tuy nhiên, điều này có thể không phải lúc nào cũng có thể. Ví dụ: nếu nền tảng là Android thì thiết bị có thể bị tắt, ngoại tuyến hoặc không khả dụng. Hoặc FCM có thể cố tình trì hoãn tin nhắn để ngăn ứng dụng tiêu thụ quá nhiều tài nguyên và ảnh hưởng tiêu cực đến tuổi thọ pin.

Khi điều này xảy ra, FCM sẽ lưu trữ tin nhắn và gửi nó ngay khi có thể. Mặc dù điều này ổn trong hầu hết các trường hợp, nhưng có một số ứng dụng mà tin nhắn muộn có thể không bao giờ được gửi. Ví dụ: nếu tin nhắn là thông báo cuộc gọi đến hoặc trò chuyện video thì nó chỉ có ý nghĩa trong một khoảng thời gian ngắn trước khi cuộc gọi kết thúc. Hoặc nếu tin nhắn là lời mời tham gia một sự kiện thì sẽ vô ích nếu nhận được sau khi sự kiện kết thúc.

Trên Android và Web/JavaScript, bạn có thể chỉ định thời lượng tối đa của tin nhắn. Giá trị phải có khoảng thời gian từ 0 đến 2.419.200 giây (28 ngày) và tương ứng với khoảng thời gian tối đa mà FCM lưu trữ và cố gắng gửi tin nhắn. Các yêu cầu không chứa trường này được mặc định có thời hạn tối đa là bốn tuần.

Dưới đây là một số cách sử dụng có thể có của tính năng này:

  • Cuộc gọi đến trò chuyện video
  • Sự kiện mời hết hạn
  • Sự kiện lịch

Một ưu điểm khác của việc chỉ định tuổi thọ của tin nhắn là FCM không áp dụng tính năng điều tiết tin nhắn có thể thu gọn cho các tin nhắn có giá trị thời gian tồn tại là 0 giây. FCM cung cấp khả năng xử lý tốt nhất các tin nhắn phải được gửi "bây giờ hoặc không bao giờ". Hãy nhớ rằng giá trị time_to_live bằng 0 có nghĩa là những tin nhắn không thể gửi ngay lập tức sẽ bị loại bỏ. Tuy nhiên, vì những tin nhắn như vậy không bao giờ được lưu trữ nên điều này mang lại độ trễ tốt nhất để gửi tin nhắn thông báo.

Dưới đây là ví dụ về yêu cầu bao gồm 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"
      }
    }
  }
}

Tuổi thọ của tin nhắn

Khi máy chủ ứng dụng đăng tin nhắn lên FCM và nhận lại ID tin nhắn, điều đó không có nghĩa là tin nhắn đã được gửi đến thiết bị. Đúng hơn, nó có nghĩa là nó đã được chấp nhận để giao hàng. Điều gì xảy ra với tin nhắn sau khi nó được chấp nhận phụ thuộc vào nhiều yếu tố.

Trong trường hợp tốt nhất, nếu thiết bị được kết nối với FCM, màn hình bật và không có hạn chế điều tiết thì tin nhắn sẽ được gửi ngay lập tức.

Nếu thiết bị được kết nối nhưng ở chế độ Ngủ sâu, một tin nhắn có mức độ ưu tiên thấp sẽ được FCM lưu trữ cho đến khi thiết bị thoát khỏi Chế độ Ngủ sâu. Và đó là lúc cờ collapse_key đóng vai trò: nếu đã có một tin nhắn có cùng khóa thu gọn (và mã thông báo đăng ký) được lưu trữ và chờ gửi, thì tin nhắn cũ sẽ bị loại bỏ và tin nhắn mới sẽ thay thế nó (nghĩa là tin nhắn cũ tin nhắn được thu gọn bởi tin nhắn mới). Tuy nhiên, nếu khóa thu gọn không được đặt thì cả tin nhắn mới và tin nhắn cũ đều được lưu trữ để gửi trong tương lai.

Nếu thiết bị không được kết nối với FCM, tin nhắn sẽ được lưu trữ cho đến khi kết nối được thiết lập (một lần nữa tôn trọng các quy tắc khóa thu gọn). Khi kết nối được thiết lập, FCM sẽ gửi tất cả các tin nhắn đang chờ xử lý tới thiết bị. Nếu thiết bị không bao giờ được kết nối lại (ví dụ: nếu thiết bị đã được khôi phục cài đặt gốc), thì cuối cùng, tin nhắn sẽ hết thời gian chờ và bị loại bỏ khỏi bộ lưu trữ FCM. Thời gian chờ mặc định là bốn tuần, trừ khi cờ time_to_live được đặt.

Để hiểu rõ hơn về việc gửi tin nhắn:

    Để hiểu rõ hơn về việc gửi tin nhắn trên nền tảng Android hoặc Apple, hãy xem trang tổng quan báo cáo FCM , nơi ghi lại số lượng tin nhắn đã gửi và mở trên thiết bị Apple và Android, cùng với dữ liệu về "số lần hiển thị" (thông báo mà người dùng đã xem) cho Ứng dụng Android.

Đối với thiết bị Android đã bật tính năng nhắn tin kênh trực tiếp, nếu thiết bị không kết nối với FCM trong hơn một tháng, FCM vẫn chấp nhận tin nhắn nhưng sẽ loại bỏ ngay lập tức. Nếu thiết bị kết nối trong vòng bốn tuần kể từ tin nhắn dữ liệu cuối cùng bạn gửi tới thiết bị, máy khách của bạn sẽ nhận được lệnh gọi lại onDeletedMessages() . Sau đó, ứng dụng có thể xử lý tình huống này một cách chính xác, thường bằng cách yêu cầu đồng bộ hóa hoàn toàn từ máy chủ ứng dụng.

Cuối cùng, khi FCM cố gắng gửi tin nhắn đến thiết bị và ứng dụng đã bị gỡ cài đặt, FCM sẽ loại bỏ tin nhắn đó ngay lập tức và làm mất hiệu lực mã thông báo đăng ký. Những lần thử gửi tin nhắn tới thiết bị đó trong tương lai sẽ dẫn đến lỗi NotRegistered .

Điều tiết và mở rộng quy mô

Mục tiêu của chúng tôi là luôn chuyển tải mọi tin nhắn được gửi qua FCM. Tuy nhiên, việc gửi mọi tin nhắn đôi khi dẫn đến trải nghiệm chung của người dùng kém. Trong các trường hợp khác, chúng tôi cần cung cấp các ranh giới để đảm bảo rằng FCM cung cấp dịch vụ có thể mở rộng cho tất cả người gửi.

Điều tiết tin nhắn có thể thu gọn

Như đã mô tả ở trên, tin nhắn có thể thu gọn là thông báo không có nội dung được thiết kế để xếp chồng lên nhau. Trong trường hợp nhà phát triển lặp lại cùng một thông báo cho một ứng dụng quá thường xuyên, chúng tôi sẽ trì hoãn các thông báo (điều tiết) để giảm tác động đến pin của người dùng.

Ví dụ: nếu bạn gửi số lượng lớn yêu cầu đồng bộ hóa email mới tới một thiết bị, chúng tôi có thể trì hoãn yêu cầu đồng bộ hóa email tiếp theo vài phút để thiết bị có thể đồng bộ hóa ở tốc độ trung bình thấp hơn. Việc điều chỉnh này được thực hiện nghiêm ngặt để hạn chế tác động đến pin mà người dùng gặp phải.

Nếu trường hợp sử dụng của bạn yêu cầu kiểu gửi có tốc độ cao thì tin nhắn không thể thu gọn có thể là lựa chọn phù hợp. Đối với những tin nhắn như vậy, hãy đảm bảo đưa nội dung vào những tin nhắn đó để giảm hao pin.

Chúng tôi giới hạn số tin nhắn có thể thu gọn ở mức tối đa 20 tin nhắn cho mỗi ứng dụng trên mỗi thiết bị, với mức nạp lại là 1 tin nhắn sau mỗi 3 phút.

Điều chỉnh máy chủ XMPP

Chúng tôi giới hạn tốc độ bạn có thể kết nối với máy chủ FCM XMPP ở mức 400 kết nối mỗi phút cho mỗi dự án. Đây không phải là vấn đề đối với việc gửi tin nhắn nhưng nó rất quan trọng để đảm bảo sự ổn định của hệ thống. Đối với mỗi dự án, FCM cho phép 2500 kết nối song song.

Đối với nhắn tin ngược dòng bằng XMPP, FCM giới hạn tin nhắn ngược dòng ở mức 1.500.000/phút cho mỗi dự án để tránh làm quá tải các máy chủ đích ngược dòng.

Chúng tôi giới hạn tin nhắn tải lên trên mỗi thiết bị ở mức 1.000/phút để bảo vệ khỏi hao pin do hoạt động xấu của ứng dụng.

Tốc độ tin nhắn tối đa cho một thiết bị

Đối với Android, bạn có thể gửi tối đa 240 tin nhắn/phút và 5.000 tin nhắn/giờ tới một thiết bị. Ngưỡng cao này nhằm mục đích cho phép tăng lưu lượng truy cập trong thời gian ngắn, chẳng hạn như khi người dùng tương tác nhanh qua trò chuyện. Giới hạn này ngăn các lỗi gửi logic vô tình làm hao pin trên thiết bị.

Đối với iOS, chúng tôi trả về lỗi khi tốc độ vượt quá giới hạn APN.

Giới hạn tin nhắn chủ đề

Tỷ lệ thêm/xóa đăng ký chủ đề được giới hạn ở 3.000 QPS cho mỗi dự án.

Để biết tốc độ gửi tin nhắn, hãy xem Điều chỉnh Fanout .

điều tiết fanout

Phân loại tin nhắn là quá trình gửi tin nhắn đến nhiều thiết bị, chẳng hạn như khi bạn nhắm mục tiêu theo chủ đề và nhóm hoặc khi bạn sử dụng Trình soạn thảo thông báo để nhắm mục tiêu đến đối tượng hoặc phân khúc người dùng.

Việc phân phát tin nhắn không diễn ra ngay lập tức nên đôi khi bạn có nhiều lần phân xuất tin nhắn đang được tiến hành đồng thời. Chúng tôi giới hạn số lượng tin nhắn xuất hiện đồng thời cho mỗi dự án ở mức 1.000. Sau đó, chúng tôi có thể từ chối các yêu cầu phân xuất bổ sung hoặc trì hoãn việc phân xuất các yêu cầu cho đến khi một số phân xuất đang diễn ra hoàn tất.

Tỷ lệ phân xuất hiện thực tế có thể đạt được bị ảnh hưởng bởi số lượng dự án yêu cầu phân xuất cùng lúc. Tỷ lệ fanout 10.000 QPS cho một dự án riêng lẻ không phải là hiếm, nhưng con số đó không phải là sự đảm bảo và là kết quả của tổng tải trên hệ thống. Điều quan trọng cần lưu ý là công suất phân xuất hiện có được phân chia giữa các dự án chứ không phải theo yêu cầu phân xuất. Vì vậy, nếu dự án của bạn có hai lần xuất hiện đang diễn ra thì mỗi lần xuất hiện sẽ chỉ thấy một nửa tỷ lệ phân xuất hiện có. Cách được khuyến nghị để tối đa hóa tốc độ phân xuất của bạn là chỉ có một phân xuất hoạt động đang diễn ra tại một thời điểm.

Cổng FCM và tường lửa của bạn

Nếu tổ chức của bạn có tường lửa để hạn chế lưu lượng truy cập đến hoặc từ Internet, bạn cần định cấu hình tường lửa để cho phép các thiết bị di động kết nối với FCM để các thiết bị trên mạng của bạn nhận được tin nhắn. FCM thường sử dụng cổng 5228 nhưng đôi khi sử dụng 443, 5229 và 5230.

Đối với các thiết bị kết nối trên mạng của bạn, FCM không cung cấp IP cụ thể vì dải IP của chúng tôi thay đổi quá thường xuyên và các quy tắc tường lửa của bạn có thể lỗi thời, ảnh hưởng đến trải nghiệm của người dùng. Lý tưởng nhất là các cổng trong danh sách cho phép 5228-5230 & 443 không có giới hạn IP. Tuy nhiên, nếu bạn phải hạn chế IP, bạn nên đưa vào danh sách cho phép tất cả các địa chỉ IP được liệt kê trong goog.json . Danh sách lớn này được cập nhật thường xuyên và bạn nên cập nhật các quy tắc của mình hàng tháng. Các vấn đề do hạn chế IP của tường lửa gây ra thường không liên tục và khó chẩn đoán.

Chúng tôi cung cấp một bộ tên miền có thể được đưa vào danh sách cho phép thay vì địa chỉ IP. Những tên máy chủ được liệt kê dưới đây. Nếu chúng tôi bắt đầu sử dụng tên máy chủ bổ sung, chúng tôi sẽ cập nhật danh sách tại đây. Việc sử dụng tên miền cho quy tắc tường lửa của bạn có thể có hoặc không có tác dụng trong thiết bị tường lửa của bạn.

Cổng TCP để mở:

  • 5228
  • 5229
  • 5230
  • 443

Tên máy chủ để mở:

  • 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

Tường lửa dịch địa chỉ mạng và/hoặc kiểm tra gói trạng thái:

Nếu mạng của bạn triển khai Dịch địa chỉ mạng (NAT) hoặc Kiểm tra gói trạng thái (SPI), hãy triển khai thời gian chờ 30 phút hoặc lâu hơn cho các kết nối của chúng tôi qua cổng 5228-5230. Điều này cho phép chúng tôi cung cấp kết nối đáng tin cậy đồng thời giảm mức tiêu thụ pin trên thiết bị di động của người dùng.

Tương tác VPN và khả năng bỏ qua

Firebase Cloud Messaging thực hiện nhiều bước khác nhau để đảm bảo rằng kết nối nhắn tin đẩy từ điện thoại đến máy chủ là đáng tin cậy và khả dụng thường xuyên nhất có thể. Việc sử dụng VPN làm phức tạp thêm nỗ lực này.

VPN che giấu thông tin cơ bản mà FCM cần để điều chỉnh kết nối nhằm tối đa hóa độ tin cậy và thời lượng pin. Trong một số trường hợp, VPN chủ động phá vỡ các kết nối tồn tại lâu dài, dẫn đến trải nghiệm người dùng không tốt do tin nhắn bị nhỡ hoặc bị trì hoãn hoặc tốn pin cao. Khi VPN được định cấu hình để cho phép chúng tôi làm như vậy, chúng tôi bỏ qua VPN bằng kết nối được mã hóa (qua mạng cơ sở wifi hoặc LTE) để đảm bảo trải nghiệm đáng tin cậy, thân thiện với pin. Việc sử dụng VPN có thể bỏ qua của FCM là dành riêng cho kênh Thông báo đẩy FCM. Lưu lượng FCM khác, chẳng hạn như lưu lượng đăng ký, sẽ sử dụng VPN nếu nó đang hoạt động. Khi kết nối FCM bỏ qua VPN, nó sẽ mất đi các lợi ích bổ sung mà VPN có thể cung cấp, chẳng hạn như che IP.

Các VPN khác nhau sẽ có các phương pháp khác nhau để kiểm soát xem có thể vượt qua được hay không. Tham khảo tài liệu dành cho VPN cụ thể của bạn để được hướng dẫn.

Nếu VPN không được định cấu hình để có thể bỏ qua thì Firebase Cloud Messaging sẽ sử dụng mạng VPN để kết nối với máy chủ. Điều này có thể dẫn đến những khoảng thời gian mà tin nhắn bị trễ và có thể dẫn đến việc sử dụng nhiều pin hơn vì Nhắn tin qua đám mây hoạt động để duy trì kết nối qua kết nối VPN.

Thông tin xác thực

Tùy thuộc vào tính năng FCM nào bạn triển khai, bạn có thể cần thông tin xác thực sau từ dự án Firebase của mình:

Mã dự án Giá trị nhận dạng duy nhất cho dự án Firebase của bạn, được dùng trong các yêu cầu tới điểm cuối HTTP FCM v1. Giá trị này có sẵn trong ngăn Cài đặt bảng điều khiển Firebase .
Mã thông báo đăng ký

Một chuỗi mã thông báo duy nhất xác định từng phiên bản ứng dụng khách. Cần có mã thông báo đăng ký để nhắn tin cho một thiết bị và nhóm thiết bị. Lưu ý rằng mã thông báo đăng ký phải được giữ bí mật.

ID người gửi Một giá trị số duy nhất được tạo khi bạn tạo dự án Firebase, có sẵn trong tab Nhắn tin qua đám mây của ngăn Cài đặt bảng điều khiển Firebase. ID người gửi được sử dụng để xác định từng người gửi có thể gửi tin nhắn đến ứng dụng khách.
Truy cập thẻ Mã thông báo OAuth 2.0 tồn tại trong thời gian ngắn cho phép yêu cầu API HTTP v1. Mã thông báo này được liên kết với tài khoản dịch vụ thuộc dự án Firebase của bạn. Để tạo và luân chuyển mã thông báo truy cập, hãy làm theo các bước được mô tả trong Ủy quyền gửi yêu cầu .
Khóa máy chủ (dành cho các giao thức cũ **không được dùng nữa**)

Khóa máy chủ cho phép máy chủ ứng dụng của bạn truy cập vào các dịch vụ của Google, bao gồm cả việc gửi tin nhắn qua các giao thức cũ của Nhắn tin qua đám mây Firebase không còn được dùng nữa.

Quan trọng: Không bao gồm khóa máy chủ ở bất kỳ đâu trong mã máy khách của bạn. Ngoài ra, hãy đảm bảo chỉ sử dụng khóa máy chủ để ủy quyền cho máy chủ ứng dụng của bạn. Nền tảng Android, Apple và khóa trình duyệt bị FCM từ chối.