Firebase Cloud Messaging

I. Tổng quan
Firebase Cloud Messaging (FCM) là một dịch vụ của Firebase được cung cấp bởi Google để hỗ trợ việc gửi thông báo và tin nhắn từ máy chủ đến các thiết bị di động, ứng dụng web và thiết bị khác.
Kiến trúc FCM:
Tóm tắt về cách FCM hoạt động
Đăng ký thiết bị:
- Khi người dùng cài đặt ứng dụng có gắn SDK Firebase trên thiết bị di động hoặc trang web, thiết bị sẽ đăng ký với FCM.
- Firebase sẽ tạo một token định danh duy nhất cho thiết bị này.
Gửi token đến máy chủ:
- Token được gửi từ thiết bị đến máy chủ của ứng dụng, nơi nó được lưu trữ cho việc sử dụng sau này.
Gửi thông báo từ máy chủ:
- Khi ứng dụng máy chủ muốn gửi thông báo đến các thiết bị đã đăng ký, nó sẽ sử dụng API của FCM để gửi thông điệp cùng với danh sách các token thiết bị mục tiêu.
FCM đưa thông báo đến thiết bị:
- FCM sẽ nhận thông điệp từ máy chủ và chuyển nó đến tất cả các thiết bị đăng ký.
Thiết bị xử lý thông báo:
- Thiết bị nhận được thông báo từ FCM hiển thị thông báo đó cho người dùng.
Các ứng dụng của FCM không chỉ giới hạn trong việc gửi thông báo, mà còn có thể được tích hợp để thực hiện các tác vụ như đồng bộ dữ liệu, xác thực người dùng, và nhiều tính năng khác để cải thiện trải nghiệm người dùng trên nền tảng đa dạng.
Chú ý trong việc quản lý FCM token, nó sẽ thay đổi trong các trường hợp sau:
- Ứng dụng được khôi phục trên thiết bị mới
- Ứng dụng được xóa/cài đặt lại
- User chủ động xóa dữ liệu app
II. Tích hợp với Flutter
Tiếp tục với project demo ở bài trước, chúng ta thêm thư viện vào project flutter
- flutter pub add firebase_messaging
Requesting permission
Mở thông báo hỏi quyền nhận notification khi khách hàng mở app lên:
FirebaseMessaging messaging = FirebaseMessaging.instance;
NotificationSettings settings = await messaging.requestPermission(
alert: true,
announcement: false,
badge: true,
carPlay: false,
criticalAlert: false,
provisional: false,
sound: true,
);
print('User granted permission: ${settings.authorizationStatus}');
Sau khi khách hàng cho phép nhận notification, ứng dụng có thể xử lý được các message gửi tới với các trường hợp như sau
1.Foreground messages
Foreground là trạng thái ứng dụng đang mở, người dùng đang xem, đang sử dụng. Để nghe tin nhắn trong khi ứng dụng của bạn ở Foreground, lắng nghe onMessage:
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
print('Got a message whilst in the foreground!');
print('Message data: ${message.data}');
if (message.notification != null) {
print('Message also contained a notification: ${message.notification}');
}
});
Truy cập vào console -> Vào Messaging -> Tạo test message như sau
Send xuống device chúng ta sẽ nhận được dữ liệu tương ứng trong onMessage
2.Background messages
Là trạng thái ứng dụng đang ở nền (Khi ứng dụng đang được sử dụng mà người dùng nhấn phím home, hoặc chuyển sang dùng ứng dụng khác). Sử dụng onBackgroundMessage để nhận được message trong trường hợp này:
FirebaseMessaging.onBackgroundMessage(FCM.firebaseMessagingBackgroundHandler);
Khi ẩn app xuống background và bắn noti từ console chúng ta nhận được notification thành công với log:
3. App Killed
Khi app kill chúng ta không thể nhìn được log như 2 trường hợp trên, thay vào đó notification sẽ hiển thị ngay tại notification center trên thiết bị như sau:
Trường hợp debug không nhận được noti khi app kill, các bạn có thể truy cập và kiểm tra thêm theo hướng dẫn:
https://stackoverflow.com/questions/57054706/flutter-fcm-is-not-working-when-app-is-closed
https://github.com/firebase/flutterfire/issues/9685
Chú ý:
Đối với iOS, truy cập vào Project Settings -> Chọn Cloud Messaging -> Upload APNs certificates thì ứng dụng mới có thể nhận được notification, ngoài ra notification chỉ nhận được trên thiết bị thật.