iOS14及以上系统,获取IDFA的方式有所变化,
苹果通知
App 需要通过 AppTrackingTransparency 征得用户的许可,才能追踪用户以及访问其设备的广告标识符,类似相机,相册,地图等弹出用户授权框,下面介绍ATT设置。
1、隐私中打开app跟踪总开关,否则无法弹框
若开关打开,仍然无法弹框,则重启iphone试试,亲测有效哦。
2、info.plist文件中添加
描述根据自己的app自定义。
<key>NSUserTrackingUsageDescription</key>
<string>是否允许xx使用您的IDFA信息,以此来优化您的使用体验</string>
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)