iOS 15上App Tracking Transparency权限弹窗不显示导致应用被拒如何解决
iOS 15 ATT权限请求不弹出修复方案
苹果在iOS 15及以上版本对ATT请求的触发逻辑做了更严格的限制:仅当应用处于前台活跃状态时,调用requestTrackingAuthorization才会触发系统权限弹框,你的代码触发时机不符合要求:
didFinishLaunchingWithOptions执行阶段应用仅完成初始化,尚未进入前台活跃状态,系统会直接忽略ATT请求- 根视图控制器的
viewDidLoad执行阶段视图仅完成加载,尚未渲染到当前窗口,应用也未进入完全活跃状态,同样无法触发弹框
修复步骤
- 调整触发时机:不要在
didFinishLaunchingWithOptions和根视图viewDidLoad中调用请求,建议监听UIApplication.didBecomeActiveNotification通知,在应用首次进入活跃状态后再发起ATT请求;也可以将逻辑移到根视图的viewDidAppear(_:)方法中执行 - 校验权限配置:确认Info.plist中已经添加
NSUserTrackingUsageDescription字段,填写清晰明确的用户数据跟踪用途,模糊的描述会直接导致审核被拒 - 增加状态判断:发起请求前先检查当前授权状态,仅当状态为
notDetermined时再调用请求,用户已经做出过授权选择后,重复调用不会触发弹框 - 调整广告跟踪配置逻辑:原代码无论用户授权结果都直接开启广告跟踪不符合苹果规范,需要根据用户的授权状态调整配置
参考实现代码
if #available(iOS 14, *) { // 监听应用进入活跃状态通知 NotificationCenter.default.addObserver( forName: UIApplication.didBecomeActiveNotification, object: nil, queue: .main ) { [weak self] _ in // 移除通知避免重复触发 NotificationCenter.default.removeObserver( self!, name: UIApplication.didBecomeActiveNotification, object: nil ) let authStatus = ATTrackingManager.trackingAuthorizationStatus guard authStatus == .notDetermined else { // 已经授权过直接根据状态配置广告跟踪 FBAdSettings.setAdvertiserTrackingEnabled(authStatus == .authorized) return } // 发起权限请求 ATTrackingManager.requestTrackingAuthorization { status in FBAdSettings.setAdvertiserTrackingEnabled(status == .authorized) } } }
内容的提问来源于stack exchange,提问作者Ömer Karaca
相关产品推荐
相关产品推荐

