Firebase Cloud Messaging cơ bản: nhận thông báo trong ứng dụng Flutter

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Sau khi hiểu push notification hoạt động ra sao, bước tiếp theo là làm thật. Firebase Cloud Messaging (FCM) là dịch vụ miễn phí rất phổ biến để gửi thông báo tới Android và iOS. Bài này hướng dẫn các bước chính để nhận thông báo trong ứng dụng Flutter.

Chuẩn bị Firebase

  1. Tạo dự án trên Firebase Console.
  2. Thêm ứng dụng Android (nhập Application ID) và iOS (nhập Bundle ID).
  3. Dùng công cụ dòng lệnh FlutterFire để cấu hình tự động.
dart pub global activate flutterfire_cli
flutterfire configure
flutter pub add firebase_core firebase_messaging

Lệnh configure sinh file firebase_options.dart chứa thông tin kết nối cho từng nền tảng. Với iOS, bạn còn phải tải khóa APNs lên Firebase và bật khả năng Push Notifications trong Xcode.

Khởi tạo Firebase

import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );
  runApp(const MyApp());
}

Xin quyền và lấy token

import 'package:firebase_messaging/firebase_messaging.dart';

Future<void> setupPush() async {
  final messaging = FirebaseMessaging.instance;

  final settings = await messaging.requestPermission(
    alert: true,
    badge: true,
    sound: true,
  );

  if (settings.authorizationStatus == AuthorizationStatus.authorized) {
    final token = await messaging.getToken();
    // TODO: gửi token này lên máy chủ của bạn
    print('FCM token: $token');
  }

  messaging.onTokenRefresh.listen((newToken) {
    // cập nhật token mới lên máy chủ
  });
}

Trên Android 13 trở lên, quyền thông báo cũng là quyền chạy lúc ứng dụng chạy nên cần xin người dùng; gói firebase_messaging xử lý phần lớn việc này khi bạn gọi requestPermission.

Xử lý thông báo theo trạng thái ứng dụng

Có ba trạng thái cần phân biệt:

  • Foreground: ứng dụng đang mở. Thông báo không tự hiện trên Android, bạn nhận qua onMessage và tự hiển thị nếu muốn.
  • Background: ứng dụng ở nền. Hệ điều hành hiển thị thông báo; khi người dùng bấm vào, nhận qua onMessageOpenedApp.
  • Terminated: ứng dụng bị đóng hẳn. Lấy thông báo đã mở ứng dụng qua getInitialMessage.
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
  print('Nhận khi đang mở: ${message.notification?.title}');
});

FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
  final screen = message.data['screen'];
  // điều hướng tới màn hình tương ứng
});

Future<void> checkInitialMessage() async {
  final message = await FirebaseMessaging.instance.getInitialMessage();
  if (message != null) {
    // mở đúng màn hình từ thông báo
  }
}

Xử lý tin nhắn dữ liệu nền

Để xử lý thông điệp khi ứng dụng ở nền, bạn đăng ký một hàm cấp cao nhất (top-level) có chú thích để chạy độc lập:

@pragma('vm:entry-point')
Future<void> _backgroundHandler(RemoteMessage message) async {
  await Firebase.initializeApp();
  print('Thông điệp nền: ${message.messageId}');
}

// trong main, sau khi khởi tạo Firebase:
FirebaseMessaging.onBackgroundMessage(_backgroundHandler);

Thử gửi thông báo

Cách nhanh nhất là dùng chức năng soạn thông báo thử trong Firebase Console, dán token thiết bị và gửi. Cách làm đáng tin cậy hơn cho sản phẩm là máy chủ của bạn gọi FCM HTTP v1 API bằng thông tin xác thực dịch vụ, không đặt khóa bí mật trong ứng dụng.

Gỡ lỗi khi không nhận được thông báo

  1. Kiểm tra đã cấp quyền thông báo trong cài đặt thiết bị.
  2. Thử trên thiết bị thật; trình giả lập iOS có hạn chế với thông báo đẩy từ xa.
  3. Kiểm tra khóa APNs và Bundle ID khớp với Firebase.
  4. Xem token có đúng và còn hiệu lực không.
  5. Kiểm tra cài đặt tiết kiệm pin hoặc tối ưu hóa nền của hãng điện thoại.

Kết luận

FCM trong Flutter gồm bốn việc: cấu hình dự án, xin quyền và lấy token, lắng nghe thông báo ở ba trạng thái, rồi gửi từ máy chủ. Hãy làm từng bước và kiểm thử trên thiết bị thật để có kết quả đáng tin cậy.

Chủ đề (topic) và nhóm đối tượng

Thay vì lưu token của từng người để gửi hàng loạt, FCM cho phép đăng ký thiết bị vào các chủ đề. Ứng dụng gọi đăng ký chủ đề, và máy chủ gửi một thông điệp tới chủ đề đó để tất cả thiết bị đã đăng ký nhận được.

await FirebaseMessaging.instance.subscribeToTopic('khuyen_mai');
await FirebaseMessaging.instance.unsubscribeFromTopic('khuyen_mai');

Cách này tiện cho thông báo chung như tin tức hay khuyến mại. Với thông báo riêng từng người như tin nhắn hay đơn hàng, vẫn nên gửi theo token gắn với tài khoản. Hãy cho người dùng tùy chọn bật tắt từng chủ đề trong cài đặt và đồng bộ lựa chọn đó với việc đăng ký chủ đề. Ngoài ra, nhớ rằng thông báo cần nội dung ngắn gọn và thiết lập kênh thông báo trên Android để người dùng có thể điều chỉnh từng loại.

Lưu ý khi phát hành

Trước khi phát hành, hãy kiểm tra cấu hình cho bản release chứ không chỉ debug: khóa APNs đúng môi trường, tệp cấu hình Firebase khớp mã định danh ứng dụng, và các quy tắc rút gọn mã không loại bỏ lớp mà FCM cần. Thử nhận thông báo trên bản cài từ kênh thử nghiệm của cửa hàng để chắc mọi thứ hoạt động như người dùng thật sẽ trải nghiệm.

Bạn có thể tìm thêm khóa học về Flutter và tích hợp dịch vụ đám mây tại codebem.com.

author_photo
Nguyễn Đình Cường

0 comment