iOS ——IDFA权限 AppTrackingTransparency

iOS14及以上系统,获取IDFA的方式有所变化,
苹果通知
App 需要通过 AppTrackingTransparency 征得用户的许可,才能追踪用户以及访问其设备的广告标识符,类似相机,相册,地图等弹出用户授权框,下面介绍ATT设置。

1、隐私中打开app跟踪总开关,否则无法弹框
若开关打开,仍然无法弹框,则重启iphone试试,亲测有效哦。
iOS ——IDFA权限 AppTrackingTransparency_第1张图片

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)

你可能感兴趣的:(iOS ——IDFA权限 AppTrackingTransparency)