ios14获取IDFA

苹果新推行的隐私政策

即将实行的 AppTrackingTransparency 要求 - 新闻 - Apple Developer

背景知识

  • 什么是IDFA
    IDFA全称为 Identity for Advertisers ,即广告标识符。用来标记用户,目前最广泛的用途是用于投放广告、个性化推荐等。
  • 怎么获取IDFA
    在 iOS13 及以前,系统会默认为用户开启允许追踪设置,我们可以简单的通过代码来获取到用户的 IDFA 标识符。
    if ([[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]) {
    	NSString *idfaString = [[ASIdentifierManager sharedManager] advertisingIdentifier].UUIDString;
    	NSLog(@"%@", idfaString);
    }
    但是在 iOS14 中,这个判断用户是否允许被追踪的方法已经废弃。
    iOS14 中,系统会默认为用户关闭广告追踪权限。

iOS14怎么获取IDFA

接着使用 AppTrackingTransparency 框架中的 ATTrackingManager 中的 requestTrackingAuthorizationWithCompletionHandler 请求用户权限,在用户授权后再去访问 IDFA 才能够获取到正确信息。

  • 首先需要在Info.plist配置权限申请的文案
    <key>NSUserTrackingUsageDescription</key>
    <string>App would like to access IDFA for tracking purpose.</string>
  • 然后检查状态、弹出询问框的代码如下
    #import <AppTrackingTransparency/AppTrackingTransparency.h>
    #import <AdSupport/AdSupport.h>
    if ( @available( iOS 14, * ) )
    {
        NSUInteger status = ATTrackingManager.trackingAuthorizationStatus;
        if ( status == ATTrackingManagerAuthorizationStatusNotDetermined )
        {
            NSLog( @"未决定" );
            [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
                if ( status == ATTrackingManagerAuthorizationStatusAuthorized )
                {
                    NSLog (@"用户同意了");
                    NSString *idfaString = [[ASIdentifierManager sharedManager] advertisingIdentifier].UUIDString;
                    NSLog (@"idfaString=%@", idfaString);
                } else {
                    NSLog (@"用户没同意");
                }
            }];
        } else if ( status == ATTrackingManagerAuthorizationStatusRestricted )
        {
            NSLog (@"限制");
        } else if ( status == ATTrackingManagerAuthorizationStatusDenied )
        {
            NSLog (@"拒绝");
        } else if ( status == ATTrackingManagerAuthorizationStatusAuthorized )
        {
            NSLog (@"同意");
            NSString *idfaString = [[ASIdentifierManager sharedManager] advertisingIdentifier].UUIDString;
            NSLog (@"idfaString=%@", idfaString);
        }
    } else {
        if ( [[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled] )
        {
            NSString *idfaString = [[ASIdentifierManager sharedManager] advertisingIdentifier].UUIDString;
            NSLog( @"idfaString=%@", idfaString );
        }
    }

可能出现的问题和解决办法

  • AppTrackingTransparency IOS14 以下崩溃
    Xcode 导入库时候AppTrackingTransparency.framework时在 Build Phases -> Link Binary With Libraries 中找到 AppTrackingTransparency.framework 状态设置为 Optional(Optional 意思为如果 IOS系统支持就会加载)。

参考的文章

https://www.jianshu.com/p/877101620fdb
https://www.jianshu.com/p/1803bd950b90
https://www.jianshu.com/p/c80e291362be