iOS14及以上系统,获取IDFA的方式有所变化,
苹果通知
App 需要通过 AppTrackingTransparency 征得用户的许可,才能追踪用户以及访问其设备的广告标识符,类似相机,相册,地图等弹出用户授权框,下面介绍ATT设置。
1、隐私中打开app跟踪总开关,否则无法弹框
若开关打开,仍然无法弹框,则重启iphone试试,亲测有效哦。
2、info.plist文件中添加
描述根据自己的app自定义。
3、在app初始化时 获取ATT权限
+ (void)getAdvertisingTrackingAuthority { if (@available(iOS 14, *)) { ATTrackingManagerAuthorizationStatus status = ATTrackingManager.trackingAuthorizationStatus; switch (status) { case ATTrackingManagerAuthorizationStatusDenied: NSLog(@"用户拒绝IDFA"); break; case ATTrackingManagerAuthorizationStatusAuthorized: NSLog(@"用户允许IDFA"); break; case ATTrackingManagerAuthorizationStatusNotDetermined: { NSLog(@"用户未做选择或未弹窗IDFA"); //请求弹出用户授权框,只会在程序运行是弹框1次,除非卸载app重装,通地图、相机等权限弹框一样 [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) { NSLog(@"app追踪IDFA权限:%lu",(unsigned long)status); }]; } break; default: break; } } else { // Fallback on earlier versions if ([ASIdentifierManager.sharedManager isAdvertisingTrackingEnabled]) { NSLog(@"用户开启了广告追踪IDFA"); }else { NSLog(@"用户关闭了广告追踪IDFA"); } }}4、问题描述
现象:当我们请求调起IDFA授权弹框后,程序仍然会往下走,不会等待到用户选择后 再往下执行。 此时如果调起弹框后面就有获取IDFA,是可以获取到的,因为用户未选择前app是默认运行的,那么如何做到同步呢? 可以在授权完成后再进行后续逻辑,如下:
授权操作完成后 再做相关获取操作 eg下图伪代码
case ATTrackingManagerAuthorizationStatusDenied: { NSLog(@"用户拒绝IDFA"); finishBlock(); } break;case ATTrackingManagerAuthorizationStatusAuthorized: { NSLog(@"用户允许IDFA"); finishBlock(); } break;case ATTrackingManagerAuthorizationStatusNotDetermined: { NSLog(@"用户未做选择或未弹窗IDFA"); [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) { dispatch_async(dispatch_get_main_queue(), ^{ finishBlock(); }); } break;注意:切记不可在此加锁,来实现同步,根据调用场景不同,可能会造成死锁(eg:didFinishLaunchingWithOptions)