iOS ——IDFA权限 AppTrackingTransparency

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)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值