You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:46:17