Privacy Manifest(PrivacyInfo.xcprivacy)は、2024年春以降、すべてのアプリケーションとサードパーティSDKがiOSビルドに含める必要があるファイルです。Appleは、保護されたAPI(Required Reason API)の使用理由と収集するデータの種類を宣言することを要求しています。Apple Developer Documentationによると、アプリケーション内のすべてのバイナリ — メインターゲット、フレームワーク、Swift Package Managerの依存関係 — は、独自のPrivacy Manifestを含める必要があります。
主要ポイント
Privacy Manifestは、property list(XML)形式のPrivacyInfo.xcprivacyファイルであり、アプリケーションが収集するデータの種類と特定のAPIを使用する理由を宣言します。Appleは、Privacy Nutrition Labelと同様の、プライバシーの透明性を高める取り組みの一環としてマニフェストを導入しましたが、コードとバイナリレベルで機能します。
マニフェストの主な目的は、いわゆるRequired Reason APIの使用を文書化することです。これらは、デバイスのフィンガープリンティングに使用される可能性があるAPIカテゴリであり、そのため、それぞれの使用にはAppleの承認済みリストからの具体的な理由の宣言を伴う必要があります。
2024年5月1日以降、AppleはPrivacy Manifestを含まないビルドを拒否します。これは、アプリケーションのメインターゲットとすべての埋め込みSDKおよび依存関係の両方に適用されます。WWDC 2023によると、マニフェストはApp Storeを通じて配布されるすべてのアプリケーションに必須です。
マニフェストはすべてのバイナリに存在する必要があります — メインアプリケーションだけでなく、すべてのフレームワークと静的ライブラリにも必要です。サードパーティSDKがマニフェストを提供しなかった場合、開発者は手動で追加するか、SDKベンダーに連絡してアップデートを入手する必要があります。
マニフェスト以前は、開発者は透明な説明なしに広範なシステムAPI(ファイルシステムアクセス、日付/時刻、システムログ)を使用できました。これにより、開発者の知らないうちに情報を収集する可能性のあるサードパーティSDKを通じたデータ漏洩のリスクが生じていました。
Mysk Inc.(2023)によると、多くの人気SDKが明示的な必要性なくデバイスのフィンガープリンティングにAPIを使用していました — たとえば、タイムゾーンを特定するためにアップタイムを読み取ったり、メタデータを収集するためにディレクトリをスキャンしたりしていました。Privacy Manifestは、そのようなすべての動作を宣言することを義務付けています。
Required Reason APIに加えて、マニフェストにはNSPrivacyTrackingセクション — アプリがトラッキングを使用するかどうかを示すフラグ(ATTが必要)、およびNSPrivacyCollectedDataTypes — Privacy Nutrition Label形式で収集されたデータタイプのリストが含まれています。
Privacy Nutrition Labelは、App Storeのアプリケーションページに表示されるユーザー向けの表現で、アプリが収集するデータを示します。Privacy Manifestは、バイナリ内の技術ファイルであり、Appleが自動的にチェックします。マニフェストのデータがApp Store Connectのラベルと一致しない場合、Appleはビルドを拒否します。
したがって、マニフェストはAppleの検証システムの信頼できる情報源です。プライバシーラベルはそれに基づいて自動的に生成されますが、開発者は両方の表現を最新の状態に保つ必要があります。公開後にマニフェストを変更するには、レビューのために新しいビルドを送信する必要があります。
PrivacyInfo.xcprivacyファイルは、ルートタイプがDictionaryのproperty list形式を使用します。主要なトップレベルキーは次のとおりです:NSPrivacyTracking(Boolean)、NSPrivacyTrackingDomains(Array)、NSPrivacyCollectedDataTypes(Array)、NSPrivacyAccessedAPITypes(Array)。
NSPrivacyTrackingキー — アプリがトラッキングを適用するかどうかを示すブール値(ATTが必要)。trueの場合、Info.plistでNSUserTrackingUsageDescriptionも指定する必要があります。NSPrivacyTrackingDomainsキー — トラッキングが適用されるドメインの配列。
NSPrivacyCollectedDataTypesキー — 各ディクショナリが収集するデータのタイプを記述するディクショナリの配列:カテゴリ(NSPrivacyCollectedDataType)、リンケージ(NSPrivacyCollectedDataLinked)、目的(NSPrivacyCollectedDataTypePurposes)。目的には以下が含まれます:サードパーティ広告、分析、製品開発、コンテンツのパーソナライゼーション。
NSPrivacyAccessedAPITypesキー — 各Required Reason APIカテゴリのディクショナリの配列:カテゴリ(NSPrivacyAccessedAPITypeReasons) — Appleの承認済みリストからの具体的な理由、およびNSPrivacyAccessedAPIType — APIカテゴリ識別子。
<!-- PrivacyInfo.xcprivacy -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
</array>
</dict>
</plist>
データタイプはいくつかのカテゴリに分類されます:連絡先情報(名前、メール、電話)、財務(支払いデータ)、識別子(IDFA、ユーザーID)、使用データ(ログ、クリック)、診断(クラッシュログ)、およびユーザーコンテンツ(写真、ビデオ、ファイル)。各カテゴリはさらに「ユーザーにリンク」または「リンクなし」としてマークされます。
リンクとは、データがユーザーのアカウントに関連付けられていることを意味します。リンクなしとは、データが集約または匿名化されていることを意味します。このマーキングは、Appleがプライバシーラベルを表示する方法に影響します:リンクされたデータは黄色、リンクされていないデータは緑色で表示されます。
AppleはいくつかのAPIカテゴリを特定しており、それぞれの使用には承認済みリストからの具体的な理由を伴う必要があります。理由は一意のコードであり、たとえばC617.1や35F9.1のように、Appleが許可する特定の目的に対応しています。
NSPrivacyAccessedAPICategoryFileTimestampカテゴリには、ファイルのタイムスタンプ(creationDate、modificationDate)にアクセスするためのAPIが含まれます。理由:C617.1(ファイル同期)、3B52.1(バックアップ)、0A2A.1(不正防止)。
NSPrivacyAccessedAPICategoryDiskSpaceカテゴリには、ディスクの空き容量を確認するためのAPIが含まれます(NSFileManager。確認(NSFileManager)。理由:E174.1(キャッシュ管理)、85F4.1(コンテンツダウンロード)、B728.1(診断)。
NSPrivacyAccessedAPICategorySystemBootTimeカテゴリには、システムの起動時間(アップタイム)にアクセスするためのAPIが含まれます。理由は1つだけ:35F9.1(分析のためのセッション時間測定)。その他の使用はフィンガープリンティングと見なされます。
各カテゴリには1〜5の承認された理由があります。開発者は、APIの実際の使用に最も正確に対応する理由を選択する必要があります。不正確な理由を提供すると、ビルドの拒否やアカウントの停止につながる可能性があります。
2024年5月1日以降、すべてのサードパーティSDK — バイナリとオープンソースの両方 — は、パッケージにPrivacy Manifestを含める必要があります。Appleはすべての依存関係のマニフェストをチェックし、少なくとも1つのSDKにマニフェストがない場合、ビルドは拒否されます。
主要なSDK(Firebase、Adjust、AppsFlyer、Facebook SDK)は既にパッケージを更新しています。プロジェクトが知名度の低いSDKを使用している場合は、そのバージョンを確認し、必要に応じて更新するか、開発者に連絡してください。一時的な回避策として、プロジェクトにSDK用のマニフェストを手動で追加することもできますが、更新時の不一致のため推奨されません。
PrivacyInfo.xcprivacyは、Xcode 15+の組み込みテンプレートを使用して作成するか、手動で作成できます。両方のオプションを検討しましょう。
Xcode 15にはPrivacy Manifestテンプレートが含まれています:File → New → File → Resource → Privacy Manifest。Xcodeは基本構造のファイルを作成し、NSPrivacyTrackingおよびAPIとデータ用の空の配列を入力します。作成後、使用する各Required Reason APIの理由を手動で指定する必要があります。
テンプレートは自動的にファイルをメインターゲットに追加します。プロジェクトに複数のターゲットがある場合(Extensions、Watch app)、各ターゲットにマニフェストを追加する必要があります。Xcodeはコンパイル時に依存関係のマニフェストの存在をチェックしません — アーカイブ段階でのみチェックします。
// AppDelegate: 開発段階でのマニフェストチェック
import Foundation
func validatePrivacyManifest() {
guard let path = Bundle.main.path(
forResource: "PrivacyInfo", ofType: "xcprivacy"
) else {
print("PrivacyInfo.xcprivacyが見つかりません")
return
}
guard let dict = NSDictionary(contentsOfFile: path)
else { return }
print("Privacy manifest loaded: \(dict.count) keys")
}
PrivacyInfo.xcprivacyを通常のXML property listファイルとして手動で作成することもできます。これを行うには、PrivacyInfo.xcprivacyという名前のファイルを作成し、標準のplistヘッダーを記述して、必要なキーを持つルートディクショナリを追加します。ファイルがターゲットに追加されていることを確認してください(Target Membership)。
手動の方法は、Xcode UIを使用せずに静的ライブラリやPackage Managerの依存関係にマニフェストを追加する必要がある場合に便利です。コンパイル後、nmコマンドまたはアーカイブを使用して、ファイルがバイナリに含まれていることを確認します。
App Storeにビルドを送信する前に、Privacy Manifestが正確で完全であることを確認する必要があります。Appleはいくつかの検証ツールを提供しています。
プロジェクトをアーカイブする際(Product → Archive)、Xcodeはマニフェストの検証を実行します。エラーが見つかった場合 — マニフェストの欠落、理由の誤り、空のカテゴリ — アーカイブはエラーで失敗します。エラーログはIssueナビゲーターに表示され、問題のあるSDKとAPIカテゴリを示します。
ビルドのアップロード時に、App Store Connect側で追加の検証が実行されます。検証に失敗した場合、問題のあるAPIの識別子と推奨される修正を含む自動メールとともにビルドは拒否されます。
検証を自動化するには、Required Reason APIの使用についてバイナリを分析するスクリプトを使用します。Appleはlibtoolツールとシンボルチェックスクリプトを提供していますが、コミュニティはより便利なユーティリティを開発しています。
# バイナリ内のFileTimestamp API使用の検索
nm MyApp.app/MyApp | grep "NSFileCreationDate"
# アプリケーション内のPrivacyInfo.xcprivacyの存在確認
find MyApp.app -name "*.xcprivacy"
最も一般的なエラーは、SDKの1つでマニフェストが見つからないことです。メインターゲットにマニフェストが含まれていても、Appleは各バイナリを個別にチェックします。2番目に多いのは、理由コードの誤りです — あるAPIカテゴリの理由を別のカテゴリのAPIで使用することです。
3番目のエラーは、実際には使用されていないAPIの過剰な宣言です。開発者は「念のため」すべての可能な理由を追加しますが、これはAppleのレビュアーに警戒心を与えます。実際に使用されているカテゴリのみを追加してください。確認にはXcodeの静的アナライザーを使用してください。
よくある質問
2024年5月1日以降、Appleはマニフェストなしのすべてのビルドを拒否します。エラーはApp Store Connectへのアップロード段階で発生します。古いアプリケーションはブロックされませんが、アップデートにはマニフェストの必須の組み込みが必要です。
はい、マニフェストはすべてのAppleプラットフォームで必須です:iOS、iPadOS、macOS、tvOS、watchOS、visionOS。Required Reason APIの要件はすべてのプラットフォームで統一されていますが、APIセットは若干異なる場合があります。
SDKがマニフェストを提供しなかった場合、個別のPrivacyInfo.xcprivacyファイルを作成し、プロジェクトのSDKグループに追加します。SDKのドキュメントに基づいて、このSDKが使用するAPIの理由を指定します。
はい。自動チェック中に、Appleは宣言された理由と実際のAPI呼び出しを照合します。不一致があると拒否されます。手動レビュー中に、レビュアーが説明を求める場合があります。
はい、AppleはSPMを含むすべての依存関係のマニフェストをチェックします。パッケージ提供者はリポジトリにPrivacyInfo.xcprivacyを含める必要があります。Xcodeはアーカイブ時に欠落したマニフェストについて警告します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。