Privacy Manifests対応

# これは何？

- Xcode15より新しいプライバシーに関する基準が新設された
    - 目的はざっくり、App Storeでユーザーに対し利用している情報をさらに明示的にするため
    - プライバシーの強化
- 2023年秋から警告メールの送付が開始され、2024年春(2024/05/01)以降は対応必須となる
    - これに対応しないと審査でリジェクトされる
    - 新規だけではなく、既存アプリもアップデートをかける際には対応が必要
- [やること](https://qiita.com/K0uhe1D/items/bb3b5818ae54069118a4#%E3%82%84%E3%82%8B%E3%81%93%E3%81%A8) に記載する3つの項目に対して該当する場合は対応が必要

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


# 前提

- Privacy Manifestsに対してAppleの方でも対応の遅れがあり、現時点で正しい対応方法が明確ではない箇所が多々あります
- その為一度審査に出して警告メールを元に作業を進めることになります
    - TestFlightの外部向けで審査をかけると警告メールを手軽に受け取れます
    - 一度審査にかけてPrivacy Manifests対応後に再審査かけたい場合は、アプリのバージョンを変更することで審査されます
- TestFlightの外部テストを設定して審査にかける

https://developer.apple.com/jp/help/app-store-connect/test-a-beta-version/testflight-overview/

- [現時点での懸念事項](https://qiita.com/K0uhe1D/items/bb3b5818ae54069118a4#%E7%8F%BE%E6%99%82%E7%82%B9%E3%81%A7%E3%81%AE%E6%87%B8%E5%BF%B5%E4%BA%8B%E9%A0%85)
- Unityエンジニア目線で調査を行っています
- 理解や認識に間違いがある場合、コメントや[X(旧Twitter)](https://twitter.com/k0uhe1___)などでこっそり教えてください🙇‍♂️

# やること

1. [Privacy-impacting SDKs](https://qiita.com/K0uhe1D/items/bb3b5818ae54069118a4#required-reason-apis) に該当するSDKを利用していないか調査
    → 利用していたら対応済みのバージョンにアプデする


2. [Required reason APIs](https://qiita.com/K0uhe1D/items/bb3b5818ae54069118a4#required-reason-apis) に該当するAPIを利用する実装 or SDKがないかスキャナーを使って調査
    → 利用していたら対応済みのバージョンにアプデする or PrivacyInfo.xcprivacyに利用しているapiを記述する
    
3. [Tracking domains](https://qiita.com/K0uhe1D/items/bb3b5818ae54069118a4#tracking-domains) に該当するアクセスがないかXcodeのInstrumentsを使って調査
    → 利用していたら対応済みのバージョンにアプデする or PrivacyInfo.xcprivacyにドメインを記述する
    

## Privacy-impacting SDKs

プライバシーへの影響が大きいSDKをAppleが特定したので、そのSDKを使う時はPrivacy Manifestsファイルが必要に
XCFrameworksみたいなバイナリでSDKを追加している場合は署名(codesignin)が必須に
※cocoapodsなどで追加する場合は必要ない理解でいます([参考](https://github.com/firebase/firebase-unity-sdk/issues/980#issuecomment-2039951713))

### 1. 対応が必要かの判別

[Upcoming third-party SDK requirements](https://developer.apple.com/support/third-party-SDK-requirements/)にリストアップされているSDKを利用していないか確認する

- Firebase
- Protobuf
- AppAuth
- GoogleSignIn
    ※ 1部を記載しています

https://developer.apple.com/support/third-party-SDK-requirements/

### 2. 対応が必要な人

- SDKの開発者
- Privacy-impacting SDKsを利用しているアプリの開発者

### 3. 対応方法

1. SDKの開発者
    - バイナリ形式ならコード署名をする
    - PrivacyInfo.xcprivacyを作成する
2. アプリの開発者
    - 対応が済んだバージョンにアップデートする

## Required reason APIs

既存API(NSFileSystemFreeSizeとか)にRequired reason APIと呼ばれる新たなカテゴリが追加され、Required reason APIを使う時はPrivacyInfo.xcprivacyファイルに理由を記載する

### 1. 対応が必要かの判別

[Describing use of required reason API](https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api)に記載されているAPIを利用しているか、[ios_privacy_manifest_scanner](https://github.com/techinpark/ios_privacy_manifest_scanner/tree/master)などを使い該当するAPIの利用がないか確認する

### 2. 対応が必要な人

- アプリ開発者

### 3. 対応方法

1. Required reason APIが利用しているライブラリ内にあった場合
    - ライブラリ/SDKの作者に連絡してPrivacyInfo.xcprivacyファイルを追加してもらう
    - 対応が済んだバージョンにアップデートする
    - 実際にPrivacyInfo.xcprivacyファイルが追加されている事例 [PrivacyInfo.xcprivacyファイルの追加事例](https://github.com/line/line-sdk-unity/pull/66/files#diff-85baf692ad69000dd995a4b3b320143b9859dd493b9e3f6d5b53343ceba25829R1)
2. Required reason APIが開発しているプロジェクト内にあった場合
    - 現時点では正しい対応方針が不明確だが、おそらく独自にPrivacyInfo.xcprivacyを作成してフォーマットに沿って記述を追加することで対応が完了する見通しにあります

## Tracking domains

アプリ内でユーザーのトラッキングを行っている場合、PrivacyInfo.xcprivacyファイルにトラッキングしているドメインを記載する必要がある

### 1. 対応が必要かの判別

XcodeのInstruments(Network)でアプリをプロファイリングして該当するドメインがないか調査する。

該当する場合、Points of Interest instrumentに記録される

手順は公式ドキュメントがわかりやすい[Detecting when your app contacts domains that may be profiling users](https://developer.apple.com/documentation/xcode/detecting-when-your-app-contacts-domains-that-may-be-profiling-users)

トラッキングの定義については[ここ](https://developer.apple.com/app-store/app-privacy-details/#user-tracking)に書いてある

### 2. 対応が必要な人

- アプリ開発者
- SDKの開発者

### 3. 対応方法

1. Tracking domainsが利用しているライブラリ内にあった場合
    - ライブラリ/SDKの作者に連絡してPrivacyInfo.xcprivacyファイルを追加して該当するドメインの記載をしてもらう
    - 対応が済んだバージョンにアップデートする
    - 実際にTracking domainsの対応がされているPrivacyInfo.xcprivacyファイル [Tracking domainsの対応事例](https://github.com/adjust/ios_sdk/blob/master/Adjust/PrivacyInfo.xcprivacy#L5-L16)
2. Tracking domainsが開発しているプロジェクト内にあった場合
    - 現時点では正しい対応方針が不明確だが、おそらく独自にPrivacyInfo.xcprivacyを作成してフォーマットに沿って記述を追加することで対応が完了する

# 現時点での懸念事項
- SDK側でPrivacy Manifestsファイルが正しく配置されていても、アプリ本体側のPrivacy ManifestsファイルにAPIの記載がないと審査で意図通り検出されず未対応の警告メールが届いてしまう事例が報告されています

https://x.com/_mono/status/1775752714821193901

https://github.com/firebase/firebase-ios-sdk/issues/12557#issuecomment-2057319060
        
- Instrumentsにおいて、Tracking domainsの誤検出が報告されています [FirebaseCrashlyticsでのTracking domains誤検出に関するissue](https://github.com/firebase/firebase-ios-sdk/issues/12404)

https://github.com/firebase/firebase-ios-sdk/issues/12404


- そもそも審査に出しても警告メールが届かない事例がいくつか報告されています

# 代表的なSDKの対応状況

- Firebase(firebase-unity-sdk)
    - コード署名を含んだバージョンの対応がまだ
        - [firebase-ios-sdkでは対応済み](https://github.com/firebase/firebase-ios-sdk/releases/tag/10.24.0)なので取り込みバージョンがリリースされるの待つ
        - [いつになるって聞いてるissue](https://github.com/firebase/firebase-unity-sdk/issues/990)
    - PrivacyInfo.xcprivacyの追加はfirebase-unity-sdkでもすでにリリース済み
        - [v11.8.0以降](https://github.com/firebase/firebase-unity-sdk/releases)にアップデートする
- LINE-SDK
    - [対応ずみ](https://github.com/line/line-sdk-unity/pull/66)
    - [v1.3.3以降](https://github.com/line/line-sdk-unity/releases)にアップデートする
- Bugsnag
    - [対応ずみ](https://github.com/bugsnag/bugsnag-unity/pull/768)
    - [v7.7.0以降](https://github.com/bugsnag/bugsnag-unity/releases)にアップデートする
- UnityFramework
    - UnityFrameworkのコード署名はAppleとUnityで話し合って対応しなくて良くなったらしい

https://forum.unity.com/threads/apple-privacy-manifest-updates-for-unity-engine.1529026/#post-9671579

- なのでプライバシーマニフェストファイルの処理がサポートされるようになった以下のバージョンにアップデートするだけで良い
    - [2023.2.13](unityhub://2023.2.13)
    - [2022.3.21](unityhub://2022.3.21)
    - [2021.3.36](unityhub://2021.3.36)
        

# Reference
### Apple公式ドキュメント
- [Privacy manifest files](https://developer.apple.com/documentation/bundleresources/privacy_manifest_files)
    - Appleのプライバシーマニフェストファイルに関する公式ドキュメント。
- [Describing data use in privacy manifests](https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests)
    - プライバシーマニフェストでのデータ使用の説明についての公式ドキュメント。
- [Upcoming third-party SDK requirements](https://developer.apple.com/support/third-party-SDK-requirements/)
    - 近日中に導入されるサードパーティSDKの要件についての公式ドキュメント。[Privacy-impacting SDKs](https://qiita.com/K0uhe1D/items/bb3b5818ae54069118a4#privacy-impacting-sdks)の対応が必要です。
- [Describing use of required reason API](https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api)
    - 必要な理由APIの使用の説明についての公式ドキュメント。[Required reason APIs](https://qiita.com/K0uhe1D/items/bb3b5818ae54069118a4#required-reason-apis)の対応が必要です。
- [Detecting when your app contacts domains that may be profiling users](https://developer.apple.com/documentation/xcode/detecting-when-your-app-contacts-domains-that-may-be-profiling-users)
    - アプリがユーザープロファイリングの可能性があるドメインに接触したときの検出方法についての公式ドキュメント。
- [App privacy details on the App Store/Tracking](https://developer.apple.com/app-store/app-privacy-details/#user-tracking)
    - App Storeのアプリプライバシー詳細/トラッキングについての公式ドキュメント。
### Unity公式ドキュメント
- [Apple のプライバシー マニフェスト ポリシーの要件](https://docs.unity3d.com/2022.3/Documentation/Manual/apple-privacy-manifest-policy.html)
    - Unityのプライバシーマニフェストに関するドキュメントと、UnityのC# .NetフレームワークAPIでどの部分が該当するかの説明。
- [Apple privacy manifest updates for Unity Engine](https://forum.unity.com/threads/apple-privacy-manifest-updates-for-unity-engine.1529026/#post-9671579)
    - UnityFrameworkのコード署名について、AppleとUnityが話し合い、対応が不要になったとの情報。
### SDKの対応状況
- [Add privacy manifest #200](https://github.com/line/line-sdk-ios-swift/pull/200)
    - line-sdk-ios-swiftで実際にプライバシーマニフェスト対応が行われたときのPR。
- [Adjust/PrivacyInfo.xcprivacy](https://github.com/adjust/ios_sdk/blob/master/Adjust/PrivacyInfo.xcprivacy#L5-L16)
    - Tracking domainsの対応事例。
- PrivacyInfo.xcprivacyファイルの追加事例
    - [line/line-sdk-unity](https://github.com/line/line-sdk-unity/pull/66/files#diff-85baf692ad69000dd995a4b3b320143b9859dd493b9e3f6d5b53343ceba25829R1)
- FirebaseCrashlyticsでのTracking domainsの検知に関するissue
    - [iOS NSPrivacyTrackingDomains](https://github.com/firebase/firebase-ios-sdk/issues/12404)
### その他
- [UnityアプリでのApple Privacy Manifests対応まわりについて](https://blog.yucchiy.com/2024/01/apple-privacy-manifests-unity/)
    - [@yucchiy_さん](https://twitter.com/yucchiy_)がまとめているドキュメントが非常にわかりやすいです。いつもありがとうございます。
    - UnityアプリでのApple Privacy Manifests対応についての詳細なガイド。
- [プライバシーマニフェスト対応　Appleの審査が通ったのでまとめてみた](https://techblog.openwork.co.jp/entry/ios-privacymanifest)
    - 実際にプライバシーマニフェスト対応を行い、Appleの審査を通過した経験を共有したブログ記事。
- [[WWDC23] Xcode15からPrivacy Manifestsが導入](https://qiita.com/YokohamaHori/items/f54e9f2c74f7f6bfe268)
    - WWDC23で発表されたXcode15からのPrivacy Manifests導入についてのQiitaの記事。
- [TestFlight の概要](https://developer.apple.com/jp/help/app-store-connect/test-a-beta-version/testflight-overview/)
    - TestFlightの外部テストを設定し、審査にかける方法についての公式ドキュメント。