f4エンジニアブログ

f4samuraiの中の人たちが書いています

Apple Privacy Manifest対応でやるべきことについて

はじめに

みなさんこんにちは。ネイティブエンジニアです。
今回は『Privacy Manifests』対応についてやるべきこと、実際に取り組んでいることを説明いたします。

 

『Privacy Manifests』とは、Appleにより提供されるプライバシー対策のアップデートです。2024年春より実施されることが通達されており、対応しないとアプリの審査が通らず、リジェクトされると言われています。

 

2024年春の実施開始となると、早ければあと1ヶ月となります。具体的な対応期限や、どれほど厳しく運用されるかは通達されていませんが、Unityのアップデートが必要な可能性もあり、早期に準備をはじめ、理解をしておくことが望ましいです。

対応が必要なこと

まず、対応が必要な項目についてリストアップしました。

  • Xcode15を使いPrivacy Manifestsを出力できるようにする
    • Privacy Manifestsを作成し、以下の内容を記載する
  • Privacy Manifests対応がされたSDKを使用する
    • コード署名のあるSDKを使用
  • Unityを使用している場合、Privacy Manifests、署名対応がされたバージョンに更新する


Xcode15の使用

Privacy Manifests を作れるのはXcode15からです。
また、4/29 からXcode15の利用が必須となるため、早めのアップデートを行いましょう。

 

この時、MacOS Sonomaにアップデートすると基本的にXcode14以前が使えなくなります。
Xcode14も必要な場合は、Ventureをインストールするなどで対応しましょう。

Privacy Manifestsの作成

最初にPrivacy Manifestsの作成方法を説明します。

Xcode15を開き
File > New > File …から、ResourceのカテゴリにあるApp Privacyを選んでください。


PrivacyInfoと初期の名前が設定されています。こちらは変更しないでください。
ビルド対象を指定するTargetも選択してください。


作成すると以下のように空のPrivacy Manifestsが作成されます。



Privacy Manifestsの記載

Privacy Manifestsには以下の内容を記載することが必要です。

  • ATTの使用状況と、トラッキングドメインの記載
  • 使用しているデータとタイプの記載
  • 使用しているRequiredReasonAPIの記載

一つ一つ確認していきます。

 

ATTの使用状況と、トラッキングドメインの記載

ATT(App Tracking Transparency)とはアプリ起動時に

「(アプリ名)が他社のAppやWebサイトを横断してあなたのアクティビティの追跡をすることを許可しますか?」

を表示し、パーソナライズした広告提供のため利用されるIDFAの使用時にユーザーの同意を求めるものです。
ATTを使用している場合は、Privacy Tracking Enabled (NSPrivacyTracking)を選択し、YESにしてください。

 

そして、ATTで使用するトラッキングの通信先のドメインを、Privacy Tracking Domains (NSPrivacyTrackingDomains)により設定してください。
Privacy Tracking Domains を選択し、(+)ボタンを押すか、右クリックからのAdd Rowのメニューから行を追加し、ドメインを記載してください。

使用しているデータとタイプの記載

アプリが収集する、ユーザーのデータのカテゴリと、データを収集する理由を記載します。

 

記載すべき内容は、App Store Connectのアプリのプライバシーの内容と同じであるため、その内容を確認し、Privacy Manifestsに記載していきます。


元となる情報源はこちらです。
新規アプリではこの内容を確認し設定していきましょう。

developer.apple.com

 

データの用途は、Privacy Nutrition Label Types(NSPrivacyCollectedDataTypes)に記載します。
データごとに記載が必要な項目とその意味は次の通りです。

 

Collected Data Type 収集するデータの種類

Collection Purposes 使用の目的

Used for Tracking        トラッキングに目的に使用しているか

Linked to User        ユーザーのアイデンティティに結びつくデータか



「トラッキング」や「ユーザーに関連付けられたデータ」という言葉は、以下のように理解をしています。

 

ユーザーのトラッキングに使用されるデータ(Data Used to Track You)
アプリを通じて収集された後に、第三者と共有されるデータ

