Appleのプライバシーマニフェスト対応

# 
大きく分けると、以下の二つの対応が必要

- 開発しているアプリ、またはサードSDKで収集しているデータの説明
- 開発しているアプリ、またはサードSDKで使用しているAPIの説明

用語を整理すると以下のようになる。
- 開発しているアプリ
これはそのままの意味で、実装してリリースするアプリのこと
- サードパーティSDK
これはライブラリのことで、例えば、Alamofire、FirebaseCrashlyticsなど
- 収集しているデータ
開発しているアプリ、サードパーティSDKで収集しているデータのこと。
データの種類は、Appleがリスト化しているので、リストに当てはまるデータを収集しているかどうかを判断していく形になる。
- 使用しているAPI
Appleの[ドキュメント](https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api)だと、`required reason API`と書かれています。良い日本語訳がわかりませんので、使用しているAPIと表現しています。
こちらも収集しているデータと同じく、どのAPIが該当するかAppleがリスト化しています。
内容を見ると、Appleが提供している[Foundation](https://developer.apple.com/documentation/foundation)フレームワークの特定のメソッドが該当するようです。

https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api#4278393

# 対応手順
## ファイルの作成
XCodeのFileからApp Privacyファイルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/7792550c-b635-67e9-d365-84753807671f.png)

## トップレベルの項目を追加
ファイルのトップレベルの設定項目（大項目）は以下の四つです。
- NSPrivacyTracking
- NSPrivacyTrackingDomains
- NSPrivacyCollectedDataTypes
- NSPrivacyAccessedAPITypes

App Privacyファイルの`App Privacy Configuration`に追加します。
追加ボタンを押すと、四つが選択できるようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/36c67b0a-b4f7-6c4a-3105-f033dcc14488.png)


### NSPrivacyTracking

アプリまたはサードパーティSDKが、`App Tracking Transparency`フレームワークで定義されたトラッキングのためにデータを使用するかを設定する項目となります。

...と言われても難しいですが、簡単に判断する材料としては、現在ATTを実装してないアプリに関してはNO、ATTを実装しているアプリに関してはYESで問題なさそうです。
（もし、ATTを実装しないとダメなのに、ATTを実装してない場合は審査が通らないはずなので）

ATTについては下記の記事がわかりやすかったです。

https://zenn.dev/toshinobu/articles/0f7d4eebcf1f80

公式は以下。

https://developer.apple.com/app-store/user-privacy-and-data-use/
<!--
App Storeは、ユーザがアプリケーションをダウンロードする前に、そのアプリケーションのプライバシー慣行についてよりよく理解できるよう支援します。各アプリの製品ページでは、アプリが収集する可能性のあるデータの種類や、その情報がユーザを追跡するために使用されるかどうか、ユーザのIDやデバイスにリンクされるかどうかを確認できます。

新しいアプリケーションやアプリケーションのアップデートを提出するには、App Store Connectでプライバシー慣行に関する情報を提供する必要があります。広告や分析SDKなど、サードパーティのコードを使用する場合は、サードパーティのコードが収集するデータの種類、データの使用方法、データを使用してユーザを追跡するかどうかを説明する必要があります

iOS 14.5、iPadOS 14.5、およびtvOS 14.5以降では、ユーザーを追跡したり、デバイスの広告識別子にアクセスしたりするには、AppTrackingTransparency（ATT）フレームワークを通じてユーザーの許可を得る必要があります。トラッキングとは、貴社のアプリから収集したユーザーまたはデバイスのデータを、ターゲット広告または広告測定の目的で、他社のアプリ、ウェブサイト、またはオフラインのプロパティから収集したユーザーまたはデバイスのデータとリンクさせる行為を指します。また、トラッキングとは、ユーザーまたはデバイスのデータをデータブローカーと共有することを指します。

トラッキングの例には以下が含まれますが、これらに限定されるものではありません：

