iOS14のAppTrackingTransparencyに対応するためにやったこと

3 min read読了の目安(約3100字

https://developer.apple.com/jp/app-store/user-privacy-and-data-use/

AppTrackingTransparencyとは

iOS 14.5、iPadOS 14.5、およびtvOS 14.5以降、ユーザーをトラッキングしたり、ユーザーのデバイスの広告識別子にアクセスしたりするには、AppTrackingTransparencyフレームワークを通じてユーザーの許可を得る必要があります。

次のようなダイアログでユーザーがオプトインすることにより有効になります。ダイアログを表示するタイミングとメッセージはアプリ側でコントロールできます。

ユーザーをトラッキングしたり、デバイスの広告識別子にアクセスしたりする許可をリクエストするには、AppTrackingTransparencyフレームワークを使用します。また、ユーザーをトラッキングする理由を説明した目的文字列をシステムプロンプトに記述する必要もあります。

以下は既に広告(AdMob)を表示していたアプリでAppTrackingTransparencyに対応するためにやったことです。

https://apps.apple.com/jp/app/id1541364743

Info.plist

Info.plisにNSUserTrackingUsageDescriptionを追加 (Privacy - Tracking Usage Description)

+       <key>NSUserTrackingUsageDescription</key>
+       <string>「許可」するとお客様に最適化された広告が表示されます</string>

コードの追加

ATTrackingManager.trackingAuthorizationStatus.notDeterminedの場合はオプトインが可能なのでATTrackingManager.requestTrackingAuthorizationを呼び出して同意画面を表示させます。同意画面はアプリインストール後に一度しか表示できないので表示するタイミングを調整した方が良いです。アプリを削除して再インストールすれば再び表示されます。iOSの設定 -> プライバシー -> トラッキング -> Appからのトラッキング要求を許可の状態や各アプリごとのON/OFFの設定によって挙動が変わります。

なお、ATTrackingManagerはiOS14+で使用可能です、古いOSでは使用しません。

@Published var trackingAuthorized: Bool?

func checkTrackingAuthorizationStatus() {
    switch ATTrackingManager.trackingAuthorizationStatus {
    case .notDetermined:
        requestTrackingAuthorization()
    case .restricted:
        updateTrackingAuthorizationStatus(false)
    case .denied:
        updateTrackingAuthorizationStatus(false)
    case .authorized:
        updateTrackingAuthorizationStatus(true)
    @unknown default:
        fatalError()
    }
}

func requestTrackingAuthorization() {
    ATTrackingManager.requestTrackingAuthorization { status in
        switch status {
        case .notDetermined: break
        case .restricted:
            self.updateTrackingAuthorizationStatus(false)
        case .denied:
            self.updateTrackingAuthorizationStatus(false)
        case .authorized:
            self.updateTrackingAuthorizationStatus(true)
        @unknown default:
            fatalError()
        }
    }
}

func updateTrackingAuthorizationStatus(_ b: Bool) {
    GADMobileAds.sharedInstance().start { status in
        self.trackingAuthorized = b
    }
}

AdMobのサイトには以下のようなサンプルコードがあったので初期化コード GADMobileAds.sharedInstance().start() は念の為authorization statusが確定した後に実行するようにしています。

func requestIDFA() {
  ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
    // Tracking authorization completed. Start loading ads here.
    // loadAd()
  })
}

App Store Connect

Appのプライバシーのページでトラッキング目的でデータを収集することを宣言します、トラッキングを宣言しないと警告が表示されます。

AdMobが収集する可能性のあるデータはこちらに記載されています、これを参考にAppのプライバシーページから収集するデータタイプを選択します。

https://developers.google.com/admob/ios/data-disclosure?hl=ja

参考情報

https://developers.google.com/admob/ios/ios14?hl=ja