2020/09/16:追記
iOS14 GMでも、同じ挙動となる事を確認しました。
日本時間 9月17日にリリースされる正式版でも恐らく同じ動きになる可能性が高いと思われます。
2020/09/17:追記
iOS14 正式版でも予想通り同じ挙動ですね。
Firebaseや広告SDKなどからも軒並みアップデートのお知らせが来ていますが、この仕様への対応と思われます。
概要
iOS14(ベータ版)では、常にisAdvertisingTrackingEnabledがfalseを返してくる様です。
AdSupport FrameworkのisAdvertisingTrackingEnabledは
iOS13までの「追跡型広告を制限」をチェックする為のフラグでしたが
iOS14でDeprecatedとなりました。
先日リリースされたiOS14 beta8で、実際の挙動について検証してみました。
環境
- xcode12.0 beta 6
- iOS14 beta8
- iPhoneX(トラッキング制限設定無し)
結果
結果は以下の通り
ビルド | isAdvertisingTrackingEnabled | IDFA |
---|---|---|
iOS13向け | false | 取得OK |
iOS14向け(IDFA許諾は未決定。ダイアログ出していない) | false | 取得OK |
やはり、ユーザのIDFA許諾状況に依らず、isAdvertisingTrackingEnabledは常にfalseが返ってくる結果でした。
つまり、現在リリースしているアプリをiOS14で実行した場合。
iOS13で追跡型広告を制限(LAT)していなかったユーザであっても、iOS14では「制限あり」と判断してしまいます。
(従来コードのままだと、IDFAを取得しないフローに流れてしまう)
懸念
多くのアプリが、isAdvertisingTrackingEnabledをチェックせずにIDFAを取得するフローは、審査上取っていないと思います。
このままの仕様でリリースされた場合、
せっかくIDFA許諾必須化が来年初旬まで延期されたにも関わらず
この挙動に対応していないアプリからは「IDFAが取得出来ない」状況になる可能性が高いです。
対策
この仕様への対策として
AppTrackingTransparencyの許諾ステータスをチェック
↓
許諾済み以外の場合、まずIDFAを取りにいき
↓
返値がゼロ以外であれば、そのままIDFA使用
と言ったパターンなどが考えられます。
例えば
func isAvailableIDFA() -> Bool {
if #available(iOS 14.0, *) {
if ATTrackingManager.trackingAuthorizationStatus == .authorized {
return true
}else{
// .authorized以外
// 有効なIDFAか?
return !isZeroIDFA()
}
}else{
// iOS13以下
return ASIdentifierManager.shared().isAdvertisingTrackingEnabled
}
}
func isZeroIDFA() -> Bool {
return (ASIdentifierManager.shared().advertisingIdentifier.uuidString == UUID(uuid: (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)).uuidString)
}
ただ、この辺りの最終的な挙動はもうすぐ出るであろうGM版で、どうなるかまだわかりません。
引き続き、チェックしていきたいと思います。
参考
https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614148-isadvertisingtrackingenabled
https://developer.apple.com/documentation/apptrackingtransparency