WKWebViewでクロスサイトトラッキングの仕組みを利用できないのはつらいのでITPを無効にしてみる

## はじめに
WKWebViewでWebページ表示するiOSアプリをXcode12でビルドしたら、iOS14で挙動が変わってしまったので
それについて調査したことを書きます！

## Xcode12にしたら何が起こった？
WebViewで表示しているページ内にiframeがあり、他のページを表示させていたのですが、
iOS14でiframe内のページが表示されなくなってしまいました...( ;ω; )

メインフレームとiframeで別々のドメインのページを表示していたのですが、
メインフレームのCookieを利用したiframeのページのリクエストができなくなってしまったようでした。

![img01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103695/82f899e5-76e5-5063-4b64-f3f2f6760cd1.png)　　![img02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103695/0c794680-2656-2bdc-bc51-2b7cfa2760fb.png)
※ イメージ内のURLはサンプルです

## 影響があるバージョンは？
Xcode11.7でipaを作って、iOS14にインストールした場合は問題ありませんでした。
また、Xcode12でビルドした場合も、iOS14未満では問題ありませんでした。

|Xcode バージョン|iOS バージョン|3rd party cookieの使用可否|
|:--:|:--:|:--:|
|11.7|11.x|使用可|
|11.7|12.x|使用可|
|11.7|13.x|使用可|
|11.7|14.x|使用可|
|12.0.1|11.x|使用可|
|12.0.1|12.x|使用可|
|12.0.1|13.x|使用可|
|**12.0.1**|**14.x**|**使用不可**|

**iOS14SDK × iOS14だと、異なるドメインのCookieをiframeでセットできないみたいでした。**
（Xcode 12.0.1以降のバージョンやβ版などでもいくつかのパターン試してみたのですが、変わらずでした。）

## iOS14からITPがデフォルトで有効になっている
ここから異なるドメインのCookieをiframeでセットできない原因についてです。

ITP（Intelligent Tracking Prevention）については、他の記事などでも詳しく書かれているものがあるので詳細は省きますが、
ユーザーのプライバシー保護を目的として、トラッキングを防止する機能です。クロスサイトトラッキングを制限するものです。

iOS14からはITPがデフォルトで有効になるようでした。
以下、 https://planet.webkit.org/ より引用
> **Intelligent Tracking Prevention in WKWebView**
Additionally in iOS 14.0 and macOS Big Sur, Intelligent Tracking Prevention (ITP), is enabled by default in all WKWebView applications. To learn more about how ITP protects users against web tracking, checkout this documentation on the topic.
> 
> In some extreme cases, users might need to disable ITP protections, for example when relying on web content outside of the app developer’s control. Applications can signal the need to allow users to disable ITP by adding a Purpose String for the key NSCrossWebsiteTrackingUsageDescription to the app’s Info.plist. When present, this key causes the application’s Settings screen to display a user control to disable ITP. The setting cannot be read or changed through API calls.
> 
> Note that applications taking the new Default Web Browser entitlement always have a user control in Settings to disable ITP, and don’t need to specify the NSCrossWebsiteTrackingUsageDescription key in their Info.plist.

Google翻訳に頼って、要約すると、、、

- iOS14.0およびmacOSBig Surでは、ITPがすべてのWKWebViewアプリケーションでデフォルトで有効になっている。

- アプリ開発者の制御の及ばないWebコンテンツに依存している場合は、ユーザーはITP保護を無効にする必要がある。

- アプリケーションは、NSCrossWebsiteTrackingUsageDescriptionキーをInfo.plistに追加し、目的を記載することで、ユーザーがITPを無効にできるようになる。
このキーが存在する場合、設定アプリ > 対象アプリに「Webサイト越えトラッキングを許可」のスイッチが表示される。
**API呼び出しを介して設定を読み取ったり変更したりすることはできない。**

- デフォルトWebブラウザの資格を取得したアプリの場合は、Info.plistにNSCrossWebsiteTrackingUsageDescriptionキーを追加する必要なく、設定アプリに「Webサイト越えトラッキングを許可」のスイッチが表示される。

## ITPを無効にする機能を用意する
Info.plistに必要なキーと無効にする理由を記載すれば、ITPを無効にするスイッチを表示させることはできそうだけど、
アプリ側からITPの有効/無効の状態を取得することや変更させることはできなそう...( ;ω; )

ですが、何も対応しないわけにはいかないので、
とりあえず、Info.plistに`NSCrossWebsiteTrackingUsageDescription`キーを追加してみました。

```
<key>NSCrossWebsiteTrackingUsageDescription</key>
<string>XXを表示するために使用します。</string>
```

ビルドして、アプリを起動してみると、設定アプリに項目が表示されました！
![img03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103695/125d94fe-0917-58a4-ae7b-b70c68840a1e.png)

デフォルトではスイッチがOFF（クロスサイトトラッキングを許可しない設定）になっていますが、
これを**ユーザーがONに切り替えてくれることで、異なるドメインのCookieをiframeでセットできるようになりました！**

## さいごに
業務用のアプリケーションなどであれば、設定アプリのスイッチをONにしてくださいと事前に通達してからアップデートを配布するなど運用でカバーできるかもしれませんが、
ストアにリリースしているアプリではユーザーに設定アプリまで移動して設定を切り替えてもらうのは現実的ではないかなと思います。。。

iOSアプリ側だけで根本解決は厳しそうなので、結局Webコンテンツ側の修正をして、異なるドメインのCookieを使用しないように対応していくしかないかなと思いました。