如何使用Objective-C检测iOS 14中允许App请求跟踪的开关状态
检测iOS 14中「允许App请求跟踪」全局开关状态的Objective-C实现
实现前置依赖
要完成该检测,无需调用私有API,仅需接入苹果官方的两个公开框架:
AppTrackingTransparency:提供iOS 14新增的跟踪权限状态读取能力,需在项目设置中完成框架链接AdSupport:提供IDFA的读取能力,用于区分易混淆的权限状态
状态判定逻辑
系统全局「允许App请求跟踪」开关的状态,会直接联动跟踪权限接口的返回值,对应规则为:
- 当全局开关关闭时,无论当前App此前的单独授权结果是什么,系统都会统一将跟踪权限状态返回为
ATTrackingManagerAuthorizationStatusDenied,且App无法读取到有效的非全零格式IDFA- 当全局开关开启时,接口返回的是当前App自身的单独跟踪授权状态,只要App此前获得过授权,就可以正常读取到有效IDFA
核心检测代码
#import <AppTrackingTransparency/AppTrackingTransparency.h> #import <AdSupport/AdSupport.h> - (BOOL)isGlobalTrackingSwitchEnabled { // 兼容iOS 14以下系统:不存在该全局开关时直接返回YES if (@available(iOS 14, *)) { ATTrackingManagerAuthorizationStatus authStatus = [ATTrackingManager trackingAuthorizationStatus]; // 权限为拒绝状态时,需区分是「全局开关关闭」还是「当前App单独被用户拒绝」 if (authStatus == ATTrackingManagerAuthorizationStatusDenied) { NSString *idfaString = [[ASIdentifierManager sharedManager] advertisingIdentifier].UUIDString; // 全局开关关闭时,读取到的IDFA固定为全零的无效值 if ([idfaString isEqualToString:@"00000000-0000-0000-0000-000000000000"]) { return NO; } } // 其余状态下全局跟踪开关均为开启状态 return YES; } return YES; }
注意事项
- 不要在App启动的最早期(如
didFinishLaunchingWithOptions方法执行阶段)调用检测逻辑,此时系统权限状态尚未完成初始化,会拿到不准确的状态值 - 若检测到全局开关为关闭状态,无需重复调用跟踪权限申请接口,此时所有申请请求都会被系统静默拦截,直接引导用户调整系统设置即可
- 系统未提供公开的直接跳转至「跟踪」设置子页面的接口,引导用户调整设置时,仅能跳转到App自身的系统设置页,切勿使用私有跳转接口,否则会存在审核被拒的风险
- 检测操作不要在App处于后台状态时触发,后台环境下读取的权限状态可能存在偏差
内容的提问来源于stack exchange,提问作者Phạm Ân
相关产品推荐
相关产品推荐

