[Cocoa][Swift]iOS 14 でのトラッキングのオプトインについて

<p>広告を使って Android と iOS のモバイルアプリを宣伝する場合、広告のクリックがアプリのインストールとアプリ内操作の獲得にどの程度貢献しているかを把握することが重要だ。</p>

<p>iOS の IDFA（広告ID）は、この情報を計測するために利用されている。</p>

<p>iOS14のトラッキングは、以下の種類がある。</p>

<ul>
<li>SKAdNetwork (SKA)
    <ul>
    <li>ユーザの個人情報を利用しない。</li>
    <li>アプリのインストールと特定のキャンペーンを関連付けるためのもの。</li>
    </ul>
</li>
<li>AppTrackingTransparency (ATT) フレームワーク
    <ul>
    <li>IDFAを扱うためのもの。</li>
    </ul>
</li>
</ul>

<p>iOS14から、ASIdentifierManager の isAdvertisingTrackingEnabled は非推奨。</p>

<pre><code>ASIdentifierManager *identifierManager = [ASIdentifierManager sharedManager];
if ([identifierManager isAdvertisingTrackingEnabled]) {
    NSLog(@"[idfa] isAdvertisingTrackingEnabled enabled");
} else {
    NSLog(@"[idfa] isAdvertisingTrackingEnabled disabled");
}
NSString *idfa = identifierManager.advertisingIdentifier.UUIDString;
NSLog(@"[idfa] %@", idfa);
</code></pre>

<p>コードの互換性は保たれていて、iOS14では isAdvertisingTrackingEnabled はfalseを返す。</p>

<p>iOS14では、設定のプライバシー > 広告 画面がなくなった。</p>

<img width="50%" alt="広告" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12540/3edb4cd1-ecaf-8df9-284a-7aca5ab9e652.png">

<p>システムが表示するダイアログの文言はInfo.plistで設定する。</p>

<img width="50%" alt="ダイアログ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12540/26342d7d-8352-6c0d-c185-85d303a7cce9.png">

<pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
&lt;plist version="1.0"&gt;
&lt;dict&gt;
	&lt;key&gt;NSUserTrackingUsageDescription&lt;/key&gt;
	&lt;string&gt;広告トラッキングしますよ。&lt;/string&gt;
&lt;/dict&gt;
&lt;/plist&gt;
</code></pre>

<p>ユーザに許可を得るコードは以下のとおり。</p>

<pre><code> if (@available(iOS 14, *)) {
    [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:         ^(ATTrackingManagerAuthorizationStatus status) {
        NSLog(@"in requestTrackingAuthorizationWithCompletionHandler");
        if (status == ATTrackingManagerAuthorizationStatusAuthorized) {
            NSLog(@"[requestTrackingAuthorization] authorized");
            NSString *idfa = identifierManager.advertisingIdentifier.UUIDString;
            NSLog(@"[idfa] %@", idfa);
        } else if (status == ATTrackingManagerAuthorizationStatusDenied) {
            NSLog(@"[requestTrackingAuthorization] denied");
        } else if (status == ATTrackingManagerAuthorizationStatusRestricted) {
            NSLog(@"[requestTrackingAuthorization] restricted");
        } else {
            NSLog(@"[requestTrackingAuthorization] notDetermined");
        }
   }];
} else {
    // Fallback on earlier versions
}
</code></pre>

<p>確認ダイアログは一度しか表示しないが、設定は後から有効にできる。その画面を表示するコードは以下のとおり。</p>

<pre><code> NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
</code></pre>

<img width="50%" alt="アプリ設定" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12540/29851783-2b8b-e2d3-23e8-2a7a7a1df864.png">
<img width="50%" alt="設定" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12540/06902ca9-e993-00fb-dec5-7722737a521e.png">

【関連情報】
<a href="https://qiita.com/advent-calendar/2020/cocoa">Cocoa Advent Calendar 2020</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />