iOS后台状态下无需点击通知解析推送Payload及获取通知到达回调
后台接收推送Payload并触发回调的实现方案
当然可以做到!当你的App处于后台(甚至挂起状态)时,只要配置到位,推送通知到达后不用用户点击,你就能直接解析它的Payload并处理逻辑。下面分步骤给你讲清楚怎么实现:
一、先开启必要的后台权限
首先得在Xcode里给项目配置后台能力:
- 打开项目的
Signing & Capabilities标签,点击+ Capability,添加Background Modes - 在
Background Modes里勾选Remote notifications选项 - 同时,推送的Payload必须包含
content-available: 1这个字段(注意是数字类型的1,不是字符串),这是告诉iOS系统“这条推送需要唤醒后台的App来处理”
二、实现对应的回调方法
根据iOS版本的不同,你需要在对应的代理类里实现处理方法:
iOS 10+ 推荐用UNUserNotificationCenterDelegate
在你的AppDelegate或者SceneDelegate(iOS 13及以上)里,遵守UNUserNotificationCenterDelegate协议,然后实现这个方法:
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { // 从这里拿到推送的Payload let payload = response.notification.request.content.userInfo // 在这里处理你的解析逻辑 print("后台收到推送Payload: \(payload)") // 一定要调用completionHandler,告诉系统处理完成 completionHandler() }
只要推送带了content-available:1,即使App在后台,这个方法也会被触发,不用用户点击通知。
兼容旧版本的后台回调方法
如果你需要兼容iOS 10以下,或者想专门处理后台唤醒的场景,可以用这些方法:
- AppDelegate里的:
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { // 解析Payload print("后台收到推送Payload: \(userInfo)") // 处理完后调用completionHandler,返回对应的结果 completionHandler(.newData) }
- iOS 13+的SceneDelegate里的:
func scene(_ scene: UIScene, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { let payload = userInfo // 处理逻辑 completionHandler(.newData) }
三、一些关键注意事项
- 静默推送(不带
alert、sound等显示字段的推送)只要包含content-available:1,也会触发后台回调,适合不需要通知用户但需要后台处理的场景 - 系统对后台唤醒的频率有节流机制,如果短时间内频繁发送这类推送,系统可能会拒绝唤醒App,所以不要滥用这个功能
- 测试的时候,确保App是真正处于后台状态(不是调试时手动挂起),可以用Xcode的
Debug > Simulate Background Fetch来模拟,或者用APNs测试工具发送带content-available:1的推送
内容的提问来源于stack exchange,提问作者user782400
相关产品推荐
相关产品推荐

