Flutter iOS端应用后台/进程被杀状态下无法收到推送通知
Flutter iOS 后台/进程终止状态下通知不弹出问题修复方案
以下是按排查优先级排序的可落地修复步骤,覆盖90%以上的同类场景:
- 首先校验Xcode端能力配置
打开ios/Runner.xcworkspace,在Target的Signing & Capabilities页签确认两个配置:- 已添加Push Notifications能力,对应entitlements文件里会自动生成
aps-environment字段 - 已添加Background Modes能力,且勾选其中的
Remote notifications选项
这两项是iOS系统允许App在后台、终止态接收推送的前置条件,缺任何一个都不会触发系统级通知展示。
- 已添加Push Notifications能力,对应entitlements文件里会自动生成
- 校验通知权限申请逻辑
不要用默认的provisional权限申请,这个权限下通知只会进通知中心,不会主动弹横幅。正确的权限申请代码如下:
申请后可以在iOS系统设置里找到对应App,确认通知权限的横幅开关是打开状态,同时排除专注模式拦截通知的情况。FirebaseMessaging.instance.requestPermission( alert: true, badge: true, sound: true, provisional: false ); - 校验推送Payload格式与优先级
后台、终止态下的通知弹窗由APNs直接调起系统组件渲染,不会走Flutter层的业务代码,Payload必须符合APNs规范才能正常弹窗:错误写法:只传
content-available: 1做静默推送,不带alert字段,这类推送只会唤醒App执行后台逻辑,用户看不到任何弹窗
正确的Payload核心结构参考:
如果用第三方推送服务发消息,必须将推送优先级设置为高优先级,低优先级推送会被APNs节流,延迟投递甚至不触发弹窗。{ "aps": { "alert": { "title": "通知标题", "body": "通知正文" }, "sound": "default", "badge": 1 }, "customParam": "自定义参数放在aps节点外" } - 修正通知处理的逻辑误区
不要把通知弹窗的展示逻辑全部写在onMessage、onMessageOpenedApp这类Flutter层回调里:这几个回调仅在App处于前台、或者用户点击通知拉起App时触发,后台/终止态下Flutter引擎根本不会启动,这部分代码完全不会执行。如果是需要自定义通知样式的场景,要在原生端配置通知服务扩展(Notification Service Extension),不能依赖Flutter层代码触发展示。
同时检查AppDelegate.swift里的通知前台展示代理实现,确保回调正确返回展示选项,错误的实现会干扰全场景的通知展示:override func userNotificationCenter( _ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void ) { // 前台状态下也允许弹出横幅、声音、角标 completionHandler([.alert, .sound, .badge]) } - 测试方式避坑
不要连着Xcode调试器测试终止态推送,Xcode附加进程会干扰APNs的投递逻辑。正确测试方式是:打测试包装到真机上,手动划掉App杀掉进程,断开Xcode连接后再发推送测试。同时注意区分APNs开发/生产环境,开发环境的设备token只能用开发环境证书发推送,生产证书发的推送开发环境下设备完全收不到。
内容的提问来源于stack exchange,提问作者Robin Singh
相关产品推荐
相关产品推荐

