iOSアプリにPrivacyInfo.xcprivacyを実装するにはどうすればよいですか?PrivacyInfo.xcprivacyを実装するには、アプリケーションまたはSDKのターゲットに有効なプライバシーマニフェストを追加し、使用している要件理由API(User Defaultsやシステム起動時間など)に対して承認された理由コードを宣言し、サードパーティの依存関係が配布形態に適用されるプライバシーマニフェストと署名の要件を満たしていることを検証する必要があります。
プライバシーマニフェスト(
PrivacyInfo.xcprivacy)は、iOSアプリやサードパーティ製SDKにバンドルされる標準化されたプロパティリストファイルであり、データ収集カテゴリ、トラッキングドメインの設定、およびAppleが指定する要件理由APIへのアクセスに対する承認された正当な理由を宣言します。2024年5月1日より、App Store Connectに提出されるアプリには、アプリのコード(適用されるサードパーティ製SDKのコードを含む)で使用される要件理由APIに対する承認済みの理由を含める必要があります。
| 用語 | 定義 |
|---|---|
| PrivacyInfo.xcprivacy | アプリおよびSDKのプライバシーポリシーを宣言するための、Appleの標準化されたプロパティリスト形式。 |
| 要件理由API(Required Reason APIs) | 明示的な正当化コードの指定が必要な特定のプラットフォームAPI(User Defaultsやディスク容量など)。 |
| リソースバンドルの署名 | 生成されたリソースバンドルのターゲットに適用されるビルドシステムのコード署名動作。XcodeやCocoaPodsの一部構成でトラブルシューティングが必要になる場合があります。 |
| プライバシーレポート | アーカイブされたアプリやリンクされたSDKで検出されたプライバシーマニフェストの宣言を統合し、Xcode 15以降で生成されるPDF形式の集約サマリー。 |
iOS SDKにおけるAppleのプライバシーマニフェスト要件の理解
プライバシーマニフェストのアーキテクチャ:メインアプリのマニフェストと埋め込みSDKのマニフェスト
Appleのプライバシーマニフェストフレームワークは、iOSソフトウェアサプライチェーン全体にわたるモジュール式の透明性モデルを確立します。ホストアプリケーションがインポートしたすべてのライブラリの内部実装詳細を手動で監査して宣言することを求めるのではなく、Appleはプライバシーガバナンスを明確なレイヤーに分割しています。
- メインアプリケーションのマニフェスト:ファーストパーティのデータ収集、アプリレベルのトラッキングドメイン、およびプライマリアプリケーションのターゲットコードから直接呼び出される要件理由APIをカバーします。
- 埋め込みSDKのマニフェスト:要件理由APIの宣言は、それらのAPIを使用するアプリまたはサードパーティ製SDKのコードが所有する必要があります。実行ファイルや動的ライブラリの場合、その実行ファイルやライブラリを含むバンドルに対応するプライバシーマニフェストを含める必要があり、サードパーティ製SDKがSDKの要件理由APIの使用状況を報告するためにホストアプリのマニフェストに依存することはできません。
- 自動依存関係集約:Xcode 15以降でアプリケーションがアーカイブされると、ビルドシステムが依存関係グラフを走査し、バンドルされているすべての
PrivacyInfo.xcprivacyファイルを検出して、単一の統一されたプライバシーレポートに集約します。

4つのルート設定キー
すべてのPrivacyInfo.xcprivacyファイルは、最大4つのルートレベルのキーを含むXMLプロパティリスト辞書として構造化されています。
NSPrivacyTracking(ブール値):AppleのAppトラッキング透過性(ATT)の定義に基づき、アプリまたはSDKがアプリから収集したデータトラッキングを使用するかどうかを宣言します。NSPrivacyTrackingDomains(文字列の配列):トラッキングを行う、アプリまたはSDKによって接続されるインターネットドメインをリストします。ユーザーがATTの承認を付与しない場合、iOSはこの配列で宣言されたドメインへのネットワーク接続をブロックします。アプリまたはSDKがトラッキングドメインに接続しない場合、このキーは省略可能です。NSPrivacyCollectedDataTypes(辞書の配列):アプリまたはSDKがアプリの利用者に関して収集するApple定義のデータカテゴリを報告し、データがユーザーの身元にリンクされているかどうか、トラッキングに使用されているかどうか、および収集される目的を合わせて記述します。NSPrivacyAccessedAPITypes(辞書の配列):バイナリから呼び出されるApple指定の要件理由APIを、承認された理由文字列コードとともに宣言します。

