Để nhắm đến nhiều thiết bị bằng một thông báo, hãy sử dụng tính năng Nhắn tin theo chủ đề. Tính năng này cho phép bạn gửi một thông báo đến nhiều thiết bị đã chọn nhận thông báo về một chủ đề cụ thể.
Hướng dẫn này tập trung vào việc gửi thông báo theo chủ đề từ máy chủ ứng dụng bằng cách sử dụng Admin SDK hoặc REST API cho FCM, cũng như nhận và xử lý thông báo trong một ứng dụng Android. Chúng ta sẽ đề cập đến việc xử lý thông báo cho cả ứng dụng ở chế độ nền và ứng dụng ở chế độ nền trước. Chúng tôi sẽ hướng dẫn tất cả các bước để đạt được mục tiêu này, từ thiết lập đến xác minh.
Thiết lập SDK
Phần này có thể bao gồm các bước mà bạn đã hoàn tất nếu bạn đã thiết lập một ứng dụng khách Android cho FCM hoặc đã thực hiện các bước để Gửi thông báo đầu tiên.
Trước khi bắt đầu
Cài đặt hoặc cập nhật Android Studio lên phiên bản mới nhất.
Đảm bảo rằng dự án của bạn đáp ứng các yêu cầu này (xin lưu ý rằng một số sản phẩm có thể có yêu cầu nghiêm ngặt hơn):
- Nhắm đến API cấp 21 (Lollipop) trở lên
- Sử dụng Android 5.0 trở lên
- Sử dụng Jetpack (AndroidX), bao gồm cả việc đáp ứng các yêu cầu về phiên bản sau:
com.android.tools.build:gradle
phiên bản 7.3.0 trở lêncompileSdkVersion
28 trở lên
Thiết lập một thiết bị thực hoặc sử dụng trình mô phỏng để chạy ứng dụng của bạn.
Xin lưu ý rằng các SDK Firebase có một phần phụ thuộc vào Dịch vụ Google Play yêu cầu thiết bị hoặc trình mô phỏng phải cài đặt Dịch vụ Google Play.Đăng nhập vào Firebase bằng Tài khoản Google của bạn.
Nếu chưa có dự án Android và chỉ muốn dùng thử một sản phẩm của Firebase, bạn có thể tải một trong các mẫu khởi động nhanh của chúng tôi xuống.
Tạo một dự án Firebase
Trước khi có thể thêm Firebase vào ứng dụng Android, bạn cần tạo một dự án Firebase để kết nối với ứng dụng Android của mình. Hãy truy cập vào trang Tìm hiểu về các dự án Firebase để tìm hiểu thêm về các dự án Firebase.
Xem hướng dẫn tạo dự án Firebase
Hãy làm theo các bước sau nếu bạn mới sử dụng Firebase hoặc Google Cloud.
Bạn cũng có thể làm theo các bước này nếu muốn tạo một dự án Firebase hoàn toàn mới (và dự án Google Cloud cơ bản của dự án đó).
- Đăng nhập vào bảng điều khiển Firebase.
- Nhấp vào nút này để tạo một dự án Firebase mới.
-
Trong trường văn bản, hãy nhập tên dự án.
Nếu là thành viên của một tổ chức Google Cloud, bạn có thể chọn thư mục để tạo dự án (không bắt buộc).
- Nếu được nhắc, hãy xem xét và chấp nhận các điều khoản của Firebase, sau đó nhấp vào Tiếp tục.
- (Không bắt buộc) Bật tính năng hỗ trợ của AI trong bảng điều khiển Firebase (còn gọi là "Gemini trong Firebase"). Tính năng này có thể giúp bạn bắt đầu và đơn giản hoá quy trình phát triển.
-
(Không bắt buộc) Thiết lập Google Analytics cho dự án của bạn. Việc này giúp mang lại trải nghiệm tối ưu khi sử dụng các sản phẩm Firebase sau đây: Firebase A/B Testing, Cloud Messaging, Crashlytics, In-App Messaging và Remote Config (bao gồm cả Cá nhân hoá).
Chọn một tài khoản Google Analytics hiện có hoặc tạo một tài khoản mới. Nếu bạn tạo một tài khoản mới, hãy chọn Analyticsvị trí báo cáo, sau đó chấp nhận chế độ chia sẻ dữ liệu và Google Analyticsđiều khoảnGoogle Analytics cho dự án của bạn.
- Nhấp vào Tạo dự án.
Firebase sẽ tạo dự án, cung cấp một số tài nguyên ban đầu và bật các API quan trọng. Khi quá trình này hoàn tất, bạn sẽ được chuyển đến trang tổng quan về dự án Firebase của mình trong bảng điều khiển Firebase.
Hãy làm theo các bước sau nếu bạn muốn bắt đầu sử dụng Firebase với một dự án Google Cloud hiện có. Tìm hiểu thêm về cách "thêm Firebase" vào một dự án Google Cloud hiện có.
- Đăng nhập vào bảng điều khiển Firebase bằng tài khoản cấp cho bạn quyền truy cập vào dự án Google Cloud hiện có.
- Nhấp vào nút này để tạo một dự án Firebase mới.
- Ở cuối trang, hãy nhấp vào Thêm Firebase vào dự án trên Google Cloud.
- Trong trường văn bản, hãy bắt đầu nhập tên dự án của dự án hiện có, sau đó chọn dự án trong danh sách xuất hiện.
- Nhấp vào Mở dự án.
- Nếu được nhắc, hãy xem xét và chấp nhận các điều khoản của Firebase, sau đó nhấp vào Tiếp tục.
- (Không bắt buộc) Bật tính năng hỗ trợ của AI trong bảng điều khiển Firebase (còn gọi là "Gemini trong Firebase"). Tính năng này có thể giúp bạn bắt đầu và đơn giản hoá quy trình phát triển.
-
(Không bắt buộc) Thiết lập Google Analytics cho dự án của bạn. Việc này giúp mang lại trải nghiệm tối ưu khi sử dụng các sản phẩm Firebase sau đây: Firebase A/B Testing, Cloud Messaging, Crashlytics, In-App Messaging và Remote Config (bao gồm cả Cá nhân hoá).
Chọn một tài khoản Google Analytics hiện có hoặc tạo một tài khoản mới. Nếu bạn tạo một tài khoản mới, hãy chọn Analyticsvị trí báo cáo, sau đó chấp nhận chế độ chia sẻ dữ liệu và Google Analyticsđiều khoảnGoogle Analytics cho dự án của bạn.
- Nhấp vào Thêm Firebase.
Firebase thêm Firebase vào dự án hiện có của bạn. Khi quá trình này hoàn tất, bạn sẽ được chuyển đến trang tổng quan về dự án Firebase của mình trong bảng điều khiển Firebase.
Đăng ký ứng dụng của bạn với Firebase
Để sử dụng Firebase trong ứng dụng Android, bạn cần đăng ký ứng dụng với dự án Firebase. Việc đăng ký ứng dụng thường được gọi là "thêm" ứng dụng vào dự án.
Chuyển đến bảng điều khiển Firebase.
Ở giữa trang tổng quan của dự án, hãy nhấp vào biểu tượng Android (
) hoặc Thêm ứng dụng để chạy quy trình thiết lập.Nhập tên gói của ứng dụng vào trường Tên gói Android.
Tên gói là gì và bạn có thể tìm thấy tên gói ở đâu?
Tên gói giúp nhận dạng duy nhất ứng dụng của bạn trên thiết bị và trong Cửa hàng Google Play.
Tên gói thường được gọi là mã ứng dụng.
Tìm tên gói của ứng dụng trong tệp Gradle mô-đun (cấp ứng dụng), thường là
app/build.gradle
(tên gói ví dụ:com.yourcompany.yourproject
).Xin lưu ý rằng giá trị tên gói có phân biệt chữ hoa chữ thường và bạn không thể thay đổi giá trị này cho ứng dụng Android trên Firebase sau khi ứng dụng được đăng ký với dự án Firebase của bạn.
(Không bắt buộc) Nhập thông tin khác về ứng dụng: Biệt hiệu của ứng dụng và SHA-1 của chứng chỉ ký gỡ lỗi.
Biệt hiệu ứng dụng và SHA-1 của chứng chỉ gỡ lỗi chữ ký được dùng như thế nào trong Firebase?
Biệt hiệu của ứng dụng: Giá trị nhận dạng nội bộ, thuận tiện và chỉ bạn mới thấy được trong bảng điều khiển Firebase
SHA-1 của chứng chỉ ký gỡ lỗi: Firebase Authentication yêu cầu hàm băm SHA-1 (khi dùng Đăng nhập bằng Google hoặc đăng nhập bằng số điện thoại) và Firebase Dynamic Links.
Nhấp vào Đăng ký ứng dụng.
Thêm tệp cấu hình Firebase
Tải xuống rồi thêm tệp cấu hình Firebase (
) của ứng dụng vào cơ sở mã:google-services.json Nhấp vào Tải google-services.json xuống để lấy tệp cấu hình Firebase của ứng dụng.
Di chuyển tệp cấu hình vào thư mục gốc mô-đun (cấp ứng dụng) của ứng dụng.
Bạn cần biết những gì về tệp cấu hình này?
Tệp cấu hình Firebase chứa các giá trị nhận dạng duy nhất nhưng không bí mật của dự án và ứng dụng. Để tìm hiểu thêm về tệp cấu hình này, hãy truy cập vào phần Tìm hiểu về các dự án Firebase.
Bạn có thể tải tệp cấu hình Firebase xuống lại bất cứ lúc nào.
Đảm bảo rằng tên tệp cấu hình không có ký tự thừa, chẳng hạn như
(2)
.
Để các SDK Firebase có thể truy cập vào các giá trị trong tệp cấu hình
, bạn cần có trình bổ trợ Gradle cho các dịch vụ của Google (google-services.json google-services
).Trong tệp Gradle cấp gốc (cấp dự án) (
<project>/build.gradle.kts
hoặc<project>/build.gradle
), hãy thêm trình bổ trợ dịch vụ Google làm phần phụ thuộc:plugins { id("com.android.application") version "7.3.0" apply false // ... // Add the dependency for the Google services Gradle plugin id("com.google.gms.google-services") version "4.4.3" apply false }
plugins { id 'com.android.application' version '7.3.0' apply false // ... // Add the dependency for the Google services Gradle plugin id 'com.google.gms.google-services' version '4.4.3' apply false }
Trong tệp Gradle mô-đun (cấp ứng dụng) (thường là
<project>/<app-module>/build.gradle.kts
hoặc<project>/<app-module>/build.gradle
), hãy thêm trình bổ trợ dịch vụ của Google:plugins { id("com.android.application") // Add the Google services Gradle plugin id("com.google.gms.google-services") // ... }
plugins { id 'com.android.application' // Add the Google services Gradle plugin id 'com.google.gms.google-services' // ... }
Thêm SDK Firebase vào ứng dụng của bạn
Trong tệp Gradle (cấp ứng dụng) của mô-đun (thường là
<project>/<app-module>/build.gradle.kts
hoặc<project>/<app-module>/build.gradle
), hãy thêm phần phụ thuộc cho thư viện Firebase Cloud Messaging cho Android. Bạn nên sử dụng Firebase Android BoM để kiểm soát việc tạo phiên bản thư viện.Để có trải nghiệm tối ưu với Firebase Cloud Messaging, bạn nên bật Google Analytics trong dự án Firebase và thêm Firebase SDK cho Google Analytics vào ứng dụng của mình.
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:34.3.0")) // Add the dependencies for the Firebase Cloud Messaging and Analytics libraries // When using the BoM, you don't specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-messaging") implementation("com.google.firebase:firebase-analytics") }
Bằng cách sử dụng Firebase Android BoM, ứng dụng của bạn sẽ luôn sử dụng những phiên bản tương thích của thư viện Android trên Firebase.
(Cách khác) Thêm phần phụ thuộc của thư viện Firebase mà không dùng BoM
Nếu chọn không sử dụng Firebase BoM, bạn phải chỉ định từng phiên bản thư viện Firebase trong dòng phần phụ thuộc của thư viện đó.
Xin lưu ý rằng nếu sử dụng nhiều thư viện Firebase trong ứng dụng, bạn nên sử dụng BoM để quản lý các phiên bản thư viện, nhằm đảm bảo rằng tất cả các phiên bản đều tương thích.
dependencies { // Add the dependencies for the Firebase Cloud Messaging and Analytics libraries // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-messaging:25.0.1") implementation("com.google.firebase:firebase-analytics:23.0.0") }
Đồng bộ hoá dự án Android với các tệp Gradle.
Bạn có gặp lỗi bản dựng về tính năng hỗ trợ invoke-custom và bật tính năng khử đường dẫn không? Dưới đây là cách khắc phục.
Các bản dựng Gradle sử dụng trình bổ trợ Android cho Gradle (AGP) phiên bản 4.2 trở về trước cần bật tính năng hỗ trợ Java 8. Nếu không, các dự án Android này sẽ gặp lỗi khi tạo khi thêm một SDK Firebase.
Để khắc phục lỗi này, bạn có thể làm theo một trong hai cách sau:
- Thêm
compileOptions
được liệt kê trong thông báo lỗi vào tệpbuild.gradle.kts
hoặcbuild.gradle
cấp ứng dụng. - Tăng
minSdk
cho dự án Android của bạn lên 26 trở lên.
Tìm hiểu thêm về lỗi này trong bản dựng trong phần Câu hỏi thường gặp này.
- Thêm
Đăng ký ứng dụng khách vào một chủ đề
Ứng dụng khách có thể đăng ký theo dõi bất kỳ chủ đề nào hiện có hoặc có thể tạo một chủ đề mới. Khi một ứng dụng khách đăng ký một tên chủ đề mới (tên chưa tồn tại cho dự án Firebase của bạn), một chủ đề mới có tên đó sẽ được tạo trong FCM và mọi ứng dụng khách đều có thể đăng ký chủ đề đó sau này.
Để đăng ký một chủ đề, ứng dụng khách sẽ gọi Firebase Cloud Messaging
subscribeToTopic()
bằng tên chủ đề FCM. Phương thức này trả về một Task
. Trình nghe hoàn tất có thể dùng Task
này để xác định xem quy trình đăng ký có thành công hay không:
Firebase.messaging.subscribeToTopic("weather") .addOnCompleteListener { task -> var msg = "Subscribed" if (!task.isSuccessful) { msg = "Subscribe failed" } Log.d(TAG, msg) Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show() }
FirebaseMessaging.getInstance().subscribeToTopic("weather") .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { String msg = "Subscribed"; if (!task.isSuccessful()) { msg = "Subscribe failed"; } Log.d(TAG, msg); Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show(); } });
Để huỷ đăng ký, ứng dụng khách sẽ gọi Firebase Cloud Messaging unsubscribeFromTopic()
bằng tên chủ đề.
Nhận và xử lý thông báo theo chủ đề
FCM gửi thông báo theo chủ đề theo cách tương tự như các thông báo khác ở hạ lưu.
Để nhận thông báo, hãy sử dụng một dịch vụ mở rộng
FirebaseMessagingService
.
Dịch vụ của bạn nên ghi đè các lệnh gọi lại onMessageReceived
và onDeletedMessages
.
onMessageReceived
được cung cấp cho hầu hết các loại thông báo, ngoại trừ những loại sau:
-
Thông báo được gửi khi ứng dụng của bạn chạy ở chế độ nền. Trong trường hợp này, thông báo sẽ được gửi đến khay hệ thống của thiết bị. Theo mặc định, khi người dùng nhấn vào một thông báo, trình chạy ứng dụng sẽ mở ra.
-
Tin nhắn có cả tải trọng thông báo và dữ liệu, khi nhận được ở chế độ nền. Trong trường hợp này, thông báo sẽ được gửi đến khay hệ thống của thiết bị và tải trọng dữ liệu sẽ được gửi trong phần bổ sung của ý định trong Hoạt động trình chạy.
Tóm lại:
Trạng thái ứng dụng | Thông báo | Dữ liệu | Cả hai |
---|---|---|---|
Màu nổi | onMessageReceived |
onMessageReceived |
onMessageReceived |
Thông tin khái quát | Khay hệ thống | onMessageReceived |
Thông báo: khay hệ thống Dữ liệu: trong phần bổ sung của ý định. |
Lệnh gọi lại onMessageReceived
được cung cấp thời gian chờ cho phép bạn chỉ cần đăng một thông báo nhưng các bộ hẹn giờ không được thiết kế để cho phép ứng dụng truy cập vào mạng hoặc thực hiện công việc bổ sung. Do đó, nếu ứng dụng của bạn làm bất cứ việc gì phức tạp hơn, bạn cần làm thêm việc để đảm bảo ứng dụng có thể hoàn thành công việc của mình.
Nếu dự kiến ứng dụng của bạn có thể cần gần 10 giây để xử lý một thông báo, thì bạn nên lên lịch cho một công việc WorkManager hoặc làm theo hướng dẫn về WakeLock bên dưới. Trong một số trường hợp, khoảng thời gian xử lý một thông báo có thể ngắn hơn 10 giây, tuỳ thuộc vào độ trễ phát sinh trước khi gọi onMessageReceived
, bao gồm cả độ trễ của hệ điều hành, thời gian khởi động ứng dụng, luồng chính bị chặn bởi các thao tác khác hoặc các lệnh gọi onMessageReceived
trước đó mất quá nhiều thời gian. Sau khi hết thời gian hẹn giờ đó, ứng dụng của bạn có thể phải chịu quy trình tắt hoặc giới hạn thực thi trong nền. Xin lưu ý rằng độ trễ đối với các giao dịch mạng và quá trình khởi động ứng dụng có thể đáng kể. Vì vậy, khi nghi ngờ, hãy lên kế hoạch để quá trình xử lý thông báo của bạn chạy trong thời gian dài nếu có bất kỳ phần phụ thuộc không đồng bộ nào, chẳng hạn như yêu cầu truy cập mạng hoặc tải dữ liệu chuyên sâu.
Chỉnh sửa tệp kê khai ứng dụng
Để sử dụng FirebaseMessagingService
, bạn cần thêm nội dung sau vào tệp kê khai ứng dụng:
<service android:name=".java.MyFirebaseMessagingService" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
Ngoài ra, bạn nên đặt giá trị mặc định để tuỳ chỉnh giao diện của thông báo. Bạn có thể chỉ định một biểu tượng mặc định tuỳ chỉnh và một màu mặc định tuỳ chỉnh được áp dụng bất cứ khi nào các giá trị tương đương không được đặt trong tải trọng thông báo.
Thêm các dòng này vào bên trong thẻ application
để đặt biểu tượng mặc định tuỳ chỉnh và màu tuỳ chỉnh:
<!-- Set custom default icon. This is used when no icon is set for incoming notification messages. See README(https://goo.gl/l4GJaQ) for more. --> <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/ic_stat_ic_notification" /> <!-- Set color used with incoming notification messages. This is used when no color is set for the incoming notification message. See README(https://goo.gl/6BKBk7) for more. --> <meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/colorAccent" />
Android hiển thị biểu tượng mặc định tuỳ chỉnh cho
- Tất cả thông báo được gửi từ Trình soạn thông báo.
- Mọi thông báo không đặt biểu tượng một cách rõ ràng trong tải trọng thông báo.
Android sử dụng màu mặc định tuỳ chỉnh cho
- Tất cả thông báo được gửi từ Trình soạn thông báo.
- Mọi thông báo không đặt rõ ràng màu trong tải trọng thông báo.
Nếu bạn không đặt biểu tượng mặc định tuỳ chỉnh và không đặt biểu tượng trong tải trọng thông báo, thì Android sẽ hiển thị biểu tượng ứng dụng được hiển thị bằng màu trắng.
Ghi đè onMessageReceived
Bằng cách ghi đè phương thức FirebaseMessagingService.onMessageReceived
, bạn có thể thực hiện các thao tác dựa trên đối tượng RemoteMessage đã nhận và lấy dữ liệu thông báo:
override fun onMessageReceived(remoteMessage: RemoteMessage) { // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: ${remoteMessage.from}") // Check if message contains a data payload. if (remoteMessage.data.isNotEmpty()) { Log.d(TAG, "Message data payload: ${remoteMessage.data}") // Check if data needs to be processed by long running job if (needsToBeScheduled()) { // For long-running tasks (10 seconds or more) use WorkManager. scheduleJob() } else { // Handle message within 10 seconds handleNow() } } // Check if message contains a notification payload. remoteMessage.notification?.let { Log.d(TAG, "Message Notification Body: ${it.body}") } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. }
@Override public void onMessageReceived(RemoteMessage remoteMessage) { // TODO(developer): Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: " + remoteMessage.getFrom()); // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); if (/* Check if data needs to be processed by long running job */ true) { // For long-running tasks (10 seconds or more) use WorkManager. scheduleJob(); } else { // Handle message within 10 seconds handleNow(); } } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. }
Duy trì trạng thái bật của thiết bị trong khi xử lý thông báo FCM
Nếu cần giữ thiết bị ở trạng thái thức trong khi xử lý một thông báo FCM, thì ứng dụng của bạn sẽ cần giữ một WakeLock trong thời gian này hoặc cần tạo một tác vụ WorkManager. WakeLock hoạt động hiệu quả đối với các hoạt động xử lý ngắn có thể vượt quá thời gian chờ mặc định onMessageReceived
. Đối với các quy trình công việc mở rộng, chẳng hạn như gửi nhiều RPC nối tiếp đến máy chủ, việc sử dụng một công việc WorkManager sẽ phù hợp hơn so với WakeLock. Trong phần này, chúng ta sẽ tập trung vào cách sử dụng WakeLock. WakeLock ngăn thiết bị chuyển sang chế độ ngủ trong khi ứng dụng của bạn đang chạy. Điều này có thể dẫn đến việc tăng mức sử dụng pin. Vì vậy, bạn chỉ nên sử dụng WakeLock trong trường hợp ứng dụng của bạn không được tạm dừng trong khi xử lý thông báo, chẳng hạn như:
- Thông báo cho người dùng có giới hạn thời gian.
- Tương tác với một thứ gì đó bên ngoài thiết bị mà không nên bị gián đoạn (chẳng hạn như truyền dữ liệu qua mạng hoặc giao tiếp với một thiết bị khác, như đồng hồ đã ghép nối).
Trước tiên, bạn cần đảm bảo rằng ứng dụng của mình yêu cầu quyền WakeLock (SDK FCM bao gồm quyền này theo mặc định, vì vậy, thường thì bạn không cần thêm gì cả).
<uses-permission android:name="android.permission.WAKE_LOCK" />
Sau đó, ứng dụng của bạn sẽ cần lấy một WakeLock khi bắt đầu lệnh gọi lại FirebaseMessagingService.onMessageReceived()
và giải phóng WakeLock đó khi kết thúc lệnh gọi lại.
FirebaseMessagingService
tuỳ chỉnh của ứng dụng:
@Override public void onMessageReceived(final RemoteMessage message) { // If this is a message that is time sensitive or shouldn't be interrupted WakeLock wakeLock = getSystemService(PowerManager.class).newWakeLock(PARTIAL_WAKE_LOCK, "myApp:messageReceived"); try { wakeLock.acquire(TIMEOUT_MS); // handle message ... finally { wakeLock.release(); } }
Ghi đè onDeletedMessages
Trong một số trường hợp, FCM có thể không gửi được tin nhắn. Điều này xảy ra khi có quá nhiều thông báo (>100) đang chờ ứng dụng của bạn trên một thiết bị cụ thể tại thời điểm thiết bị đó kết nối hoặc nếu thiết bị chưa kết nối với FCM trong hơn một tháng. Trong những trường hợp này, bạn có thể nhận được một lệnh gọi lại đến FirebaseMessagingService.onDeletedMessages()
. Khi nhận được lệnh gọi lại này, phiên bản ứng dụng sẽ thực hiện quá trình đồng bộ hoá đầy đủ với máy chủ ứng dụng của bạn. Nếu bạn chưa gửi tin nhắn cho ứng dụng trên thiết bị đó trong vòng 4 tuần qua, FCM sẽ không gọi cho onDeletedMessages()
.
Xử lý thông báo trong ứng dụng ở chế độ nền
Khi ứng dụng của bạn ở chế độ nền, Android sẽ chuyển các thông báo đến khay hệ thống. Theo mặc định, khi người dùng nhấn vào thông báo, trình chạy ứng dụng sẽ mở ra.
Điều này bao gồm cả những thông báo chứa cả thông báo và tải trọng dữ liệu (cũng như tất cả thông báo được gửi từ Bảng điều khiển thông báo). Trong những trường hợp này, thông báo sẽ được gửi đến khay hệ thống của thiết bị và tải trọng dữ liệu sẽ được gửi trong các phần bổ sung của ý định trong Hoạt động trình chạy.
Để biết thông tin chi tiết về việc gửi tin nhắn đến ứng dụng của bạn, hãy xem trang tổng quan báo cáo FCM. Trang tổng quan này 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ề "lượt hiển thị" (thông báo mà người dùng nhìn thấy) cho các ứng dụng Android.
Tạo yêu cầu gửi
Sau khi tạo một chủ đề, bằng cách đăng ký các phiên bản ứng dụng khách vào chủ đề ở phía ứng dụng hoặc thông qua API máy chủ, bạn có thể gửi thông báo đến chủ đề đó. Nếu đây là lần đầu tiên bạn tạo yêu cầu gửi cho FCM, hãy xem hướng dẫn về môi trường máy chủ và FCM để biết thông tin quan trọng về bối cảnh và cách thiết lập.
Trong logic gửi trên phần phụ trợ, hãy chỉ định tên chủ đề mong muốn như minh hoạ:
// The topic name can be optionally prefixed with "/topics/".
const topic = 'highScores';
const message = {
data: {
score: '850',
time: '2:45'
},
topic: topic
};
// Send a message to devices subscribed to the provided topic.
getMessaging().send(message)
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});
// The topic name can be optionally prefixed with "/topics/".
String topic = "highScores";
// See documentation on defining a message payload.
Message message = Message.builder()
.putData("score", "850")
.putData("time", "2:45")
.setTopic(topic)
.build();
// Send a message to the devices subscribed to the provided topic.
String response = FirebaseMessaging.getInstance().send(message);
// Response is a message ID string.
System.out.println("Successfully sent message: " + response);
# The topic name can be optionally prefixed with "/topics/".
topic = 'highScores'
# See documentation on defining a message payload.
message = messaging.Message(
data={
'score': '850',
'time': '2:45',
},
topic=topic,
)
# Send a message to the devices subscribed to the provided topic.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)
// The topic name can be optionally prefixed with "/topics/".
topic := "highScores"
// See documentation on defining a message payload.
message := &messaging.Message{
Data: map[string]string{
"score": "850",
"time": "2:45",
},
Topic: topic,
}
// Send a message to the devices subscribed to the provided topic.
response, err := client.Send(ctx, message)
if err != nil {
log.Fatalln(err)
}
// Response is a message ID string.
fmt.Println("Successfully sent message:", response)
// The topic name can be optionally prefixed with "/topics/".
var topic = "highScores";
// See documentation on defining a message payload.
var message = new Message()
{
Data = new Dictionary<string, string>()
{
{ "score", "850" },
{ "time", "2:45" },
},
Topic = topic,
};
// Send a message to the devices subscribed to the provided topic.
string response = await FirebaseMessaging.DefaultInstance.SendAsync(message);
// Response is a message ID string.
Console.WriteLine("Successfully sent message: " + response);
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
"message":{
"topic" : "foo-bar",
"notification" : {
"body" : "This is a Firebase Cloud Messaging Topic Message!",
"title" : "FCM Message"
}
}
}
Lệnh cURL:
curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
"message": {
"topic" : "foo-bar",
"notification": {
"body": "This is a Firebase Cloud Messaging Topic Message!",
"title": "FCM Message"
}
}
}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Để gửi thông báo đến một tổ hợp các chủ đề, hãy chỉ định một điều kiện. Đây là một biểu thức boolean chỉ định các chủ đề mục tiêu. Ví dụ: điều kiện sau đây sẽ gửi thông báo đến những thiết bị đã đăng ký TopicA
và TopicB
hoặc TopicC
:
"'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)"
FCM trước tiên sẽ đánh giá mọi điều kiện trong dấu ngoặc đơn, sau đó đánh giá biểu thức từ trái sang phải. Trong biểu thức trên, người dùng đăng ký một chủ đề bất kỳ sẽ không nhận được thông báo. Tương tự, người dùng không đăng ký TopicA
sẽ không nhận được thông báo. Các tổ hợp này sẽ nhận được:
TopicA
vàTopicB
TopicA
vàTopicC
Bạn có thể thêm tối đa 5 chủ đề vào biểu thức có điều kiện.
Để gửi đến một điều kiện:
// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
const condition = '\'stock-GOOG\' in topics || \'industry-tech\' in topics';
// See documentation on defining a message payload.
const message = {
notification: {
title: '$FooCorp up 1.43% on the day',
body: '$FooCorp gained 11.80 points to close at 835.67, up 1.43% on the day.'
},
condition: condition
};
// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
getMessaging().send(message)
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});
// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
String condition = "'stock-GOOG' in topics || 'industry-tech' in topics";
// See documentation on defining a message payload.
Message message = Message.builder()
.setNotification(Notification.builder()
.setTitle("$GOOG up 1.43% on the day")
.setBody("$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.")
.build())
.setCondition(condition)
.build();
// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
String response = FirebaseMessaging.getInstance().send(message);
// Response is a message ID string.
System.out.println("Successfully sent message: " + response);
# Define a condition which will send to devices which are subscribed
# to either the Google stock or the tech industry topics.
condition = "'stock-GOOG' in topics || 'industry-tech' in topics"
# See documentation on defining a message payload.
message = messaging.Message(
notification=messaging.Notification(
title='$GOOG up 1.43% on the day',
body='$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.',
),
condition=condition,
)
# Send a message to devices subscribed to the combination of topics
# specified by the provided condition.
response = messaging.send(message)
# Response is a message ID string.
print('Successfully sent message:', response)
// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
condition := "'stock-GOOG' in topics || 'industry-tech' in topics"
// See documentation on defining a message payload.
message := &messaging.Message{
Data: map[string]string{
"score": "850",
"time": "2:45",
},
Condition: condition,
}
// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
response, err := client.Send(ctx, message)
if err != nil {
log.Fatalln(err)
}
// Response is a message ID string.
fmt.Println("Successfully sent message:", response)
// Define a condition which will send to devices which are subscribed
// to either the Google stock or the tech industry topics.
var condition = "'stock-GOOG' in topics || 'industry-tech' in topics";
// See documentation on defining a message payload.
var message = new Message()
{
Notification = new Notification()
{
Title = "$GOOG up 1.43% on the day",
Body = "$GOOG gained 11.80 points to close at 835.67, up 1.43% on the day.",
},
Condition = condition,
};
// Send a message to devices subscribed to the combination of topics
// specified by the provided condition.
string response = await FirebaseMessaging.DefaultInstance.SendAsync(message);
// Response is a message ID string.
Console.WriteLine("Successfully sent message: " + response);
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Content-Type: application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
"message":{
"condition": "'dogs' in topics || 'cats' in topics",
"notification" : {
"body" : "This is a Firebase Cloud Messaging Topic Message!",
"title" : "FCM Message",
}
}
}
Lệnh cURL:
curl -X POST -H "Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA" -H "Content-Type: application/json" -d '{
"notification": {
"title": "FCM Message",
"body": "This is a Firebase Cloud Messaging Topic Message!",
},
"condition": "'dogs' in topics || 'cats' in topics"
}' https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1
Các bước tiếp theo
- Bạn có thể dùng máy chủ để đăng ký các phiên bản ứng dụng khách vào các chủ đề và thực hiện các tác vụ quản lý khác. Xem phần Quản lý các gói đăng ký chủ đề trên máy chủ.