iOS14で、IDFAオプトインダイアログを出してみる



#### 追記：iOS14のIDFAオプトアウト来年まで延期する事になったようです:frowning2:[→詳細](https://techcrunch.com/2020/09/03/apple-delay-ios-14-privacy-ad-tracking/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+Techcrunch+%28TechCrunch%29&guccounter=1&guce_referrer=aHR0cHM6Ly90LmNvL3RjSzNXeGpIT3M_YW1wPTE&guce_referrer_sig=AQAAAEHUAYdLt8Er9ZC7mGKoYV4EE_eCNuJ6M-_VRvZ9ix9ZQ0GjvKxaGSa1HhHQoiLwFOBm-wpCx0po8XNdOGsoFRWbehVIYCYHmabcIPv7Z_JINEi7NsAXGC3sq24tFh4-AtjtAZSLeN5_Qrcf_SwKA4g3Gk1WfGuBTm9EhnMYogBB)

---

現時点で、iOS14から必須のIDFAオプトインダイアログを出す方法に絞ってメモ。

IDFAや業界について詳しく解説して頂いている記事は他に沢山ありますので、
ここでは純粋にIDFAオプトインを表示する点について書きます。

## 1. まず、iOS14のシミュレータが動くxcode12を入れるため、macOSのバージョンを10.15.4以上にする必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37406/ee4fe000-f78e-6cb8-2649-c7601a07e485.png)

## 2. 続いてxcode12のベータ版をダウンロード（ここではbeta4をダウンロード）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37406/8ef8fe22-a064-a414-e81c-d373637e8a97.png)

10G以上ありますので、ダウンロード時間と、macの容量に余裕をもたせる必要あります。

## 3. IDFAオプトインダイアログを表示するためのサンプルコードと、info.plistを記載

xcode12betaで新規アプリ作成等で、UIViewControllerを用意し、ダイアログ表示のスクリプトを記載

### `ATTrackingManager.requestTrackingAuthorization`を呼び出す

```swift:UIViewController.swift
//
//  ViewController.swift
//  IDFA-optin
//
//  Created by hoge on 2020/08/16.
//

import UIKit

import AdSupport
import AppTrackingTransparency

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
                    switch status {
                    case .authorized:
                        print("authorized \(ASIdentifierManager.shared().advertisingIdentifier)")
                    case .denied:
                        print("denied")
                    case .restricted:
                        print("restricted")
                    case .notDetermined:
                         print("notDetermined")
                    @unknown default:
                        fatalError()
                    }
                })
    }
}
```

[各ステータスについて](https://developer.apple.com/documentation/apptrackingtransparency/attrackingmanager/authorizationstatus)

### info.plistにダイアログに表示する説明を、`NSUserTrackingUsageDescription`を追記

```plist:info.plist
<key>NSUserTrackingUsageDescription</key>
    <string>info.plistの内容!hogehogetest
        ※説明書き等〜〜〜〜〜〜〜〜
        〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
        〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
        〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
        〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
        abcdefghijklmnopqrstuvwxyz
    </string>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37406/2581e6ed-7feb-6af2-643f-406dc9c319eb.png)

iOS14のシミュレータが選択されているか確認し、実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37406/059b022e-0cf1-031f-6f1f-e5b84a965087.png)


### トラブルシューティング

下記エラーでクラッシュしたら、info.plistに`NSUserTrackingUsageDescription`が正しく設定されていない

```
2020-08-08 12:07:34.121113+0900 UIActivityViewSample[5854:133563] [access] This app has crashed because it attempted to access privacy-sensitive data without a usage description.  The app's Info.plist must contain an NSUserTrackingUsageDescription key with a string value explaining to the user how the app uses this data.
```

## 参考にさせて頂いたサイトさま🙇

https://qiita.com/koooootake/items/e467be2c4f63ff605841
https://qiita.com/yofuru/items/213b88b85553631204e4
https://qiita.com/bosteri_bon/items/d84cd031784c6a1d3eff