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

推送通知无法获取Token:didRegister等回调方法未触发求助

解决didRegisterForRemoteNotificationsWithDeviceToken不调用的问题

我之前在集成iOS推送的时候也完完全全踩过这个坑!控制台只刷权限相关的日志,但就是不触发注册成功或失败的回调,折腾了好几天才把所有坑趟平,给你列几个最容易忽略的排查点:

  • 权限请求和注册的顺序绝对不能搞反
    你得先请求用户的通知权限,等用户明确授权之后再调用注册远程通知的方法。正确的流程应该是这样:

    // 先发起权限请求
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in
        if granted {
            // 权限通过后,回到主线程注册远程通知
            DispatchQueue.main.async {
                UIApplication.shared.registerForRemoteNotifications()
            }
        }
    }
    

    很多人会把registerForRemoteNotifications()放在权限请求外面,或者没等用户授权就执行,这时候系统根本不会去请求设备Token。

  • 必须用真机测试,模拟器大概率不靠谱
    模拟器有时候能模拟权限弹窗,但几乎不会返回真实的Device Token——哪怕你配置了推送证书也没用。拿一台登录了Apple ID的真机,还要确保你的开发者账号已经把这台设备添加到了设备列表里。

  • 检查Xcode的Capabilities配置
    打开项目Target的Signing & Capabilities标签:

    1. 确认已经添加了Push Notifications能力,开关处于打开状态
    2. 确认Signing配置里的Team是正确的开发者账号,对应的证书包含推送权限(可以去苹果开发者后台检查推送证书是否有效)
  • 验证通知权限是否真的被授予
    控制台打印的“Permission...”可能只是告诉你发起了权限请求,但用户不一定点了允许。你可以手动调用API检查当前权限状态:

    UNUserNotificationCenter.current().getNotificationSettings { settings in
        print("当前通知权限状态:\(settings.authorizationStatus)")
    }
    

    如果状态是.denied,就得去系统设置里给APP开启通知权限;如果是.notDetermined,说明权限请求流程有问题,用户还没做出选择。

  • Delegate设置是否正确
    确保你在合适的时机设置了通知中心的Delegate,比如在AppDelegate的didFinishLaunchingWithOptions里:

    UNUserNotificationCenter.current().delegate = self
    

    另外,didRegisterForRemoteNotificationsWithDeviceToken是UIApplicationDelegate的方法,如果你用的是SceneDelegate,也要确保AppDelegate里实现了这个方法,或者在SceneDelegate的sceneWillEnterForeground里重新注册一次远程通知。

  • 检查系统版本和特殊场景
    iOS 13及以上版本,APP切换到后台再回到前台时,可能需要重新注册远程通知;如果你的APP是通过推送唤醒的,也要确保注册逻辑在唤醒后能正常执行。

如果以上所有点都排查过还是不行,建议去苹果开发者后台重新生成推送证书,然后重新下载安装到Xcode——有时候证书的缓存会莫名其妙出问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:25:11