ios14获取IDFA
苹果新推行的隐私政策
即将实行的 AppTrackingTransparency 要求 - 新闻 - Apple Developer
背景知识
- 什么是IDFA
IDFA全称为 Identity for Advertisers ,即广告标识符。用来标记用户,目前最广泛的用途是用于投放广告、个性化推荐等。 - 怎么获取IDFA
在 iOS13 及以前,系统会默认为用户开启允许追踪设置,我们可以简单的通过代码来获取到用户的 IDFA 标识符。
但是在 iOS14 中,这个判断用户是否允许被追踪的方法已经废弃。if ([[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]) { NSString *idfaString = [[ASIdentifierManager sharedManager] advertisingIdentifier].UUIDString; NSLog(@"%@", idfaString); }
iOS14 中,系统会默认为用户关闭广告追踪权限。
iOS14怎么获取IDFA
接着使用 AppTrackingTransparency 框架中的 ATTrackingManager 中的 requestTrackingAuthorizationWithCompletionHandler 请求用户权限,在用户授权后再去访问 IDFA 才能够获取到正确信息。
- 首先需要在Info.plist配置权限申请的文案
<key>NSUserTrackingUsageDescription</key> <string>App would like to access IDFA for tracking purpose.</string>
- 然后检查状态、弹出询问框的代码如下
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