他社が所有するアプリやウェブサイトから収集したユーザーデータに基づいて、貴社のアプリにターゲット広告を表示すること。
デバイスの位置情報や電子メールリストをデータブローカーと共有すること。
電子メール、広告ID、またはその他のIDのリストをサードパーティの広告ネットワークと共有し、その情報を使用して、そのユーザーを他の開発者のアプリでリターゲティングしたり、類似のユーザーを検索したりすること。
広告のターゲティングや広告効率の測定のために、自分のアプリのユーザーデータと他の開発者のアプリのユーザーデータを組み合わせるサードパーティのSDKを自分のアプリに配置すること（これらの目的でSDKを使用しない場合でも）。たとえば、お客様のアプリから収集したデータを再利用して、他の開発者のアプリでターゲット広告を可能にする分析SDKを使用すること。

以下のユースケースはトラッキングとはみなされず、AppTrackingTransparencyフレームワークによるユーザーの許可は必要ありません：

アプリからのユーザーまたはデバイスのデータが、ユーザーのデバイス上のみで第三者のデータにリンクされ、ユーザーまたはデバイスを特定できるような方法でデバイス外に送信されない場合。
データを共有するデータブローカーが、不正検知、不正防止、またはセキュリティ目的のみにデータを使用する場合。例えば、クレジットカード詐欺を防止するためだけにデータブローカーを使用する場合。
データブローカーが消費者報告機関であり、(1)消費者の信用度に関する報告、または(2)与信判断を行うという特定の目的のために消費者の信用度に関する情報を取得する目的でデータが共有される場合。

他社のSDKを統合しました。その会社による私のアプリのユーザーのデータ収集と追跡は私の責任ですか？
はい。開発者は、アプリに含まれるすべてのコードに責任を負います。あなたのアプリで使用されている、あなたが書いていないコードのデータ収集と追跡の慣行について不明な場合は、SDKの開発者に連絡することをお勧めします。

トラッキング」ポリシーが適用される識別子やデータは何ですか？
広告、広告測定、またはデータブローカーとの共有を目的として、お客様のアプリからのデータと第三者からのデータ（お客様のアプリで使用されるSDKを含む）を結合するために使用されるユーザーまたはデバイスレベルの識別子。これには、デバイスの広告識別子、セッションID、指紋ID、およびデバイスグラフ識別子が含まれますが、これらに限定されません。あなたのアプリが上記の目的でこれらの識別子を受信または共有する場合、AppTrackingTransparencyフレームワークを使用してユーザーの同意を得る必要があります。

-->

