Flutter安卓端接入FCM后前台推送正常 无法接收后台通知
问题根因
你当前的代码仅监听了前台消息回调FirebaseMessaging.onMessage和点击通知唤起应用的回调FirebaseMessaging.onMessageOpenedApp,缺少后台/进程终止状态下的消息监听逻辑,同时可能存在平台侧配置缺失、推送载荷不符合规范的问题。
修复步骤
1. 新增后台消息监听回调
FirebaseMessaging.onBackgroundMessage是处理后台消息的专用回调,必须定义为全局顶层函数,不能放在类内部:
// 全局位置定义后台消息处理函数,不要写在Home类内部 @pragma('vm:entry-point') Future<void> firebaseMessagingBackgroundHandler(RemoteMessage message) async { // 处理后台消息前必须先初始化Firebase await Firebase.initializeApp(); // 自定义后台消息处理逻辑,比如存储消息、触发本地通知等 print('收到后台消息:${message.notification?.title}'); }
在应用启动入口注册该回调:
void main() async { WidgetsFlutterBinding.ensureInitialized(); // 初始化Firebase await Firebase.initializeApp(); // 注册后台消息监听 FirebaseMessaging.onBackgroundMessage(firebaseMessagingBackgroundHandler); runApp(const MyApp()); }
2. 确认推送载荷格式
后台状态下FCM要自动弹出系统通知,推送请求必须包含notification字段,仅含data字段的静默消息不会触发系统通知展示:
// 合法的推送载荷示例 { "to": "设备FCM Token", "notification": { "title": "通知标题", "body": "通知正文内容" }, "data": { "type": "自定义业务类型", "content": "自定义业务参数" } }
3. 补全平台侧配置
- Android配置:
- targetSdkVersion ≥33时,需主动申请
POST_NOTIFICATIONS权限,否则无法弹出通知 - 国内ROM需将应用加入自启动、后台活动白名单,关闭电量优化拦截
- 确认
AndroidManifest.xml中已配置FCM所需的服务和元数据
- targetSdkVersion ≥33时,需主动申请
- iOS配置:
- Xcode中开启
Push Notifications能力,以及Background Modes下的Remote notifications选项 - Firebase控制台已上传正确的APNs认证文件
- 必须使用真机测试,iOS模拟器不支持远程推送
- Xcode中开启
4. 可选优化
如果需要自定义后台通知样式、处理静默数据消息,可以搭配flutter_local_notifications插件,在后台回调中主动调用本地通知API展示通知,不受FCM默认规则限制。
内容的提问来源于stack exchange,提问作者Omar Abdelazeem
相关产品推荐
相关产品推荐

