didReceiveRemoteNotification:fetchCompletionHandler 应用后台非活跃时未调用问题
iOS 后台/非活跃状态推送回调不触发排查解决方案
1. 推送Payload与APNs配置检查
- 确认推送payload携带
content-available: 1字段,这是触发后台推送回调的核心标识,普通通知栏推送不带该字段时,仅用户点击通知弹窗时才会触发回调,后台静置状态不会主动调用方法 - iOS 13+ 要求静默推送必须在APNs请求头中携带
apns-push-type: background、apns-priority: 5,缺少参数的推送会被APNs服务器直接拦截,不会下发到设备 - 避免同时在payload中携带
content-available:1和alert/sound/badge等通知展示字段,这类混合类型推送会被iOS系统判定为无效静默推送,后台状态下不会触发回调
2. 项目权限与能力配置检查
- 打开Xcode项目的
Signing & Capabilities标签,确认已添加Background Modes能力,且勾选了Remote notifications选项 - 确认
Push Notifications能力已正常开启,对应推送证书、DeviceToken注册逻辑无异常 - 检查项目
Info.plist中存在UIBackgroundModes字段,且包含remote-notification值
3. 代码逻辑排查
- 确认App已正确申请推送权限,调用了
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge])且用户已同意授权 - 若同时集成了UserNotifications框架,需确认已正确实现
UNUserNotificationCenterDelegate的相关代理方法,避免代理冲突导致系统回调被拦截 - 确认没有重写
didReceiveRemoteNotification的无fetchCompletionHandler重载方法,系统会优先调用带completionHandler的版本,两个方法同时实现可能出现回调异常 - 确认
didReceiveRemoteNotification中的completionHandler会在方法触发后30秒内调用,超时未调用会触发系统机制,降低后续App的后台推送唤醒优先级甚至完全限制,你当前的代码已实现该调用,符合规范要求
4. 测试场景注意事项
- 不要使用Xcode模拟器测试后台推送,模拟器不支持后台推送唤醒能力,请使用真机测试
- 测试时不要通过Xcode或手动上滑杀掉App进程,进程被杀状态下系统默认不会触发推送回调(iOS 15+ 可通过特殊配置实现被杀状态唤醒,但需要额外适配)
- 静默推送有系统级频率限制,短时间内发送大量静默推送会被系统自动拦截,避免测试时短时间高频发送推送
内容的提问来源于stack exchange,提问作者Jay Patel
相关产品推荐
相关产品推荐