ユーザーに関連付けられたデータ(Data Linked to You)
アプリが収集した後、誰のものであるか認識されるデータ

ユーザーに関連付けられないデータ(Data Not Linked to You)
アプリが収集した後、ユーザーには紐づけられず匿名なデータ

 

正確な情報については以下のAppleのサイトをご確認ください。 

developer.apple.com

 

Required Reason APIの使用の記載

Privacy Accessed API Types(NSPrivacyAccessedAPITypes)

 

以下にリストアップされる、使用理由の登録が必要となるAPIに関しては、アプリの実装状況を調べてPrivacy Manifestsへの記載が必要です。

developer.apple.com

 

Unityでアプリを開発している場合こちらのサイトにある
「Unity の C# .Net Framework API」を参考にしてください

docs.unity3d.com

 



例えば、UserDefaultsの場合、Privacy Accessed API Typesを追加し、
Privacy Accessed API TypeにUser Defalutsを選択、
Privacy Accessed API Reasonsは以下の、User defaults API項目より、該当する利用の選択肢を全て選んでください。

developer.apple.com

 

Required Reason APIの使用状況の検索

実際に、APIを洗い出す方法を説明します。
iOSのネイティブコードはこちらを検索

developer.apple.com

 

Unityの場合、以下記載のAPIソースコードから検索します

docs.unity3d.com

 

grepでも検索できますが、ripgrepのほうがより高速に検索できるため

brew install ripgrep

でインストールし、以下のコマンドで検索します
(※ripgrepはテキストのみ対応でバイナリ検索は行わないことは注意してください)

 

UnityのAPI検索のため csファイルの検索を実行する場合

rg --type cs \

   -e 'fileInfo.CreationTime' \

   -e 'directoryInfo.CreationTime' \

   -e 'fileInfo.LastAccessTime' \

   -e 'directoryInfo.LastAccessTime' \

   -e 'fileInfo.LastWriteTime' \

   -e 'directoryInfo.LastWriteTime' \

   -e 'fileInfo.CreationTimeUtc' \

   -e 'directoryInfo.CreationTimeUtc' \

   -e 'fileInfo.LastAccessTimeUtc' \

   -e 'directoryInfo.LastAccessTimeUtc' \

   -e 'fileInfo.LastWriteTimeUtc' \

   -e 'directoryInfo.LastWriteTimeUtc' \

   -e 'File.GetCreationTime' \

   -e 'Directory.GetCreationTime' \

   -e 'File.GetLastAccessTime' \

   -e 'Directory.GetLastAccessTime' \

   -e 'File.GetLastWriteTime' \

   -e 'Directory.GetLastWriteTime' \

   -e 'File.GetCreationTimeUtc' \

   -e 'Directory.GetCreationTimeUtc' \

   -e 'File.GetLastAccessTimeUtc' \

   -e 'Directory.GetLastAccessTimeUtc' \

   -e 'File.GetLastWriteTimeUtc' \

   -e 'Directory.GetLastWriteTimeUtc' \

   '/path/to/unityproject'

 

iOSのネイティブコードを検索する場合

rg -i  \

   -e 'creationDate' \

   -e '\.modificationDate' \

   -e '\.fileModificationDate' \

   -e '\.contentModificationDateKey' \

   -e 'getattrlist\(' \

   -e 'getattrlistbulk\(' \

   -e 'fgetattrlist\(' \

   -e 'stat\.st_' \

   -e 'fstat\(' \

   -e 'fstatat\(' \

   -e 'lstat\(' \

   -e 'getattrlistat\(' \

   -e 'systemUptime' \

   -e 'mach_absolute_time\(' \

   -e 'volumeAvailableCapacityKey' \

   -e 'volumeAvailableCapacityForImportantUsageKey' \

   -e 'volumeAvailableCapacityForOpportunisticUsageKey' \

   -e 'volumeTotalCapacityKey' \

   -e 'systemFreeSize' \

   -e 'systemSize' \

   -e 'statfs\(' \

   -e 'statvfs\(' \

   -e 'fstatfs\(' \

   -e 'activeInputModes' \

   '/path/to/unityproject'

 

