iOS14关于IDFA获取权限调研
场景
Apple宣布 2020-9-16 发布iOS14新系统,iOS14系统具官网了解,如果需要获取IDFA(广告符),需要用户授权。我们公司合作的第三方广告目前都是通过IDFA在跟踪用户。
iOS13之前的版本可以直接获取,只要用户不手动去设置页面关闭。
所以小调研了一下。
测试设备:iPhone6,iOS14Beta7
开发工具:Xcode11
调用判断IDFA是否开启开关,无论设置里限制广告跟踪的开关是否打开,都是返回 false,但是直接获取却是正确的IDFA值。(不知道是不是iOS14Beta系统的bug)
import AdSupport
// 是否可以获取IDFA,iOS14永远返回 false,但是打印 ASIdentifierManager.shared().advertisingIdentifier.uuidString 有值
if ASIdentifierManager.shared().isAdvertisingTrackingEnabled {
debugPrint("开着:\(ASIdentifierManager.shared().advertisingIdentifier.uuidString)")
} else {
debugPrint("关了:\(ASIdentifierManager.shared().advertisingIdentifier.uuidString)")
}
打印结果:
"关了:7DE78ED0-3854-4840-A49C-2F33B9DC201B"
iOS14后正确的获取方式:
测试设备:iPhone6,iOS14Beta7
开发工具:Xcode12,Beta2
Xcode12引入新的Framework AppTrackingTransparency,代码如下:
import AdSupport
import AppTrackingTransparency
if #available(iOS 14, *) {
ATTrackingManager.requestTrackingAuthorization { (status) in
switch status {
case .denied:
debugPrint("用户拒绝")
break
case .authorized:
debugPrint("用户允许")
debugPrint("IDFA:\(ASIdentifierManager.shared().advertisingIdentifier.uuidString)")
break
case .notDetermined:
debugPrint("用户没有选择")
default:
break
}
}
} else {
// iOS13及之前版本,继续用以前的方式
if ASIdentifierManager.shared().isAdvertisingTrackingEnabled {
debugPrint("可以获取:\(ASIdentifierManager.shared().advertisingIdentifier.uuidString)")
} else {
debugPrint("用户未打开IDFA开关")
}
}
同时 info.plist也要添加一个权限提示配置:
NSUserTrackingUsageDescription
:Vaule为要提示用户授权的一句话,配置完成。
还有一个变动是,iOS14的广告跟踪权限放到了每个App的设置中,而不像之前在隐私全局设置中。
IMG_2EC8D9B22F3C-1.jpeg
启动App后,会类似推送或者定位的权限提示一样,有一个系统弹窗。
IMG_2294.PNG
结论:
如果有需要使用IDFA的App,或者和第三方广告有合作的App,需要产品层面设计上考虑,如果用户需选择“要求App不跟踪”,引导用户跳转到设置打开的流程。
技术需要考虑的问题
是要使用 AppTrackingTransparency,必须升级到Xcode12,如果升级到意味着要兼容iOS14,是否还有别的坑。
目前已经发现的坑是,UITableViewCell
直接 cell.addSubView(viewTest)
, viewTest
会无法触发到手势响应(像是被cell.contentView遮盖住了)。
必须改为 cell.contentView.sddSubView(viewTest)
,我们项目是通过这种方式全局兼容的。
不太清楚是不是 Xcode12Beta版本问题,因为目前正式版Xcode12还未发布。
也可以尝试:
如果我们不着急升级Xcode12,依然使用Xcode11暂时先打包;不判断广告符是否授权,直接获取,是不是依然可以获取到iOS14设备的真实IDFA?
目前拿一台iPhone6的iOS14Beta7测试是可以的,需要更多的测试结果来证明猜测。