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

iOS13静默推送application:didReceiveRemoteNotification方法后台/终止时未触发求助

iOS13 静默推送后台/终止状态不触发的排查与解决

我来帮你解决这个iOS13特有的静默推送问题——这类情况往往和苹果在iOS13对APNs推送规范的收紧有关,咱们从几个关键维度排查:

1. 严格符合静默推送的Payload规范

iOS13对后台推送的Payload格式要求更严苛了,静默推送的aps字典里只需要保留content-available:1,多余的alert、sound甚至badge字段(哪怕设为null/空字符串)都会干扰系统识别为静默推送。正确的Payload应该是:

{"aps":{"content-available":1}}

如果需要携带自定义业务数据,直接放在aps字典外面即可,比如:

{"aps":{"content-available":1}, "custom_data": "your_info"}

2. 确认APNs请求头的正确性

你已经设置了apns-push-type: background和apns-priority:5,这两点是对的,但要额外注意:

  • apns-topic必须和App的Bundle ID完全一致,包括大小写和后缀(比如com.yourcompany.yourapp不能写错)
  • 确保authorization字段的Bearer Token是有效的,且对应沙箱环境(因为你用的是api.sandbox.push.apple.com)

3. 验证后台模式配置的完整性

除了在Capabilities里开启Push Notifications和Background Modes下的Remote Notifications,建议手动检查Info.plist:

  • 确认UIBackgroundModes数组里包含remote-notification项(有时候Xcode自动配置可能会遗漏,手动添加更稳妥)

4. 适配iOS13终止状态的推送处理逻辑

在iOS13中,当App处于终止状态时,静默推送会触发application(_:didFinishLaunchingWithOptions:),而不是直接进入application(_:didReceiveRemoteNotification:fetchCompletionHandler:)。你需要在启动方法里添加推送数据的判断与处理:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // 注册通知
    application.registerForRemoteNotifications()
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in
        // 处理权限
    }
    
    // 检查是否由静默推送启动
    if let remoteNotification = launchOptions?[.remoteNotification] as? [String: Any] {
        // 在这里处理静默推送逻辑
        // 记得调用fetchCompletionHandler(如果需要)
        application.applicationIconBadgeNumber = 0
    }
    return true
}

5. 检查系统权限与环境设置

  • 确认测试设备的通知权限是开启状态(设置->你的App->通知->允许通知)
  • 开启App的后台刷新权限(设置->你的App->后台App刷新)
  • 确保测试用的Device Token和推送证书都是沙箱环境的,不要和生产环境混用

测试用的Curl命令参考

你可以用这个简化后的命令测试,确保Payload和请求头完全符合要求:

curl -v -d '{"aps":{"content-available":1}}' \
-H "Content-Type: application/json" \
-H "apns-topic: YOUR_BUNDLE_ID" \
-H "apns-push-type: background" \
-H "apns-priority: 5" \
-H "authorization: bearer YOUR_VALID_KEY" \
https://api.sandbox.push.apple.com/3/device/YOUR_DEVICE_TOKEN

如果以上步骤都试过还是不行,可以尝试清理Xcode缓存、重启测试设备、重新生成推送证书和Device Token,有时候这类配置问题会因为缓存导致不生效。

内容的提问来源于stack exchange,提问作者Arun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 07:52:50