You need to enable JavaScript to run this app. 如何使用Objective-C检测iOS 14中允许App请求跟踪的开关状态
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.07 03:54:04