firebase_messaging 6.0.16版本onResume/onLaunch失效及iOS收不到推送问题
解决firebase_messaging 6.0.16的回调失效与iOS推送问题
我之前帮不少开发者踩过这个版本的坑,给你整理几个针对性的排查和修复步骤:
一、onResume与onLaunch回调不工作的解决方法
- 确保初始化时机正确:一定要在
runApp()之前完成Firebase的初始化和回调配置。比如在main函数里先调用await Firebase.initializeApp(),紧接着就注册回调,别把配置放在页面初始化或者异步逻辑之后,否则App启动/后台唤醒时可能还没注册上回调。 - 检查回调注册代码:这个版本的回调是通过
FirebaseMessaging.configure()来设置的,代码结构应该是这样的:
FirebaseMessaging.configure( onLaunch: (Map<String, dynamic> message) async { // 处理App完全关闭时点击通知的逻辑 print("onLaunch: $message"); }, onResume: (Map<String, dynamic> message) async { // 处理App在后台时点击通知的逻辑 print("onResume: $message"); }, onMessage: (Map<String, dynamic> message) async { // 处理前台收到通知的逻辑 print("onMessage: $message"); }, );
注意别写错方法名,也别漏传这两个回调参数。
- 验证通知Payload格式:Firebase的推送payload必须包含
"click_action": "FLUTTER_NOTIFICATION_CLICK"才能触发onResume/onLaunch。如果是通过Firebase控制台发送测试通知,要在自定义数据里添加这个键值对;如果是后端接口发送,要确保payload的结构符合要求,示例如下:
{ "notification": { "title": "测试通知", "body": "这是一条测试消息", "click_action": "FLUTTER_NOTIFICATION_CLICK" }, "data": { "key1": "value1", "key2": "value2" }, "to": "设备的FCM令牌" }
- 对应场景测试:onLaunch是App被完全杀死(划掉后台)后点击通知触发,onResume是App在后台(没被杀死)时点击通知触发,别搞混测试场景。
二、iOS平台无法接收推送的解决方法
- 配置APNs证书:去Apple开发者后台生成正确的APNs证书(开发环境选Development,生产环境选Production),然后下载p12文件,上传到Firebase控制台的「项目设置」→「云消息传递」→「iOS应用」里,确保证书和当前测试环境匹配。
- 添加iOS权限配置:
- 在
Info.plist里添加后台模式权限:
<key>UIBackgroundModes</key> <array> <string>remote-notification</string> </array>- 添加推送权限描述:
<key>NSRemoteNotificationUsageDescription</key> <string>需要推送通知来提醒您最新消息</string>- 在代码里主动请求推送权限:
await FirebaseMessaging.requestNotificationPermissions( const IosNotificationSettings( sound: true, badge: true, alert: true, ), ); - 在
- 确认GoogleService-Info.plist配置:确保这个文件已经正确添加到iOS项目的target中(不是只放在项目根目录),可以在Xcode里检查:选中文件,右侧「Target Membership」勾选对应App target。
- 使用真机测试:iOS模拟器不支持APNs推送,必须用真实设备测试。如果是生产环境测试,要使用Ad Hoc或App Store打包方式,开发环境用开发证书签名。
- 处理前台通知:iOS默认不会在App前台显示推送通知,如果你需要前台也显示,可以用
flutter_local_notifications插件在onMessage回调里手动弹出本地通知。
额外提醒
firebase_messaging 6.0.16是比较旧的版本了,很多后续版本修复了不少回调和iOS推送的bug,如果可能的话,建议升级到稳定的新版本(比如v10+),能避免很多旧版本的坑。
内容的提问来源于stack exchange,提问作者Apurv Thakkar
相关产品推荐
相关产品推荐