App Store Connectへの取り込み時の強制とエラー診断
App Store Connectでは、バイナリの取り込み時にプライバシーマニフェストが強制されます。
- API宣言の欠落(
ITMS-91053):コンパイルされたバイナリまたはリンクされたライブラリが要件理由APIのシンボルを呼び出しているにもかかわらず、対応するカテゴリキーがNSPrivacyAccessedAPITypesから欠落している場合に発生します。 - 無効な理由コードの宣言:特定のAPIカテゴリに対して、マニフェストが未承認、不正な形式、または非推奨の理由文字列を宣言している場合に発生します。
- 必要なサードパーティ製SDKマニフェストの欠落:リストされたSDKに関するAppleの現在のサードパーティ製SDK要件で定義されている提出シナリオにおいて強制され、バイナリ配布にはプライバシーマニフェストと有効なデジタル署の両方が必要となります。
クライアントアトリビューションとディープリンクを統合する開発者は、マニフェスト宣言に関する技術仕様についてiOS SDK統合ドキュメントを参照できます。
関連記事:iOS SDK ──> モバイルアトリビューションアーキテクチャ
要件理由APIのカテゴリと承認された理由コード
5つの要件理由APIカテゴリ
Apple Developerテクニカルノート TN3183によると、AppleはNSPrivacyAccessedAPITypesにおいて明示的な正当化コードを必要とする5つの特定のAPIカテゴリを定義しています。モバイルSDKとiOSアプリは、一般的に以下の4つの主要カテゴリとやり取りします。
NSPrivacyAccessedAPICategoryUserDefaults:UserDefaultsまたはNSUserDefaultsを介したローカルアプリ設定へのアクセス。NSPrivacyAccessedAPICategorySystemBootTime:sysctl(KERN_BOOTTIME)やsystemUptimeなどのシステム起動APIを使用した、経過時間やタイムスタンプの測定。NSPrivacyAccessedAPICategoryDiskSpace:statfs、statvfs、またはvolumeAvailableCapacityKeyを介したファイルシステムの容量検査。NSPrivacyAccessedAPICategoryFileTimestamp:stat、getattrlist、またはcontentModificationDateKeyを介したファイルの作成日または更新日の確認。NSPrivacyAccessedAPICategoryActiveKeyboards:アクティブなカスタムキーボード拡張機能の検査(主に特殊なキーボードユーティリティで使用されます)。
一般的なSDKのユースケースに向けた承認済み理由コードのマッピング
以下の表は、汎用モバイルSDKでよく見られるカテゴリに焦点を当てています。アクティブキーボードを含む理由の完全なリストについては、Appleの最新ドキュメントを参照してください。Appleのガイドラインに準拠するため、開発者は実際のランタイムデータの使用状況に厳密に一致する理由コードを選択する必要があります。
| APIカテゴリキー | 承認済みコード | Apple公式に準拠した目的 |
|---|---|---|
NSPrivacyAccessedAPICategoryUserDefaults |
CA92.1 |
アプリ自体からのみアクセス可能なデータの読み取りおよび書き込み |
NSPrivacyAccessedAPICategoryUserDefaults |
1C8F.1 |
同じApp Group内のみで共有されるデータの読み取りおよび書き込み |
NSPrivacyAccessedAPICategoryUserDefaults |
C56D.1 |
ホストアプリにキーバリュー機能を提供するサードパーティ製SDKラッパー |
NSPrivacyAccessedAPICategorySystemBootTime |
35F9.1 |
アプリ内で発生するイベント間の経過時間の測定、またはタイマーの処理 |
NSPrivacyAccessedAPICategorySystemBootTime |
8FFB.1 |
アプリ内で発生したイベントの絶対タイムスタンプの計算 |
NSPrivacyAccessedAPICategoryDiskSpace |
E174.1 |
ファイルを書き込む前にディスク空き容量を確認し、容量が不足している場合はアプリの動作を変更する |
NSPrivacyAccessedAPICategoryDiskSpace |
85F4.1 |
利用可能な容量をユーザーに表示するためのディスク空き容量情報へのアクセス |
NSPrivacyAccessedAPICategoryFileTimestamp |
C617.1 |
アプリコンテナ、App Group、またはCloudKitコンテナ内のファイルメタデータへのアクセス |
NSPrivacyAccessedAPICategoryFileTimestamp |
3B52.1 |
ユーザーによって明示的に選択されたファイルまたはディレクトリのメタデータへのアクセス |
NSPrivacyAccessedAPICategoryFileTimestamp |
0A2A.1 |
ホストアプリに代わってのみファイルタイムスタンプにアクセスするサードパーティ製SDKラッパー |

