iOS14でエンジニアがすべきIDFA対応

# はじめに

IDFAの許可リクエストの表示タイミング・内容の具体例については[こちら](https://qiita.com/koooootake/items/20f71910a8854b27a88a)の記事を参考にしてください🙋‍♂️

2020年9月にリリースされたiOS14から、
iOS13まで端末単位で設定していたIDFAの取得許可（追跡型広告制限）が
端末兼**アプリ単位**の取得許可に変更され、
各アプリにて、通知や位置情報許可のように、ユーザに許可を取る必要がでてきます。

iOS13
![iOS13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119392/a7dae1ab-953e-7d59-67a0-2e3e8ec652fc.jpeg) 
↓
iOS14
![スクリーンショット 2020-09-24 15.07.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119392/fa8a10ba-08a4-e374-1bfa-28041dbc0bc1.png)

IDFAとは？iOS13と比較した詳しい挙動の違いは？は
こちらの素晴らしい記事にまとまっていたので割愛させていただきます。
https://qiita.com/yofuru/items/213b88b85553631204e4

重要なのは**iOS14ではIDFAをデフォルトで取得できなくなることです**。

本記事ではエンジニアがiOS14でIDFAを取得するために対応する必要がある実作業をまとめます。

# 1.frameworkの追加
IDFAの使用用途は、主に広告やトラッキングのためと考えられるため既に導入済みであることが多いかと思いますが、
`AdSupport.framework`
を追加します。
そしてiOS14から追加された、
`AppTrackingTransparency.framework`
を追加します。

公式リファレンス: https://developer.apple.com/documentation/apptrackingtransparency

# 2.info.plistへ説明の追加
`Privacy - Tracking Usage Description`
をKeyとしてValueにユーザにAlertを出した時に表示される文言を追加します。

ここでの文言は非常に重要になってくると考えられます。
**ATTrackingManager.requestTrackingAuthorizationを利用してAlertを表示できるのは1度きりです**
通知や位置や写真の時と一緒ですね。

AlertのタイトルはApple側が表示するもので、日本語だとこう表示されました。
（アプリ名マンガボックス）
![スクリーンショット 2020-09-24 14.34.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119392/b1b425f7-b494-2d34-86d9-d7bfd25bdb08.png)

🤔🤔🤔

一般ユーザはなんぞや🤔🤔🤔
って感じだと思う。
誰も許可したくならない…

info.plistの記述はAlertのメッセージ部分に表示されます。
`メッセージに表示されている'表示する広告を適切に選択するために使用します'はじんむが仮で考えた文章`
こちらを許可していただければ、関連性の高い広告を配信することができるなど
**許可するメリットを伝える**ことが重要かと思います。

また、info.plistの文言はAppleの審査の目が厳しい箇所でもあり、
Appleレビューガイドラインにも下記が追加されました

```
3.2.2 許容されない行為（vi）
　Appの機能やコンテンツへのアクセス、金銭その他の報酬を受け取るために行ってはいけないことに
　「追跡の有効化(enable tracking)」が追加
```
そのため、オンにしたら報酬あげるよ！という文言はリジェクトされるので注意してください。
強制させるような文言や、用途が何も伝わらない文言はやめましょう。

#3.Alertを表示するコードの追加
必要なタイミングで許可情報を取得し、Alertを表示するコードを追加しましょう。

```swift:ViewController.swift
import UIKit
import AdSupport
import AppTrackingTransparency

class ViewController: UIViewController {

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        if #available(iOS 14, *) {
            switch ATTrackingManager.trackingAuthorizationStatus {
            case .authorized:
                print("Allow Tracking")
                print("IDFA: \(ASIdentifierManager.shared().advertisingIdentifier)")
            case .denied:
                print("😭拒否")
            case .restricted:
                print("🥺制限")
            case .notDetermined:
                showRequestTrackingAuthorizationAlert()
            @unknown default:
                fatalError()
            }
        } else {// iOS14未満
            if ASIdentifierManager.shared().isAdvertisingTrackingEnabled {
                print("Allow Tracking")
                print("IDFA: \(ASIdentifierManager.shared().advertisingIdentifier)")
            } else {
                print("🥺制限")
            }
        }
    }

    ///Alert表示
    private func showRequestTrackingAuthorizationAlert() {
        if #available(iOS 14, *) {
            ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
                switch status {
                case .authorized:
                    print("🎉")
                    //IDFA取得
                    print("IDFA: \(ASIdentifierManager.shared().advertisingIdentifier)")
                case .denied, .restricted, .notDetermined:
                    print("😭")
                @unknown default:
                    fatalError()
                }
            })
        }
    }
}
```

先述のように、requestTrackingAuthorizationを利用してAlertを表示できるのは1度きりです。そのため、表示するタイミングが非常に重要になってきます。

なお、iOS13までIDFAを取得できるか利用していた
`ASIdentifierManager の isAdvertisingTrackingEnabled`
はiOS14からDeprecatedになります。
https://developer.apple.com/documentation/adsupport/asidentifiermanager
iOS14からこちらの値が**常にfalseになる**ため、既存の実装には注意が必要です。

# 注意点
冒頭で説明した通り、iOS14からは、**端末兼アプリ単位**の追跡許可設定になります。

**端末単位で拒否されている**と、requestTrackingAuthorizationしていなくても、trackingAuthorizationStatusがdeniedで返ってきます、**Alertを表示することさえ許されません**、無慈悲😇

端末の設定は
`設定 > プライバシー > トラッキング > Appからのトラッキングを許可（ON/OFF）`
から設定できます。
各アプリの設定もここからできます。

また、もう一つ似た設定に
`設定 > プライバシー > Appleの広告 > パーソナライズされた広告（ON/OFF）`

![スクリーンショット 2020-09-24 14.41.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119392/c8169298-04ec-4b78-0120-5005d8599f63.png)

があります。

こちらは試したところ、パーソナライズされた広告がOFFの時でもtrackingAuthorizationStatusが.authorizedで返ってきてIDFAが取れていました
説明を読むとこちらは、App StoreやApple News、株価のターゲティングが無効になるそうです。

# おわりに
この他に開発者が意識するべきことは、利用しているSDKがIDFAを利用しているかを把握し
各社に対応を伺うことです。

参考にAdjust様がものすごく丁重に対応すべき項目をまとめてくださっていたので共有します。
[Adjust: iOS14の変更に向けての準備と対策](https://www.adjust.com/ja/blog/getting-your-company-ready-for-ios-14/?utm_source=email&utm_channel=0&utm_campaign=ja-occasional-gettingreadyforios14-q32020)

また、いくつかの広告会社さんからSDKのアップデート予定を告知していただきました🙇‍♂️

ユーザさんにメリットを伝えつつセキュリティを担保しつつ
サービスの目的も達成しうる対応をしていきましょう💪