| Chọn nền tảng: | iOS+ Android Web Flutter Unity C++ |
Hướng dẫn này mô tả cách bắt đầu sử dụng Firebase Cloud Messaging trong các ứng dụng khách Flutter để bạn có thể gửi tin nhắn một cách đáng tin cậy.
Tuỳ thuộc vào nền tảng mà bạn đang nhắm đến, bạn sẽ cần thực hiện một số bước thiết lập bắt buộc khác.
iOS+
Thay đổi phương thức
Để sử dụng trình bổ trợ FCM Flutter trên các thiết bị Apple, bạn cần phải sử dụng phương thức hoán đổi. Nếu không có, các tính năng chính của Firebase như xử lý đăng ký FCM sẽ không hoạt động đúng cách.
Android
Dịch vụ Google Play
Ứng dụng FCM yêu cầu thiết bị chạy Android 7.0 trở lên và cũng đã cài đặt Dịch vụ Google Play hoặc trình mô phỏng chạy Android 7.0 có API của Google. Xin lưu ý rằng bạn không bị giới hạn trong việc triển khai ứng dụng Android thông qua Cửa hàng Google Play.
Các ứng dụng dựa vào SDK Dịch vụ Play phải luôn kiểm tra thiết bị để tìm tệp APK Dịch vụ Google Play tương thích trước khi truy cập vào các tính năng của Dịch vụ Google Play. Bạn nên thực hiện việc này ở hai nơi: trong phương thức onCreate() của hoạt động chính và trong phương thức onResume() của hoạt động chính. Thao tác kiểm tra onCreate() đảm bảo rằng không thể sử dụng ứng dụng nếu không kiểm tra thành công. Thao tác kiểm tra trong onResume() đảm bảo rằng nếu người dùng quay lại ứng dụng đang chạy thông qua một số phương tiện khác, chẳng hạn như thông qua nút quay lại, thì thao tác kiểm tra vẫn được thực hiện.
Nếu thiết bị không có phiên bản Dịch vụ Google Play tương thích, ứng dụng của bạn có thể gọi GoogleApiAvailability.makeGooglePlayServicesAvailable() để cho phép người dùng tải Dịch vụ Google Play xuống từ Cửa hàng Play.
Web
Định cấu hình Thông tin đăng nhập trên web bằng FCM
Giao diện FCM Web sử dụng thông tin đăng nhập Web (còn gọi là khoá Nhận dạng máy chủ ứng dụng tự nguyện hoặc "VAPID") để cho phép gửi yêu cầu đến các dịch vụ thông báo đẩy trên web được hỗ trợ. Để đăng ký nhận thông báo đẩy cho ứng dụng, bạn cần liên kết một cặp khoá với dự án Firebase. Bạn có thể tạo một cặp khoá mới hoặc nhập cặp khoá hiện có thông qua bảng điều khiển Firebase.
Cài đặt trình bổ trợ FCM
Cài đặt và khởi động trình bổ trợ Firebase cho Flutter nếu bạn chưa làm việc này.
Từ thư mục gốc của dự án Flutter, hãy chạy lệnh sau để cài đặt trình bổ trợ:
flutter pub add firebase_messagingSau khi hoàn tất, hãy tạo lại ứng dụng Flutter:
flutter run
Yêu cầu cấp quyền gửi thông báo
Để gửi thông báo đến một thiết bị, bạn cần đăng ký thiết bị đó với FCM bằng register(). Nếu chưa được cấp quyền gửi thông báo, phương thức này sẽ yêu cầu người dùng cấp quyền gửi thông báo.
Nếu không, hàm này sẽ phân phối FID thông qua onRegistered khi thành công hoặc từ chối
tương lai do lỗi.
// You may set the permission requests to "provisional" which allows the user to choose what type
// of notifications they would like to receive once the user receives a notification.
final notificationSettings = await FirebaseMessaging.instance.requestPermission(provisional: true);
// For apple platforms, make sure the APNS token is available before making any FCM plugin API calls
final apnsToken = await FirebaseMessaging.instance.getAPNSToken();
if (apnsToken != null) {
// APNS token is available, make FCM plugin API requests...
}
Truy cập vào Mã lượt cài đặt Firebase
Bật tính năng đăng ký bằng Mã cài đặt Firebase
Để cho phép đăng ký thực thể ứng dụng của bạn với FCM bằng Mã cài đặt Firebase (FID), trước tiên, bạn phải bật FID trong cấu hình của ứng dụng cho nền tảng Android và Apple (không cần cấu hình chọn sử dụng tĩnh trên Web):
Android
Thêm phần tử <meta-data> sau vào bên trong phần tử <application> của AndroidManifest.xml:
<meta-data android:name="firebase_messaging_installation_id_enabled"
android:value="true" />iOS+
Thêm khoá FirebaseMessagingInstallationIdEnabled vào Info.plist và đặt thành true (YES):
<key>FirebaseMessagingInstallationIdEnabled</key> <true/>
Đăng ký kênh onRegistered
Để gửi thông báo đến phiên bản ứng dụng của bạn trên một thiết bị cụ thể, bạn cần có Mã cài đặt Firebase (FID) của phiên bản ứng dụng đó sau khi phiên bản này được đăng ký với FCM. FID được phân phối không đồng bộ thông qua luồng onRegistered.
Trên các nền tảng Android và Apple, FCM sẽ tự động đăng ký phiên bản ứng dụng khi khởi động nếu bạn bật tính năng tự động khởi tạo (mặc định). Tuy nhiên, bạn cần phải gọi rõ ràng đến register():
- Trên Web. Bạn có thể chuyển
vapidKeyvàserviceWorkerScriptPath(không bắt buộc). - Trên nền tảng Android và Apple nếu tính năng tự động khởi chạy bị tắt hoặc sau khi gọi
unregister(). Bạn cũng có thể gọiregister()bất cứ lúc nào để kích hoạtonRegisteredbằng FID đã đăng ký.
Luôn đăng ký onRegistered trước khi gọi register() để trình nghe của bạn hoạt động khi sự kiện đăng ký được phát ra:
final messaging = FirebaseMessaging.instance;
messaging.onRegistered
.listen((String installationId) {
// TODO: Send the Firebase Installation ID (FID) to your application server.
})
.onError((err) {
// Error getting Firebase Installation ID.
});
// Required on Web, and on Android/Apple if auto-initialization is disabled.
await messaging.register(
// Optional on Web (ignored on Android and Apple platforms)
vapidKey: "BKagOny0KF_2pCJQ3m....moL0ewzQ8rZu",
);
Luồng onRegistered phát ra FID trong các trường hợp sau:
- Tự động khi khởi động ứng dụng lần đầu và đồng bộ hoá định kỳ trên nền tảng Android và Apple khi bật tính năng tự động khởi chạy.
- Mỗi khi lệnh gọi
register()thủ công kết thúc (ngay cả khi phiên bản ứng dụng đã được đăng ký,onRegisteredvẫn phát ra FID đã đăng ký). - Bất cứ khi nào phát hiện thấy Mã lượt cài đặt Firebase thay đổi và ứng dụng được đăng ký lại bằng FCM, hoặc trên Web khi sự kiện
pushsubscriptionchangeđược kích hoạt.
Sau khi bạn nhận được Mã nhận dạng lượt cài đặt Firebase (FID), hãy gửi mã này đến máy chủ ứng dụng và lưu trữ bằng phương thức bạn muốn.
Truy cập vào mã thông báo đăng ký (không dùng nữa)
Để gửi thông báo đến một thiết bị cụ thể, bạn cần phải biết mã thông báo đăng ký của thiết bị đó. Để truy xuất mã thông báo đăng ký cho một phiên bản ứng dụng, hãy gọi getToken(). Nếu chưa được cấp quyền gửi thông báo, phương thức này sẽ yêu cầu người dùng cấp quyền gửi thông báo. Nếu không, hàm này sẽ trả về một mã thông báo hoặc từ chối tương lai do có lỗi.
Trên các nền tảng web, hãy truyền khoá công khai VAPID của bạn đến getToken():
final fcmToken = await FirebaseMessaging.instance.getToken(vapidKey: "BKagOny0KF_2pCJQ3m....moL0ewzQ8rZu");
Để nhận thông báo mỗi khi mã thông báo được cập nhật, hãy đăng ký luồng onTokenRefresh:
FirebaseMessaging.instance.onTokenRefresh
.listen((fcmToken) {
// TODO: If necessary send token to application server.
// Note: This callback is fired at each app startup and whenever a new
// token is generated.
})
.onError((err) {
// Error getting token.
});
Ngăn quá trình khởi chạy tự động
Khi quá trình đăng ký FCM được tạo, thư viện sẽ tải mã nhận dạng và dữ liệu cấu hình lên Firebase. Nếu bạn không muốn tự động đăng ký, hãy tắt tính năng tự động khởi chạy tại thời điểm tạo bản dựng.
Khi tắt tính năng tự động khởi chạy, bạn có thể đăng ký rõ ràng phiên bản ứng dụng trong thời gian chạy bằng cách gọi register() (nhớ đăng ký onRegistered trước để nhận Mã cài đặt Firebase):
await FirebaseMessaging.instance.register();
iOS
Trên iOS, hãy thêm một giá trị siêu dữ liệu vào Info.plist:
FirebaseMessagingAutoInitEnabled = NO
Android
Trên Android, hãy tắt tính năng thu thập dữ liệu Analytics và tính năng tự động khởi chạy FCM (bạn phải tắt cả hai) bằng cách thêm các giá trị siêu dữ liệu này vào AndroidManifest.xml:
<meta-data
android:name="firebase_messaging_auto_init_enabled"
android:value="false" />
<meta-data
android:name="firebase_analytics_collection_enabled"
android:value="false" />
Bật lại tính năng tự động khởi chạy FCM trong thời gian chạy
Để bật tính năng tự động khởi tạo cho một phiên bản ứng dụng cụ thể, hãy gọi setAutoInitEnabled():
await FirebaseMessaging.instance.setAutoInitEnabled(true);
Giá trị này vẫn giữ nguyên khi ứng dụng khởi động lại sau khi được đặt.
Gửi thông báo thử nghiệm
Cài đặt và chạy ứng dụng trên thiết bị mục tiêu. Trên thiết bị Apple, bạn cần chấp nhận yêu cầu cấp quyền nhận thông báo từ xa.
Đảm bảo ứng dụng đang chạy ở chế độ nền trên thiết bị.
Trong bảng điều khiển Firebase, hãy chuyển đến DevOps và mức độ gắn bó > Nhắn tin.
Tạo một chiến dịch.
Nếu đây là thông báo đầu tiên của bạn:
Chọn Tạo chiến dịch đầu tiên của bạn.
Chọn Thông báo của Firebase rồi chọn Tạo.
Nếu trước đây bạn đã tạo chiến dịch, hãy làm như sau:
Trên thẻ Chiến dịch, hãy chọn Chiến dịch mới.
Nhấp vào Thông báo.
Nhập nội dung tin nhắn.
Chọn Gửi tin nhắn thử nghiệm trong ngăn bên phải.
Trong trường có nhãn Thêm mã nhận dạng lượt cài đặt Firebase hoặc mã thông báo đăng ký FCM, hãy nhập mã nhận dạng lượt cài đặt Firebase hoặc mã thông báo đăng ký đã đăng ký.
Chọn Kiểm tra.
Sau khi bạn chọn Kiểm thử, thiết bị khách được nhắm mục tiêu (có ứng dụng chạy ở chế độ nền) sẽ nhận được thông báo.
Để biết thông tin chi tiết về việc gửi thông báo đến ứng dụng, hãy chuyển đến trang tổng quan DevOps & Engagement (DevOps và mức độ tương tác) > Messaging (Nhắn tin) > Reports (Báo cáo) trong bảng điều khiển Firebase. Trang tổng quan này ghi lại số lượng thông báo đã 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.
Xử lý lượt tương tác
Khi người dùng nhấn vào một thông báo, hành vi mặc định trên cả Android và iOS là mở ứng dụng. Nếu ứng dụng bị chấm dứt, ứng dụng sẽ được khởi động và nếu ứng dụng đang chạy ở chế độ nền, ứng dụng sẽ được đưa lên nền trước.
Tuỳ thuộc vào nội dung của thông báo, bạn có thể muốn xử lý hoạt động tương tác của người dùng khi ứng dụng mở ra. Ví dụ: nếu một tin nhắn trò chuyện mới được gửi bằng thông báo và người dùng chọn tin nhắn đó, thì bạn có thể muốn mở cuộc trò chuyện cụ thể khi ứng dụng mở.
Gói firebase-messaging cung cấp hai cách để xử lý hoạt động tương tác này:
getInitialMessage():Nếu ứng dụng được mở ở trạng thái đã kết thúc, phương thức này sẽ trả về mộtFuturechứaRemoteMessage. Sau khi bạn sử dụng,RemoteMessagesẽ bị xoá.onMessageOpenedApp: MộtStreamđăng mộtRemoteMessagekhi ứng dụng được mở từ trạng thái nền.
Để đảm bảo người dùng có trải nghiệm suôn sẻ, bạn nên xử lý cả hai trường hợp. Ví dụ về mã sau đây trình bày cách đạt được điều này:
class Application extends StatefulWidget { @override StatecreateState() => _Application(); } class _Application extends State { // In this example, suppose that all messages contain a data field with the key 'type'. Future setupInteractedMessage() async { // Get any messages which caused the application to open from // a terminated state. RemoteMessage? initialMessage = await FirebaseMessaging.instance.getInitialMessage(); // If the message also contains a data property with a "type" of "chat", // navigate to a chat screen if (initialMessage != null) { _handleMessage(initialMessage); } // Also handle any interaction when the app is in the background using a // Stream listener FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage); } void _handleMessage(RemoteMessage message) { if (message.data['type'] == 'chat') { Navigator.pushNamed(context, '/chat', arguments: ChatArguments(message), ); } } @override void initState() { super.initState(); // Run code required to handle interacted messages in an async function // as initState() must not be async setupInteractedMessage(); } @override Widget build(BuildContext context) { return Text("..."); } }
Cách bạn xử lý hoạt động tương tác tuỳ thuộc vào chế độ thiết lập của bạn. Ví dụ minh hoạ trước đó là một ví dụ cơ bản về cách sử dụng StatefulWidget.
Các bước tiếp theo
Sau khi hoàn tất các bước thiết lập, bạn có thể chọn một trong những cách sau để tiếp tục sử dụng FCM cho Flutter: