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

iOS VOIP类型PKPushRegistry令牌重复问题求助

VOIP推送令牌重复问题的解决方案

问题核心原因

你当前的PKPushRegistry是方法内的局部变量,方法执行完毕后就会被ARC自动回收,系统无法维持与APNs的有效绑定关系,导致即使重装应用、变更订阅状态,也只会复用缓存的旧令牌。

修复步骤

  1. 将PKPushRegistry改为全局属性
    把pushRegistry声明为AppDelegate的成员变量,确保它的生命周期与应用一致,这样系统才能正常处理令牌刷新逻辑:

    class AppDelegate: UIResponder, UIApplicationDelegate, PKPushRegistryDelegate {
        // 全局保存pushRegistry实例
        private var pushRegistry: PKPushRegistry!
        
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
            pushRegistrySetup()
            return true
        }
        
        func pushRegistrySetup() {
            pushRegistry = PKPushRegistry(queue: DispatchQueue.main)
            pushRegistry.delegate = self
            pushRegistry.desiredPushTypes = [.voIP]
        }
        
        func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, for type: PKPushType) {
            let token = credentials.token.reduce("", {$0 + String(format: "%02X", $1)})
            print("callToken: \(token)")
        }
    }
    
  2. 主动清理与重新订阅(可选)
    如果需要主动触发令牌刷新,可以先清空推送类型,再重新设置:

    // 取消VOIP推送订阅
    pushRegistry.desiredPushTypes = []
    // 重新订阅,触发新令牌请求
    pushRegistry.desiredPushTypes = [.voIP]
    

补充说明

全局引用PKPushRegistry是APNs正确管理VOIP推送令牌的必要条件,只有这样系统才能在应用重装、设备重启或订阅状态变更时,向APNs发起新的令牌请求,避免重复使用旧令牌。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 20:51:19