| 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 Flutter để bạn có thể gửi thông báo một cách đáng tin cậy.
Tuỳ thuộc vào nền tảng mà bạn nhắm đến, bạn cần thực hiện thêm một số bước thiết lập bắt buộ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 phải thay đổi phương thức. Nếu không, các tính năng chính của Firebase như xử lý mã thông báo FCM sẽ không hoạt động đúng cách.
Android
Dịch vụ Google Play
FCM ứng dụng yêu cầu các thiết bị chạy Android 4.4 trở lên và đã cài đặt Dịch vụ Google Play hoặc một trình mô phỏng chạy Android 4.4 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 các ứ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 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 đó. Việc kiểm tra trong onCreate() đảm bảo rằng ứng dụng không thể được sử dụng nếu không kiểm tra thành công. Việ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ì việ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, thì ứ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
Thiết lập thông tin xác thực web bằng FCM
Giao diện web FCM sử dụng thông tin xác thực web có tên là Voluntary Application Server Identification (Nhận dạng máy chủ ứng dụng tự nguyện) hoặc khoá "VAPID" để uỷ quyền cho các yêu cầu gửi đến các dịch vụ thông báo đẩy trên web được hỗ trợ. Để đăng ký ứng dụng nhận thông báo đẩy, 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 console.
Cài đặt trình bổ trợ FCM
Cài đặt và khởi chạy các trình bổ trợ Firebase cho Flutter nếu bạn chưa làm.
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 xây dựng lại ứng dụng Flutter:
flutter run
Truy cập vào mã thông báo đăng ký
Để 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 thực thể ứ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, phương thức này sẽ trả về một mã thông báo 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...
}
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 bất cứ khi nào 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 khởi chạy tự động
Khi mã thông báo đăng ký FCM được tạo, thư viện sẽ tải dữ liệu nhận dạng và cấu hình lên Firebase. Nếu bạn muốn ngăn việc tự động tạo mã thông báo, hãy tắt tính năng tự động khởi chạy tại thời gian xây dựng.
iOS
Trên iOS, hãy thêm 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 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 chạy cho một thực thể ứng dụng cụ thể, hãy gọi setAutoInitEnabled():
await FirebaseMessaging.instance.setAutoInitEnabled(true);
Giá trị này vẫn tồn tại trên các lần khởi động lại ứng dụng 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 các 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ế độ nền trên thiết bị.
- Trong bảng điều khiển của Firebase, hãy mở trang Nhắn tin.
- Nếu đây là thông báo đầu tiên của bạn, hãy chọn Create your first campaign (Tạo chiến dịch đầu tiên).
- Chọn Firebase Notification messages (Thông báo Firebase) rồi chọn Create (Tạo).
- Nếu không, trên thẻ Campaigns (Chiến dịch), hãy chọn New campaign (Chiến dịch mới) rồi chọn Notifications (Thông báo).
- Nhập nội dung tin nhắn.
- Chọn Send test message (Gửi thông báo thử nghiệm) trong ngăn bên phải.
- Trong trường có nhãn Add an FCM registration token (Thêm mã thông báo đăng ký), hãy nhập mã thông báo đăng ký của bạn.
- Chọn Test (Kiểm tra).
Sau khi bạn chọn Test (Kiểm tra), thiết bị ứng dụng khách mục tiêu (với ứng dụng ở chế độ nền) sẽ nhận được thông báo.
Để nắm được thông tin chi tiết về việc gửi thông báo đến ứng dụng của bạn, hãy xem trang tổng quan báo cáo FCM. Trang này ghi lại số lượng thông báo đã gửi và mở trên các thiết bị Apple và Android, cùng với dữ liệu hiển thị cho các ứng dụng Android.FCM
Xử lý hoạt động 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. Nếu ứng dụng đang ở chế độ nền, ứng dụng sẽ được đưa lên chế độ 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ở. Ví dụ: nếu một thông báo được gửi bằng thông báo và người dùng chọn thông báo đó, 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 2 cách để xử lý hoạt động tương tác này:
getInitialMessage():Nếu ứng dụng được mở từ trạng thái đã chấm dứt, phương thức này sẽ trả về mộtFuturechứaRemoteMessage. Sau khi được sử dụng,RemoteMessagesẽ bị xoá.onMessageOpenedApp: MộtStreamđăngRemoteMessagekhi ứng dụng được mở từ trạng thái nền.
Để đảm bảo người dùng có trải nghiệm mượt mà, 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 phụ thuộc vào thiết lập của bạn. Ví dụ đã hiển thị 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ể tham khảo một số lựa chọn sau đây để tiếp tục sử dụng FCM cho Flutter: