iOS无需用户授权获取APNS设备令牌:didRegisterDevice未触发问题
iOS APNS设备令牌获取问题解答
核心结论
iOS系统的安全机制决定了:不获取用户推送权限,就无法获取APNS设备令牌,没有合法的绕过途径。
关于didRegisterDevice不触发的原因
- 调用
UIApplication.shared.registerForRemoteNotifications()后,若用户未授权推送权限,系统不会触发didRegisterForRemoteNotificationsWithDeviceToken,反而会调用didFailToRegisterForRemoteNotificationsWithError,你可以在这个方法里查看具体错误,一般都是权限不足导致的。 - 只有当用户授予了推送权限(包括允许通知、允许静默通知等任何权限类型),系统才会返回设备令牌,触发成功回调。
为什么不能跳过权限提示拿令牌
苹果的APNS机制是基于用户授权设计的,目的是保护用户隐私——防止应用在用户不知情的情况下获取令牌并发送推送。这种限制是系统层面的,没有公开API能绕过,而且强行绕过的话,过不了App Store审核。
正确的实现步骤
- 先请求推送权限,再注册远程通知:
// 在didFinishLaunchingWithOptions中执行 UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in if granted { DispatchQueue.main.async { UIApplication.shared.registerForRemoteNotifications() } } else { // 处理用户拒绝权限的场景,比如引导用户去设置开启 } }
- 实现两个关键委托方法:
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { // 把Data格式的令牌转成字符串 let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined() print("拿到设备令牌:\(token)") } func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { print("注册失败原因:\(error.localizedDescription)") }
补充说明
- 如果用户之前拒绝了权限,你可以引导用户前往系统设置开启,但只能通过
UIApplication.openSettingsURLString让用户手动进入,不能强制跳转。 - 静默推送不需要弹窗通知,但获取令牌的前提还是得有用户的推送权限授权。
内容的提问来源于stack exchange,提问作者Harsh Thakur
相关产品推荐
相关产品推荐

