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

Apple Watch端推送通知userInfo为空问题排查求助

Apple Watch推送通知userInfo为空问题排查方案

针对你遇到的Apple Watch端能触发推送代理方法但获取不到有效userInfo的问题,结合iOS端正常的情况,从配置、Payload、代码三个维度给出排查步骤:

一、检查Watch App的推送相关配置

  • 打开Watch目标的Signing & Capabilities,确认已开启Push Notifications能力,且Provisioning Profile包含推送权限
  • 确认Watch目标的APS环境和iOS端完全一致:QA环境用Sandbox,Production环境用Production(可在Info.plist的APS Environment字段或Capabilities里的Push Notifications设置中检查)
  • 验证Watch App的Info.plist中WKAppBundleIdentifier是否正确关联到iOS主App的Bundle ID,确保推送能正确转发到Watch

二、校验推送Payload的格式

Watch对推送Payload的要求和iOS略有差异,需确保:

  • 如果是直接发送到Watch的推送,Payload的自定义字段要放在aps字典外部(不要嵌套在aps里),示例格式:
    {
      "aps": {
        "alert": "测试推送",
        "sound": "default"
      },
      "custom_key": "custom_value"
    }
    
  • 如果是通过iOS App转发推送至Watch,Payload需包含watchkit字段,示例:
    {
      "aps": {
        "alert": "测试转发推送",
        "sound": "default",
        "watchkit": {
          "complication": {
            "update": true
          }
        }
      },
      "custom_key": "custom_value"
    }
    
  • 推送测试时,直接用APNs测试工具发送到Watch的设备令牌,排除iOS转发的干扰

三、代码逻辑与生命周期排查

结合你提供的NotificationCenter类,做以下调整和检查:

  1. 添加日志确认userInfo状态:在代理方法中直接打印userInfo,确认是否真的为空,而非request对象的问题:
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        print("Received notification userInfo: \(notification.request.content.userInfo)") // 新增日志
        self.request = notification.request
        completionHandler([.alert, .sound, .badge])
    }
    
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        print("Response notification userInfo: \(response.notification.request.content.userInfo)") // 新增日志
        self.request = response.notification.request
        completionHandler()
    }
    
  2. 确保代理对象的生命周期:在Watch App的入口(比如WatchApp.swift)中,将NotificationCenter实例作为环境对象注入,避免被提前释放:
    @main
    struct WatchApp: App {
        let notificationCenter = NotificationCenter() // 保持全局实例
    
        var body: some Scene {
            WindowGroup {
                ContentView()
                    .environmentObject(notificationCenter)
            }
        }
    }
    
  3. 确认Watch端的推送权限请求:检查权限请求的日志输出,确认用户已授权推送权限(代码中已处理权限请求,可查看控制台是否打印"No permission"相关信息)

四、额外排查点

  • 检查Watch App是否处于后台或未启动状态:如果是静默推送,Watch端可能不会触发willPresent方法,需确认推送类型包含alert或sound字段,确保是可展示的通知
  • 验证Watch的设备令牌是否正确:在Watch端获取并打印设备令牌,确认推送是发送到正确的令牌上

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 04:52:31