iOS 11静默远程推送是否已弃用?适配方法疑问咨询
解决iOS静默推送从弃用方法切换的问题
首先得给你理清一个关键误区:UNUserNotificationCenter的willPresent方法本来就不负责处理静默推送,你的直觉是对的——这个方法只在APP处于前台、且推送带有可展示内容(比如alert、sound)时才会触发,而静默推送的核心就是不触发任何UI通知,所以它根本不会走到这个方法里。
接下来给你说正确的处理路径,这也是iOS 13+之后官方推荐的静默推送方案:
1. 先确认静默推送的核心前提
你的推送payload必须严格符合系统要求,否则系统不会把它识别为静默推送:
- 必须包含
aps字典里的content-available: 1(注意是数字1,不是字符串"1") - 不能包含
alert、sound、badge这些会触发UI展示的字段 - 示例payload:
{ "aps": { "content-available": 1 }, "custom_data": "你的业务数据" }
2. 用正确的回调方法处理
被弃用的是不带fetchCompletionHandler的didReceiveRemoteNotification方法,而带completion handler的版本并没有被弃用,这才是处理静默推送的正确入口:
如果你用的是传统AppDelegate(未启用Scene)
在AppDelegate中实现这个方法:
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { // 在这里处理你的静默推送逻辑,比如拉取最新数据、更新本地缓存等 print("收到静默推送:\(userInfo)") // 必须调用completionHandler,告诉系统你的处理结果 // 根据实际情况选择.newData/.noData/.failed completionHandler(.newData) }
如果你启用了SceneDelegate(iOS 13+)
除了AppDelegate的方法,还要在SceneDelegate中实现对应的回调,因为当APP处于后台时,系统会把推送给SceneDelegate:
func scene(_ scene: UIScene, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { // 可以复用AppDelegate里的处理逻辑,或者单独实现 completionHandler(.newData) }
3. 别忘了开启后台权限
在Xcode的项目Capabilities中,找到Background Modes,勾选Remote notifications,否则APP在后台时无法接收静默推送。
常见坑点提醒
- 测试静默推送时,确保APP处于后台或挂起状态(前台也能触发,但后台场景更符合静默推送的使用场景)
- 不要在
willPresent或didReceiveNotificationResponse里处理静默推送,这两个方法都是针对带有UI展示的通知设计的 - 推送服务商那边要确认payload的
content-available是数字类型,很多时候写成字符串会导致系统不识别
内容的提问来源于stack exchange,提问作者Mercutio
相关产品推荐
相关产品推荐

