Flutter iOS应用无法接收Firebase推送通知求助
看起来你已经做了不少基础配置了,Android能正常收推送、iOS也能拿到FCM Token,但就是收不到推送,这种情况确实挺磨人的,我帮你梳理几个容易漏掉的关键点,你可以逐一排查下:
确认APNs证书配置是否正确
Firebase推送iOS端是完全依赖APNs的,这步绝对不能错。你得去Apple开发者后台操作:- 找到你的App ID,开启Push Notifications服务
- 生成对应的APNs证书(开发和生产环境要分开,或者用支持双环境的通配证书)
- 把生成好的证书上传到Firebase控制台的项目设置里,具体在Cloud Messaging标签页的iOS应用配置部分
提醒下:就算用了flutterfire configure自动配置,也要确认Firebase后台已经关联了正确的APNs证书,不然推送链路会断。
检查Xcode的Capabilities配置
除了你已经开的Background Fetch和Remote notifications,还有几个点要确认:- 一定要在Xcode的Signing & Capabilities里直接添加Push Notifications这个Capability,别手动改plist文件,容易出问题
- 后台模式里,除了Remote notifications,Background fetch必须是勾选状态(你说已经开了,但再仔细检查下有没有真的生效)
- 你的Bundle ID要和Firebase后台、Apple开发者后台的完全一致,连大小写都不能有差别
验证推送环境是否和包的环境匹配
这是超级容易踩的坑:- 如果你用的是debug包测试,Firebase推送必须选开发环境(Sandbox);如果是release包,就得选生产环境(Production)
- 用
flutter run --release装的是生产环境包,这时候在Firebase控制台发推送,一定要把目标环境选对,不然推送根本到不了设备
确认GoogleService-Info.plist的配置细节
你已经加了这个文件,但几个细节要盯紧:- 拖文件到Xcode的Runner项目时,一定要勾选Copy items if needed,同时在Target Membership里勾选Runner,确保文件被正确关联
- 打开plist文件,检查
GOOGLE_APP_ID、BUNDLE_ID这些核心字段和项目完全匹配,特别是APNS_ENVIRONMENT:debug包对应development,release包对应production
添加消息监听代码,排查推送是否到达设备
有时候能拿到Token但收不到推送,可能是没监听消息回调。你可以在Firebase初始化后加这段代码,看看能不能捕获到推送:// 监听前台收到的推送 FirebaseMessaging.onMessage.listen((RemoteMessage message) { print('前台收到推送: ${message.notification?.title}'); print('推送数据: ${message.data}'); }); // 监听应用在后台/被杀死时收到的推送点击 FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { print('点击了后台推送: ${message.notification?.title}'); });用debug模式运行后,发推送看看控制台有没有打印日志,哪怕是前台收到的也行,能帮你判断是推送没到设备,还是应用没处理。
用FCM API直接测试推送
别只依赖Firebase控制台,用curl命令直接调用FCM API测试,能更精准指定环境。比如测试生产环境推送(替换成你的Token和服务器密钥):curl -X POST "https://fcm.googleapis.com/fcm/send" \ -H "Authorization: key=你的Firebase服务器密钥" \ -H "Content-Type: application/json" \ -d '{ "to": "你的iOS设备FCM Token", "notification": { "title": "测试推送", "body": "这是一条测试推送" }, "apns": { "headers": { "apns-push-type": "alert", "apns-priority": "5", "apns-topic": "你的App Bundle ID" } } }'这样能排除控制台配置的问题,直接测试FCM到APNs的推送链路是否通畅。
确认设备的通知权限是否真的开启
你代码里请求了权限,但还是要去iOS系统设置里,找到你的App,确认通知里的所有权限(提醒、标记、声音)都是开启状态,有时候系统会自动关闭,或者用户误操作关了都有可能。
如果以上步骤都排查完还是不行,你可以连接设备到Xcode,打开控制台日志,发推送的时候看有没有APNs相关的错误信息,比如证书不匹配、环境不匹配的报错,这些日志能帮你快速定位问题。
内容来源于stack exchange

