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类,做以下调整和检查:
- 添加日志确认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() } - 确保代理对象的生命周期:在Watch App的入口(比如
WatchApp.swift)中,将NotificationCenter实例作为环境对象注入,避免被提前释放:@main struct WatchApp: App { let notificationCenter = NotificationCenter() // 保持全局实例 var body: some Scene { WindowGroup { ContentView() .environmentObject(notificationCenter) } } } - 确认Watch端的推送权限请求:检查权限请求的日志输出,确认用户已授权推送权限(代码中已处理权限请求,可查看控制台是否打印"No permission"相关信息)
四、额外排查点
- 检查Watch App是否处于后台或未启动状态:如果是静默推送,Watch端可能不会触发
willPresent方法,需确认推送类型包含alert或sound字段,确保是可展示的通知 - 验证Watch的设备令牌是否正确:在Watch端获取并打印设备令牌,确认推送是发送到正确的令牌上
内容的提问来源于stack exchange,提问作者Rachel
相关产品推荐
相关产品推荐