PrivacyInfo.xcprivacyプロパティリストの作成例
データ収集タイプの構成
NSPrivacyCollectedDataTypes配列は、アプリまたはSDKがアプリの利用者に関して収集するApple定義のデータカテゴリを報告し、データがユーザーの身元にリンクされているかどうか、トラッキングに使用されているかどうか、および収集される目的を記述します。
NSPrivacyCollectedDataType:Apple標準の文字列識別子(例:NSPrivacyCollectedDataTypeDeviceID)。NSPrivacyCollectedDataTypeLinked:データが個々のユーザーの身元にリンクされているかどうかを示すブール値。NSPrivacyCollectedDataTypeTracking:データがクロスアプリトラッキングに使用されているかどうかを示すブール値。NSPrivacyCollectedDataTypePurposes:標準的な目的を示す文字列の配列(例:NSPrivacyCollectedDataTypePurposeAnalytics)。
トラッキングドメインの宣言
SDKまたはアプリケーションがATTの定義に基づいてトラッキングを行う場合、対応するすべてのトラッキングドメインをNSPrivacyTrackingDomainsの下で宣言する必要があります。ユーザーによってトラッキングの承認が与えられない場合、iOSは宣言されたドメインへのネットワーク接続をブロックします。アプリまたはSDKがトラッキングを行わない場合は、NSPrivacyTrackingをfalseに設定し、NSPrivacyTrackingDomainsは省略可能です。
以下のプロパティリスト設定は、PrivacyInfo.xcprivacyスキーマの例を示しています。アプリケーションの実装に実際に即したカテゴリと理由のみを含めてください。
```xml
<?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>NSPrivacyCollectedDataTypes</key>
<array>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeDeviceID</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<false/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
</array>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategorySystemBootTime</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>35F9.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryDiskSpace</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>E174.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
</array>
</dict>
</plist>
CocoaPodsのリソースバンドルコード署名エラーの解決
根本原因:Xcode 15および16におけるリソースバンドル署名の失敗
Xcode 15または16でCocoaPodsを介して依存関係を統合する場合、開発者は頻繁にコンパイルの停止に直面します。
Signing for "libOpoInstallSDK-OPPrivacy" requires a development team. Select a development team in the Signing & Capabilities editor.
このビルド失敗は、XcodeとCocoaPodsの統合に関する問題です。
- 従来の
.a静的ライブラリには、PrivacyInfo.xcprivacyなどのリソースを直接含めることができません。Appleは、静的なSDKコードとリソースを静的フレームワーク内にまとめてパッケージ化することを推奨しています。 - 一部のCocoaPods統合では、静的ライブラリと並行してリソースを配布するために、代わりに個別のリソースバンドルターゲットが生成されます。
- CocoaPodsによって生成された特定のリソースバンドルターゲットは、開発チームを要求してXcodeビルドを停止させる署名設定を継承する場合があります。これは
PrivacyInfo.xcprivacyのスキーマ要件ではなく、ビルドシステムの統合に関する問題です。
Podfileでのターゲットを絞ったビルドシステムのワークアラウンドの適用
自動ビルド全体でこのエラーを解決するために、開発者はプロジェクトのPodfileでスコープ指定されたpost_installフックを使用できます。これは非実行可能なリソースバンドルに対するビルドシステムのワークアラウンドであるため、チームは影響を受ける特定のバンドルターゲットにスコープを限定するか、変更をグローバルに適用する前に影響を受ける依存関係を検証する必要があります。
以下のRubyスクリプトは、CocoaPodsのターゲットを反復処理し、指定されたリソースバンドルターゲットの署名を無効にする方法を示しています。
post_install do |installer|
# 開発チームなしで署名エラーが発生する、非実行可能なリソースバンドルターゲットを指定します
target_bundle_names = [
'libOpoInstallSDK-OPPrivacy'
]
installer.pods_project.targets.each do |target|
if target.respond_to?(:product_type) &&
target.product_type == "com.apple.product-type.bundle" &&
target_bundle_names.include?(target.name)
target.build_configurations.each do |config|
# 指定された非実行可能リソースバンドルからコード署名要件を除外します
config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
config.build_settings['CODE_SIGN_IDENTITY'] = ''
end
end
end
end
Xcodeでの集約プライバシーレポートの監査と生成
Xcodeアーカイブオーガナイザーによる統一プライバシーレポートの生成
バイナリを提出する前に、すべてのファーストパーティターゲットとサードパーティ製依存関係が適切に宣言されていることを確認するには、以下の手順を実行します。
- Xcode 15以降でプロジェクトを開きます。
- [Product] > [Archive]を選択してリリースアーカイブを作成します。
- Xcodeオーガナイザーで、アーカイブを右クリック(またはControlキーを押しながらクリック)し、[Generate Privacy Report]を選択します。
- 生成されたPDFレポートを保存して検査し、すべての要件理由API、データカテゴリ、およびサードパーティ製SDKマニフェストが正確に表示されていることを確認します。
コマンドライン静的分析:提出前のヒューリスティック スキャン
開発チームは、nmやotoolを使用してコンパイル済みバイナリ内の制限されたシンボルをスキャンすることにより、継続的インテグレーション(CI/CD)パイプライン内でヒューリスティックな提出前監査を実施できます。
# 展開されたアプリケーションバイナリで、要件理由APIの候補シンボルをスキャンします
nm -u /path/to/Payload/YourApp.app/YourApp | grep -E 'sysctl|statfs|statvfs|getattrlist|NSUserDefaults'
# 埋め込みフレームワークとバンドルでPrivacyInfo.xcprivacyマニフェストを検索します
find /path/to/Payload/YourApp.app -name "PrivacyInfo.xcprivacy"
シンボルの存在自体によって、どの承認済み理由が適用されるかが決まるわけではありません。マニフェストを変更する前に、実際の呼び出しパスとユースケースを確認してください。信頼性の高い検証を行うためには、Xcodeの[Generate Privacy Report]およびApp Store Connectの事前チェックを使用する必要があります。

診断マトリックス:App Storeのプライバシーマニフェスト拒否の根本原因
| 障害モード / エラーコード | 潜在的な根本原因 | 観測されるシステムの挙動 | 推奨される修復方法 |
|---|---|---|---|
API宣言の欠落(ITMS-91053) |
バイナリが制限されたAPIを呼び出しているが、マニフェストにカテゴリが記述されていない | App Store Connectへのアップロード時の警告または拒否 | 一致するAPIカテゴリと有効な理由コードを宣言する |
| 無効な理由コード | 指定された理由コードが、そのカテゴリに対してAppleによって承認されていない | App Store Connectによる提出の拒否 | Appleの仕様から承認された理由文字列を使用するようにXMLを更新する |
| サードパーティ製SDKマニフェストの欠落 | リストされているサードパーティ製SDKの依存関係に埋め込みマニフェストがない | App Store ConnectがSDKマニフェストの欠落をフラグ付けする | PrivacyInfo.xcprivacyを提供するバージョンに依存関係をアップグレードする |
| リソースバンドルコード署名エラー | CocoaPodsが署名チームなしでリソースバンドルターゲットを生成している | ビルド中にXcodeのコンパイルが停止する | 失敗しているバンドルターゲットを評価し、スコープ指定されたPodfile署名ワークアラウンドを適用する |
| 未宣言のトラッキングエンドポイント | アプリがNSPrivacyTrackingDomainsにリストされていないトラッキングサーバーに接続している |
アプリのトラッキング動作に対するプライバシー設定が不完全である | すべてのトラッキングエンドポイントをNSPrivacyTrackingDomainsの下にリストする |
よくある質問(FAQ)
すべてのサードパーティ製SDKに独自のPrivacyInfo.xcprivacyファイルが必要ですか?
承認された理由を宣言せずにアプリがUserDefaultsを使用した場合どうなりますか?
1つのAPIカテゴリに対して、アプリケーションが複数の理由を宣言することはできますか?
まとめと決定フレームワーク
Appleのプライバシーマニフェストフレームワークは、iOSソフトウェアサプライチェーン全体にわたる透明性を強制します。スムーズなApp Store提出を確実にするため、開発チームはファーストパーティコードの要件理由APIの使用状況を監査し、サードパーティ製SDKの依存関係がそのAPI使用に適用されるプライバシーマニフェスト要件を満たしていることを検証し、CocoaPodsのリソースバンドル署名を適切に管理する必要があります。
製品固有のプライバシーマニフェスト宣言については、OpoInstallのドキュメントを確認し、出荷されるマニフェストとアプリケーションの実際の統合およびAppleの最新要件とを比較してください。
関連資料
-
概念:プライバシーマニフェスト、要件理由API、リソースバンドルコード署名、プライバシーレポート、App Storeコンプライアンス
-
技術:Xcode 15+、CocoaPods依存関係マネージャー、Swift Package Manager、OpoInstall iOS SDK
-
標準:Appleプライバシーマニフェスト仕様、App Store審査ガイドライン セクション5.1.1
-
APIおよび設定:
PrivacyInfo.xcprivacy、NSPrivacyAccessedAPITypes、Podfilepost_installフック
公式ドキュメント
Share this article



