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

Apple Watch中PushKit代理方法未触发问题求助

PKPushKit代理方法未触发的排查与修复

以下是针对你的问题的具体排查点和修复方案:

1. 修正PKPushRegistry实例的生命周期

你的pushRegistry如果是局部变量或弱引用,会在applicationDidBecomeActive执行完毕后被释放,导致代理无法回调。必须将其声明为应用代理类的强引用存储属性:

class WatchAppDelegate: NSObject, WKApplicationDelegate, PKPushRegistryDelegate {
    // 强引用属性,保证实例持续存在
    private let pushRegistry = PKPushRegistry(queue: DispatchQueue.main)
    
    func applicationDidBecomeActive() {
        pushRegistry.delegate = self
        pushRegistry.desiredPushTypes = [.complication]
    }
    
    func pushRegistry(_ registry: PKPushRegistry, didUpdate pushCredentials: PKPushCredentials, for type: PKPushType) {
        let token = pushCredentials.token.reduce("") { $0 + String(format: "%02x", $1) }
        print("PushToken: " + token)
    }
}

2. 完善配置项检查

  • 确认开发者后台的App ID已开启Complication Push能力,且对应iOS主应用已配置推送证书。
  • 手表应用的Info.plist必须包含WKAppBundleIdentifier字段,值为iOS主应用的Bundle ID。
  • 再次确认手表端已授予推送权限(可在系统设置中验证)。

3. 优化初始化时机

避免在applicationDidBecomeActive中重复配置推送,建议移至applicationDidFinishLaunching仅初始化一次:

func applicationDidFinishLaunching() {
    pushRegistry.delegate = self
    pushRegistry.desiredPushTypes = [.complication]
}

4. 添加错误排查代理方法

实现额外的代理方法,捕获可能的错误或回调信息:

func pushRegistry(_ registry: PKPushRegistry, didInvalidatePushTokenFor type: PKPushType) {
    print("Token invalidated for type: \(type)")
}

func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {
    print("Received push payload: \(payload.dictionaryPayload)")
    completion()
}

5. 设备环境检查

  • 确保Apple Watch处于联网状态(蓝牙连接iPhone或连接Wi-Fi)。
  • 测试环境下,确认使用的是开发推送证书,且设备已正确注册到APNs开发环境。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:58:25