### NSPrivacyTrackingDomains
[NSPrivacyTracking](#nsprivacytracking)で、NOを選択した場合、必要ないです。
YESを選択した場合、アクセスするドメインを追加する必要があります。
ドメインを追加するとどうなるのか？というと、ユーザーがATTを許可しなかった場合、追加したドメインにアクセスしようとするとエラーのとなるようです。
以下の記事の説明がわかりやすかったです。

https://buildersbox.corp-sansan.com/entry/2024/02/09/173000#NSPrivacyTrackingDomains

### NSPrivacyCollectedDataTypes
https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests#4250555

上記でリストアップされているデータを収集している場合、項目を追加する必要があります。

https://qiita.com/NaoSekig/items/35033ab7debe26648509

項目ごとに設定するのは下記の四つとなります
- Collected Data Type
- Collection Purpose
- Used for Tracking
- Linked to User

#### Collected Data Type
データの種類を設定します。
データの種類は、[一覧](https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests#4250555)があるので、この一覧に当てはまるデータは設定が必要です。
すでにリリースしてるアプリの場合は、AppStoreのページを確認して、以下の部分の情報を設定すれば問題ないと思います。
![スクリーンショット 2024-04-17 13.10.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/d916c3b2-2d37-d38d-fde6-20f7ce25b29c.png)


#### Collection Purpose
追加した項目の使用目的を設定します。
[こちら](https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests#4250556)でリスト化されているものから選択する形となります。
#### Used for Tracking
トラッキング目的にデータを使用しているかを設定します。
[こちら](https://developer.apple.com/app-store/app-privacy-details/#user-tracking)で説明されている内容に該当するかを判断する必要があります。
ざっくりした理解だと、以下のような形となります。（問題があれば、Appleから指摘されると思うので）
- ユーザーID、デバイスID、プロファイルなど、特定のユーザーまたはデバイスとして特定できるデータ
→ YESなら下の項目のうちどちらかに当てはまるなら、YES。NOの場合はNO。
- ターゲット広告、広告測定の目的で第三者データとリンクさせる
- データブローカーと共有する

<!--
「トラッキング」とは、ユーザーID、デバイスID、プロファイルなど、特定のエンドユーザーまたはデバイスについてお客様のアプリから収集したデータを、ターゲット広告または広告測定の目的で第三者データとリンクさせること、または特定のエンドユーザーまたはデバイスについてお客様のアプリから収集したデータをデータブローカーと共有することを指します
「第三者データ」とは、お客様が所有していないアプリ、ウェブサイト、またはオフラインのプロパティから収集された、特定のエンドユーザーまたはデバイスに関するデータを指します。

例：
他社が所有するアプリやウェブサイトから収集したユーザーデータに基づいて、アプリ内でターゲット広告を表示すること。
デバイスの位置情報や電子メールのリストをデータブローカーと共有すること。
電子メール、広告ID、またはその他のIDのリストをサードパーティの広告ネットワークと共有し、その情報を使用して、そのユーザーを他の開発者のアプリで再ターゲティングしたり、類似のユーザーを探したりすること。
広告のターゲティングや広告効率の測定のために、自分のアプリのユーザーデータと他の開発者のアプリのユーザーデータを組み合わせるサードパーティのSDKを自分のアプリに配置すること（これらの目的でSDKを使用しない場合でも）。たとえば、あなたのアプリから収集したデータを再利用して、他の開発者のアプリでターゲット広告を可能にするログインSDKを使用すること。

データがエンドユーザーのデバイス上でのみリンクされ、エンドユーザーまたはデバイスを特定できるような方法でデバイス外に送信されない場合。
データブローカーが、共有されたデータを詐欺の検出や防止、セキュリティ目的のみに使用する場合。
データブローカーが消費者報告機関であり、(1)消費者の信用度に関する報告、または(2)与信判断を行う特定の目的のために消費者の信用度に関する情報を取得する目的で、データがブローカーと共有される場合。
-->

#### Linked to User
個人情報保護法で定義される「個人情報」および「個人データ」は、Linked to Userをtrueに、それ以外はfalseにします。

#### 例
例えば、名前を収集している場合は、下記のように設定していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475427/dfd7768a-2ecc-a339-e313-12d8ce64b475.png)


https://buildersbox.corp-sansan.com/entry/2024/02/09/173000#NSPrivacyCollectedDataTypes

# 使用しているAPI


サードパーティSDKで使用しているデータの説明はサードパーティSDK側で作成する必要があり、私たちが作成する必要はない。

[こちらの方](https://dev.classmethod.jp/author/wada-kenji/)が執筆されている記事で、サードパーティSDKのPrivacy Manifests対応状況を調査した結果があった。
https://dev.classmethod.jp/articles/surveyed-the-status-of-privacy-manifests-support-for-third-party-sdks/

WKNavigationActionPolicy

https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests


https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api

https://dev.classmethod.jp/articles/support-privacy-manifests-for-ios-app/

https://firebase.google.com/support/privacy?hl=ja

https://qiita.com/4q_sano/items/768482e2522c480069c4

https://developer.apple.com/jp/news/?id=3d8a9yyh

https://techblog.openwork.co.jp/entry/ios-privacymanifest

https://support.appsflyer.com/hc/ja/articles/21677433322641-%E3%83%97%E3%83%A9%E3%82%A4%E3%83%90%E3%82%B7%E3%83%BC%E3%83%9E%E3%83%8B%E3%83%95%E3%82%A7%E3%82%B9%E3%83%88