Nguyễn Đình Cường
0 comment
09 Nov, 2026
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.
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.
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());
}
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.
Có ba trạng thái cần phân biệt:
onMessage và tự hiển thị nếu muốn.onMessageOpenedApp.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ý 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);
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.
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.
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.
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.
Nguyễn Đình Cường
0 comment