Bạn có hai lựa chọn để chỉ định mức độ ưu tiên phân phối cho thông báo gửi đến thiết bị trên Android: mức độ ưu tiên thông thường và mức độ ưu tiên cao. Quá trình gửi thông báo có mức độ ưu tiên bình thường và cao hoạt động như sau:
Mức độ ưu tiên bình thường. Đây là mức độ ưu tiên mặc định cho thông báo dữ liệu và thông báo hiển thị. Tin nhắn có mức độ ưu tiên bình thường sẽ được gửi ngay lập tức khi thiết bị không ở chế độ ngủ. Khi thiết bị ở Chế độ nghỉ, quá trình phân phối có thể bị trì hoãn để tiết kiệm pin cho đến khi thiết bị thoát khỏi chế độ nghỉ. Đối với các thông báo ít nhạy cảm về thời gian, chẳng hạn như thông báo về email mới, đồng bộ hoá giao diện người dùng hoặc đồng bộ hoá dữ liệu ứng dụng ở chế độ nền, hãy chọn mức độ ưu tiên phân phối thông thường.
Mức độ ưu tiên cao.FCM cố gắng gửi ngay các thông báo có mức độ ưu tiên cao, cho phép FCM đánh thức thiết bị đang ở chế độ ngủ khi cần thiết và chạy một số quy trình xử lý có giới hạn (bao gồm cả quyền truy cập mạng rất hạn chế). Thông báo có mức độ ưu tiên cao thường sẽ dẫn đến việc người dùng tương tác với ứng dụng hoặc thông báo của ứng dụng.
Quyết định giữa thông báo có mức độ ưu tiên cao và thông báo có mức độ ưu tiên bình thường
Mặc dù thông báo có mức độ ưu tiên thông thường phù hợp với các thông tin cập nhật chung, nhưng hãy chọn mức độ ưu tiên cao khi bạn cần đảm bảo gửi ngay lập tức cho các vấn đề hoặc hành động khẩn cấp. Vì thời gian gửi thông báo có mức độ ưu tiên thông thường có thể bị ảnh hưởng bởi chế độ Nghỉ, nên việc đặt hầu hết thông báo mà người dùng nhìn thấy thành mức độ ưu tiên cao sẽ đảm bảo thông báo được gửi ngay lập tức. Ví dụ: các thông báo như tin nhắn trò chuyện, vấn đề về tài khoản hoặc thông tin cập nhật về việc giao đồ ăn phải được đặt ở mức ưu tiên cao.
Xử lý thông báo cho thông báo có mức độ ưu tiên cao và bình thường
Đối với cả thông báo có mức độ ưu tiên cao và thông báo có mức độ ưu tiên bình thường nhận được trên thiết bị Android, bạn sẽ có vài giây để xử lý tải trọng thông báo trong trình xử lý onMessageReceived, trong đó thời gian được phân bổ cho thông báo có mức độ ưu tiên cao sẽ nhiều hơn một chút so với thông báo có mức độ ưu tiên bình thường. Thời gian này chỉ cần đủ dài để hiển thị thông báo ngay lập tức. Nếu phải thực hiện thêm bất kỳ công việc nào, chẳng hạn như tải hình ảnh từ bộ nhớ trên thiết bị hoặc gọi máy chủ để thu thập thêm nội dung, bạn sẽ cần thực hiện thêm các bước.
Phương thức onMessageReceived được gọi trên một luồng worker riêng biệt. Tốt nhất là bạn nên xử lý tải trọng thông báo và hiển thị thông báo ngay trong phương thức onMessageReceived. Bạn không nên thực hiện thêm lệnh gọi mạng không đồng bộ hoặc xử lý tải trọng trên một luồng riêng biệt trong phương thức onMessageReceived. Việc này có thể khiến ứng dụng của bạn nằm ngoài vòng đời quy trình hợp lệ trước khi tải trọng được xử lý hoàn toàn. Nếu điều này xảy ra, bạn có thể thấy một số thông báo FCM được gửi dẫn đến thông báo bị trì hoãn hoặc bị thiếu.
Nếu cần thêm thời gian để xử lý thông báo, chẳng hạn như để tìm nạp imageUrl có trong tải trọng thông báo, bạn sẽ cần sử dụng một cấu trúc như WorkManager hoặc dịch vụ nền trước để kéo dài vòng đời của ứng dụng. Bạn nên làm theo hướng dẫn sau khi ghi đè phương thức onMessageReceived để xác minh rằng thông báo của bạn đã được xử lý đầy đủ.
- Đối với thông báo có mức độ ưu tiên cao: Bắt đầu một công việc ưu tiên bằng cách sử dụng
WorkManagercủa Android để xác minh rằng thông báo có mức độ ưu tiên cao của bạn được ưu tiên thời gian xử lý để xác minh rằng quá trình kết xuất thông báo của bạn chạy đến khi hoàn tất. Tin vui là nếu lo lắng về việc dùng hết hạn mức công việc nhanh do xử lý FCM có mức độ ưu tiên cao, thì bạn không cần phải lo lắng nữa. Có một trường hợp miễn trừ ngắn cho các công việc ưu tiên được lên lịch ngay sau khi FCMonMessageReceivedcó mức độ ưu tiên cao được gửi đi. - Đối với thông báo có mức độ ưu tiên thông thường: Hãy bắt đầu một
WorkRequestthông thường bằng cách sử dụngWorkManagercủa Android. Điều này sẽ xác minh rằng công việc bổ sung cần thiết để xử lý thông báo của bạn cuối cùng cũng được xử lý mà không cần sử dụng quy trình xử lý ưu tiên và gây ra các vấn đề không cần thiết về mức sử dụng pin.
Đặt mức độ ưu tiên cho thông báo
Bạn có thể gửi thông báo cho người dùng bằng Admin SDK, FCM API REST và bảng điều khiển Firebase. Để thay đổi chế độ cài đặt mức độ ưu tiên trong Admin SDK và API REST của FCM, bạn phải cập nhật tải trọng JSON của thông báo. Bạn có thể sử dụng mã mẫu sau đây để xem cách đặt mức độ ưu tiên thành cao. Đối với thông báo được gửi từ bảng điều khiển, bạn không thể đặt các trường thông báo dành riêng cho Android.
{
"message": {
"notification": {
"body": "Purchase exceeding $500 detected",
"title": "Credit card purchase"
},
"data": {
"purchaser": "Your child",
"items": "Gravity Defier Sneakers"
},
"android": {
"priority": "high"
},
"apns": {
"headers": {
"apns-priority": "5"
}
}
}
}
Kiểm thử thông báo có mức độ ưu tiên cao ở chế độ Nghỉ
Để đảm bảo thông báo có mức độ ưu tiên cao được nhận và xử lý đúng cách khi người dùng nhận được, hãy làm theo các hướng dẫn sau để kiểm tra thông báo:
- Đặt thiết bị của bạn ở chế độ Nghỉ bằng cách làm theo hướng dẫn trong phần Kiểm thử ứng dụng bằng chế độ Nghỉ.
- Truy cập vào mã thông báo đăng ký FCM từ ứng dụng của bạn trên thiết bị thử nghiệm. Để biết thêm thông tin về cách truy cập vào mã thông báo, hãy xem bài viết Gửi thông báo thử nghiệm đến một ứng dụng chạy trong nền.
- Sau khi bạn có mã thông báo FCM, hãy gửi thông báo có mức độ ưu tiên cao đến thiết bị kiểm thử bằng mã gửi thông báo FCM hoặc lệnh cURL có các tham số cấu hình khớp với thông báo có mức độ ưu tiên cao của bạn.
Giảm mức độ ưu tiên của FCM có mức độ ưu tiên cao trên Android
Tin nhắn có mức độ ưu tiên cao trên Android dành cho nội dung nhạy cảm về thời gian, người dùng có thể nhìn thấy và sẽ dẫn đến thông báo dành cho người dùng. Nếu FCM phát hiện thấy một mẫu trong đó thông báo không dẫn đến thông báo dành cho người dùng, thì thông báo của bạn có thể bị giảm mức độ ưu tiên xuống mức bình thường hoặc được uỷ quyền cho Dịch vụ Google Play xử lý.
FCM sử dụng hành vi của thông báo trong 7 ngày khi xác định xem có nên giảm mức độ ưu tiên hoặc uỷ quyền thông báo hay không; đưa ra quyết định này một cách độc lập cho mọi phiên bản của ứng dụng. Nếu thông báo được hiển thị theo cách mà người dùng có thể nhìn thấy để phản hồi các thông báo có mức độ ưu tiên cao, thì các thông báo có mức độ ưu tiên cao trong tương lai của bạn sẽ không bị ảnh hưởng.
Uỷ quyền thông báo bằng Dịch vụ Google Play
Thông báo có mức độ ưu tiên cao đáp ứng một số tiêu chí nhất định sẽ được Dịch vụ Google Play uỷ quyền thay vì bị giảm mức độ ưu tiên. Điều này có nghĩa là thông báo sẽ do Dịch vụ Google Play hiển thị thay mặt cho ứng dụng mà không cần khởi động ứng dụng. Việc này nhằm mang lại trải nghiệm tổng thể tốt hơn cho người dùng trên thiết bị Android.
Xin lưu ý rằng thông báo uỷ quyền sẽ thay đổi cách báo cáo số liệu phân tích liên quan đến thông báo nhận được:
- Để báo cáo số liệu phân tích cho thông báo được uỷ quyền, ứng dụng của bạn phải sử dụng SDK FCM phiên bản 24.0.0 trở lên.
- Bạn có thể nhận thấy sự chậm trễ hoặc sụt giảm về số lượng thông báo nhận được so với số lượng trước khi áp dụng thông báo qua proxy. Điều này là do số liệu phân tích cho thông báo được uỷ quyền chỉ được báo cáo sau khi ứng dụng của bạn khởi động và có thể không được báo cáo nếu thông báo không dẫn đến việc mở ứng dụng.
Việc uỷ quyền thông báo theo cách này là hành vi mặc định cho các ứng dụng sử dụng Android Q trở lên và Dịch vụ Google Play phiên bản 19054000 trở lên. Tin nhắn được gửi thông qua HTTP v1 API sẽ được chuyển tiếp, nhưng tin nhắn được gửi thông qua bảng điều khiển của Firebase hoặc API cũ sẽ không được chuyển tiếp. Xin lưu ý rằng tính năng này hiện đang trong giai đoạn thử nghiệm và có thể thay đổi.
Mặc dù bạn nên bật tính năng uỷ quyền để tiết kiệm pin và bộ nhớ của thiết bị, nhưng bạn có thể chọn không sử dụng hành vi này theo bất kỳ cách nào sau đây:
- Ở cấp ứng dụng: trong tệp kê khai ứng dụng, hãy thêm lệnh
<meta-data android:name= "delivery_metrics_exported_to_big_query_enabled" android:value="false"/>. - Trên cơ sở phiên bản ứng dụng: Đối với phiên bản ứng dụng, hãy đặt
fun setNotificationDelegationEnabled(disable: Boolean): Task<Void!>trong quy trình giao diện người dùng cho ứng dụng của bạn, tuỳ thuộc vào trường hợp sử dụng cụ thể. - Trên cơ sở từng thông báo: Đặt khoá
proxythànhDENYtrong đối tượngAndroidNotificationcho yêu cầu gửi.
Đo lường mức độ giảm mức độ ưu tiên của thông báo trên Android
Tin nhắn riêng lẻ. Khi gửi, bạn có thể xác định xem một thông báo riêng lẻ có bị giảm mức độ ưu tiên hay không bằng cách so sánh mức độ ưu tiên phân phối (từ getPriority()) với mức độ ưu tiên ban đầu (từ getOriginalPriority()).
Tất cả tin nhắn. FCM Aggregate Delivery Data API có thể báo cáo tỷ lệ phần trăm của tất cả thông báo đến Android đang bị giảm mức độ ưu tiên. Một số thông báo có thể bị bỏ qua trong báo cáo dữ liệu tổng hợp, nhưng nhìn chung, các báo cáo này sẽ cung cấp thông tin tổng quan về tỷ lệ giảm mức độ ưu tiên của thông báo. Hãy xem bài viết của chúng tôi về dữ liệu phân phối tổng hợp để biết thêm thông tin và mã mẫu để truy vấn API; bạn cũng có thể khám phá dữ liệu này trong APIs Explorer.
Thông báo qua proxy. Thông báo được uỷ quyền sẽ không được tính vào các chỉ số phân phối hiện tại của FCM hoặc GA, vì vậy, bạn có thể thấy các chỉ số phân phối thông báo giảm đến 15%. Để báo cáo về tin nhắn được uỷ quyền, hãy sử dụng FCM Aggregate Delivery Data API.
ProxyNotificationInsightPercentsbáo cáo tỷ lệ phần trăm thông báo được uỷ quyền thành công cũng như thông tin chi tiết về các thông báo không thể uỷ quyền thành công.
Khắc phục sự cố thông báo bị trễ
Đảm bảo rằng phiên bản ứng dụng của bạn đã bật thông báo. Nếu người dùng đã tắt quyền gửi thông báo cho ứng dụng của bạn, thì không có thông báo nào được đăng, do đó, tin nhắn của bạn sẽ bị giảm mức độ ưu tiên. Bạn nên xác minh rằng thông báo đã được bật trước khi gửi thông báo có mức độ ưu tiên cao đến một phiên bản ứng dụng.
Tránh thực hiện thêm lệnh gọi mạng khi xử lý thông báo. Vì một phần nhỏ người dùng thiết bị di động Android sử dụng mạng có độ trễ cao, nên hãy tránh mở kết nối với máy chủ trước khi hiển thị thông báo. Việc gọi lại máy chủ trước khi kết thúc thời gian xử lý được phép có thể gây rủi ro cho người dùng trên mạng có độ trễ cao.
Thay vào đó, hãy đưa nội dung thông báo vào thông báo FCM và hiển thị ngay lập tức. Nếu cần đồng bộ hoá nội dung khác trong ứng dụng trên Android, bạn có thể lên lịch cho một tác vụ bằng WorkManager để xử lý tác vụ đó ở chế độ nền.