場(chǎng)景
Apple宣布 2020-9-16 發(fā)布iOS14新系統(tǒng),iOS14系統(tǒng)具官網(wǎng)了解,如果需要獲取IDFA(廣告符),需要用戶授權(quán)。我們公司合作的第三方廣告目前都是通過IDFA在跟蹤用戶。
iOS13之前的版本可以直接獲取,只要用戶不手動(dòng)去設(shè)置頁面關(guān)閉。
所以小調(diào)研了一下。
測(cè)試設(shè)備:iPhone6,iOS14Beta7
開發(fā)工具:Xcode11
調(diào)用判斷IDFA是否開啟開關(guān),無論設(shè)置里限制廣告跟蹤的開關(guān)是否打開,都是返回 false,但是直接獲取卻是正確的IDFA值。(不知道是不是iOS14Beta系統(tǒng)的bug)
import AdSupport
// 是否可以獲取IDFA,iOS14永遠(yuǎn)返回 false,但是打印 ASIdentifierManager.shared().advertisingIdentifier.uuidString 有值
if ASIdentifierManager.shared().isAdvertisingTrackingEnabled {
debugPrint("開著:\(ASIdentifierManager.shared().advertisingIdentifier.uuidString)")
} else {
debugPrint("關(guān)了:\(ASIdentifierManager.shared().advertisingIdentifier.uuidString)")
}
打印結(jié)果:
"關(guān)了:7DE78ED0-3854-4840-A49C-2F33B9DC201B"
iOS14后正確的獲取方式:
測(cè)試設(shè)備:iPhone6,iOS14Beta7
開發(fā)工具: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及之前版本,繼續(xù)用以前的方式
if ASIdentifierManager.shared().isAdvertisingTrackingEnabled {
debugPrint("可以獲取:\(ASIdentifierManager.shared().advertisingIdentifier.uuidString)")
} else {
debugPrint("用戶未打開IDFA開關(guān)")
}
}
同時(shí) info.plist也要添加一個(gè)權(quán)限提示配置:
NSUserTrackingUsageDescription:Vaule為要提示用戶授權(quán)的一句話,配置完成。
還有一個(gè)變動(dòng)是,iOS14的廣告跟蹤權(quán)限放到了每個(gè)App的設(shè)置中,而不像之前在隱私全局設(shè)置中。

啟動(dòng)App后,會(huì)類似推送或者定位的權(quán)限提示一樣,有一個(gè)系統(tǒng)彈窗。
結(jié)論:
如果有需要使用IDFA的App,或者和第三方廣告有合作的App,需要產(chǎn)品層面設(shè)計(jì)上考慮,如果用戶需選擇“要求App不跟蹤”,引導(dǎo)用戶跳轉(zhuǎn)到設(shè)置打開的流程。
技術(shù)需要考慮的問題
是要使用 AppTrackingTransparency,必須升級(jí)到Xcode12,如果升級(jí)到意味著要兼容iOS14,是否還有別的坑。
目前已經(jīng)發(fā)現(xiàn)的坑是,UITableViewCell直接 cell.addSubView(viewTest), viewTest會(huì)無法觸發(fā)到手勢(shì)響應(yīng)(像是被cell.contentView遮蓋住了)。
必須改為 cell.contentView.sddSubView(viewTest),我們項(xiàng)目是通過這種方式全局兼容的。
不太清楚是不是 Xcode12Beta版本問題,因?yàn)槟壳罢桨鎄code12還未發(fā)布。
也可以嘗試:
如果我們不著急升級(jí)Xcode12,依然使用Xcode11暫時(shí)先打包;不判斷廣告符是否授權(quán),直接獲取,是不是依然可以獲取到iOS14設(shè)備的真實(shí)IDFA?
目前拿一臺(tái)iPhone6的iOS14Beta7測(cè)試是可以的,需要更多的測(cè)試結(jié)果來證明猜測(cè)。