場景
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的設置中,而不像之前在隱私全局設置中。
啟動App后,會類似推送或者定位的權限提示一樣,有一個系統彈窗。
結論:
如果有需要使用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測試是可以的,需要更多的測試結果來證明猜測。