iOS 15系统下ATTrackingManager.requestTrackingAuthorization失效问题咨询
问题根因
- iOS 15 对
ATTrackingManager.requestTrackingAuthorization的调用时机做了更严格的限制:在应用未完成启动进入活跃状态前调用该接口,系统会直接返回ATTrackingManagerAuthorizationStatusDenied,不会弹出用户授权弹窗,导致功能失效 - 若Info.plist中配置的
NSUserTrackingUsageDescription字段描述模糊,未明确说明追踪数据的用途,苹果审核会直接驳回应用,也会触发接口调用异常
适配解决步骤
1. 调整接口调用时机
不要在application:didFinishLaunchingWithOptions:方法中直接调用授权接口,改为监听UIApplicationDidBecomeActiveNotification通知,在应用进入活跃状态后再触发授权请求,参考代码如下:
// Objective-C 实现示例 - (void)viewDidLoad { [super viewDidLoad]; // 监听应用进入活跃通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(requestTrackingAuth) name:UIApplicationDidBecomeActiveNotification object:nil]; } - (void)requestTrackingAuth { if (@available(iOS 14, *)) { ATTrackingManagerAuthorizationStatus status = [ATTrackingManager trackingAuthorizationStatus]; // 仅未授权时发起请求 if (status == ATTrackingManagerAuthorizationStatusNotDetermined) { [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) { // 按需处理授权结果 }]; } } }
// Swift 实现示例 override func viewDidLoad() { super.viewDidLoad() // 监听应用进入活跃通知 NotificationCenter.default.addObserver(self, selector: #selector(requestTrackingAuth), name: UIApplication.didBecomeActiveNotification, object: nil) } @objc func requestTrackingAuth() { if #available(iOS 14, *) { let status = ATTrackingManager.trackingAuthorizationStatus // 仅未授权时发起请求 guard status == .notDetermined else { return } ATTrackingManager.requestTrackingAuthorization { status in // 按需处理授权结果 } } }
如果应用存在开屏闪屏、开屏广告等流程,需要等开屏流程完全结束后再调用授权接口,避免授权弹窗被其他页面覆盖导致用户无法查看操作,触发苹果审核驳回。
2. 完善Info.plist权限描述
NSUserTrackingUsageDescription的描述必须清晰明确,如实告知用户追踪数据的具体用途,示例描述:
我们会将您的应用内活动数据用于个性化广告推送、产品体验优化,不会向第三方共享您的个人身份信息
禁止使用“需要获取权限以提升服务质量”这类模糊描述,不符合苹果审核规范。
3. 兼容授权结果处理
如果用户拒绝追踪授权,不得强制引导用户跳转系统设置页开启权限,也不得因为用户拒绝授权就限制应用核心功能的正常使用,否则也会被苹果审核驳回。
内容的提问来源于stack exchange,提问作者Tajinder singh
相关产品推荐
相关产品推荐