バイナリファイルから見つける場合はこちらのサイトで紹介されていた
nmというコマンドを使うようです。

buildersbox.corp-sansan.com

 

このコマンドは、アプリのAPIを調べるときには必要なさそうですがSDKで使われているかをチェックする時に使えそうです。

 

Privacy Manifests対応のSDKを使用する

Privacy Manifests対応は、アプリで使用しているSDKに対しても求められます。

 

アプリの箇所で説明した

  • 使用しているデータとタイプの記載
  • 使用しているRequiredReasonAPIの記載

が必要となります。
加えて、以下のSDKについては署名対応も必要となります。

 

developer.apple.com

 

SDKの対応状況については、詳細にまとめてくださった方の情報を紹介させていただきます。

dev.classmethod.jp

 

Unityを利用している場合は

C#のコードで提供されるSDK
自分でデータタイプ、RequiredReasonAPIを確認しPrivacy Manifests対応を行う

 

iOSのバイナリがある場合
SDKの提供元のPrivacy Manifests対応SDKを使用する

 

といった対応になります。
プロジェクト、会社ごとに使用しているSDKは違うため、社内で使用しているSDKリストを作成し、確認していくことをおすすめします。

 

SDKの対応状況確認

SDKのPrivacy Manifests対応は、提供元が対応しないと完了しません。
以下のような手順で、会社のプロジェクト全体で整理したうえで、SDK対応を進めていくのがいいかと思います。

  1. SDK Privacy Manifests対応リストの作成
  2. 公式サイトの確認
  3. GitHubリポジトリのRelease状況、Issueの確認
  4. SDK提供元への問い合わせ


SDKへの署名

SDKに対してのコード署名は、Appleが名指ししている以下のSDKは対応が必須です。

developer.apple.com

 

この中にはUnityFrameworkも含まれているため、Unityのアップデートも必要になります。
こちらは後述いたします。

 

Xcode15で、XCFrameworkを確認すれば、以下のような表示でSDKに対する署名の状況がわかります。



詳細についてはこちらのドキュメントや

developer.apple.com

 

こちらの動画で説明されていますのでご確認ください。

developer.apple.com

 

Privacy Manifests対応のUnityを使用する

UnityはAppleから名指しされているSDKであるため、Privacy Manifests対応・署名対応が行われたバージョンを使用する必要があります。
Privacy Manifestsに対応されているUnityは以下のバージョンからとなります。


Unity2021.3.35f1
Unity2022.3.18f1
Unity2023.2.7f1

 

署名については、上記バージョンでは対応されていないようなので、対応後のバージョンアップが必要です。

 

Unityで作ったアプリのPrivacy Manifests対応

Unityで作ったアプリのPrivacy Manifests対応は、この資料の前半で説明した手順でXcode15でPrivacyInfo.xcprivacyを作成し Assets/Plugins(またはAssets/Plugins/iOS)フォルダにいれることで、Unity側のPrivacy ManifestsとアプリのPrivacy Manifestsが統合されます。
詳細は以下をご確認ください。

 

docs.unity3d.com

 

まとめ

今回は『Privacy Manifests』についてやるべきことを書きました。

執筆時点での情報に基づいているため、情報が古くなっていたら申し訳ありません。


Unityについてはこちらのフォーラムでも、Unity社内の人も含めた情報交換が行われているので参考になります。このフォーラムによると署名処理はまだ実装されていないようです。

forum.unity.com

 

今回調査した結果、アプリ自体のPrivacy Manifests対応は、そこまで時間がかかるものではないようです。しかし、Unityやその他SDKのアップデートは、SDK提供元の対応が必要ですし、最新版へのアップデートは互換性を保つための修正や動作確認に時間がかかることが予想されます。そのため、早期に準備しておくべきだと感じました。

 

今回の記事が参考になりましたら幸いです。