プライバシーマニフェスト徹底解説:何がデータ収集に該当するのか
2024年5月1日以降、App Store ConnectにアップロードされるすべてのアプリおよびサードパーティSDKは、「必須理由API」の使用、トラッキング動作、収集するデータ型を宣言するプライバシーマニフェストの提出が必須となりました1。このマニフェストはプロパティリスト(PrivacyInfo.xcprivacy)であり、App Storeが提出時に取り込み、プライバシーに関わる既知のAPIサーフェスと照合してバリデーションを行い、ユーザー向けのプライバシー栄養成分ラベルに反映します。マニフェストを省略したアプリ、あるいはプライバシーに関わるAPIを承認済みの理由を宣言せずに使用したアプリは、提出時にITMS-91053または関連するコードで却下されます2。
ほとんどのチームは、マニフェストを一度きりのコンプライアンス作業として扱います。書いて、出して、二度と見ない。しかしマニフェストはそれ以上のものです。アプリがプライベートデータをどう扱うかを成文化する、アプリとAppleの間の構造化された契約であり、この契約が機械可読な形で存在する唯一の場所なのです。注意深く読み解けば、Appleが何をプライバシーに関わると見なしているか(そのサーフェスは多くの開発者が予想するよりも広い)、栄養成分ラベルでユーザーに実際に何が表示されるか(多くのチームが認識しているよりも詳細)、サードパーティSDKに何の開示義務があるか(礼儀ではなく、本物の義務)が見えてきます。
TL;DR
- プライバシーマニフェストには4つのトップレベルセクションがあります:
NSPrivacyTracking、NSPrivacyTrackingDomains、NSPrivacyCollectedDataTypes、NSPrivacyAccessedAPITypes3。 - 必須理由APIリストは、初期段階で5つのカテゴリ(ファイルタイムスタンプ、システム起動時刻、ディスク容量、アクティブキーボード、User Defaults)をカバーします。各カテゴリには承認済みの理由コードのクローズドリストがあり、アプリはいずれかを選択するか、APIを回避するようにコードを書き直す必要があります4。
- トラッキングは狭く定義されています:広告目的またはデータブローカーとの共有のために、ユーザーデータを他社のデータと紐付けることを指します。
NSPrivacyTrackingがtrueの場合、トラッキングに使用されるすべてのドメインをNSPrivacyTrackingDomainsに記載する必要があります3。 - サードパーティSDKは独自のマニフェストを同梱しなければなりません。アプリのマニフェストは、提出時にリンクされたすべてのSDKのマニフェストとマージされます。Appleが公開するリスト上のSDKでマニフェストが欠落していると、アプリは提出をブロックされます5。
- 最大の落とし穴:
UserDefaultsへのアクセスは常に必須理由APIの呼び出しとしてカウントされます。標準的なUserDefaults.standard.set(...)であっても、宣言された理由コードが必要です。
4つのセクション
完全なPrivacyInfo.xcprivacyファイルには、4つのトップレベルキーがあります3。構造はプロパティリストで、生のXMLとして編集することも、Xcodeのプライバシーマニフェストエディタを通じて編集することもできます。
NSPrivacyTracking(Boolean)
アプリまたはSDKが、ユーザーを他社のアプリやWebサイトを横断してトラッキングするかどうかを宣言します。意味的な定義はApp Tracking Transparencyと整合しています。すなわち、ターゲット広告のため、ターゲット広告の配信のため、またはデータブローカーとのユーザーデータ共有のために、ユーザーデータを他社のデータと紐付けることです6。
NSPrivacyTrackingがtrueの場合、トラッキングに使用されるすべてのドメインをNSPrivacyTrackingDomainsリストに記載する必要があります。falseの場合、リストは省略されます(または空になります)。
この狭い定義は重要です。広告を表示する多くのアプリ(Apple独自のSKAdNetworkや非トラッキング広告SDKを介して)は、NSPrivacyTrackingをfalseと宣言できます。トラッキングとは外部データとの紐付けのことであり、広告の表示そのものではありません。
NSPrivacyTrackingDomains(文字列の配列)
アプリまたはSDKがトラッキング目的で接続するドメインのリストです。NSPrivacyTrackingをtrueと宣言したアプリは、すべてのトラッキングエンドポイントをここに列挙する必要があります。
このリストは、App Privacy Reportを通じて実行時に強制されます。アプリがトラッキングとしてフラグ付けされているが宣言されていないドメインに接続すると、App Privacy Reportがその不一致をユーザーに表示します。違反が繰り返されると、App Storeからの削除リスクが生じます。
NSPrivacyCollectedDataTypes(辞書の配列)
App Storeのプライバシー栄養成分ラベルに反映される、構造化されたデータ収集の宣言です3。各エントリはアプリが収集する1つのデータ型を記述し、サブキーを持ちます:
NSPrivacyCollectedDataType:Appleのクローズドリストからのデータ型(例:NSPrivacyCollectedDataTypeName、NSPrivacyCollectedDataTypeEmailAddress、NSPrivacyCollectedDataTypeCrashData)。NSPrivacyCollectedDataTypeLinked:Boolean。データがユーザーのアイデンティティに紐付けられているかどうか。NSPrivacyCollectedDataTypeTracking:Boolean。データがトラッキングに使用されるかどうか。NSPrivacyCollectedDataTypePurposes:配列。データを収集する目的(分析、アプリの機能、広告など)。
このセクションがプライバシー栄養成分ラベルの真実の源(source of truth)となります。栄養成分ラベルの「ユーザーをトラッキングするために使用されるデータ」と「ユーザーに紐付けられるデータ」のカテゴリは、これらのフラグから計算されます。不正確な宣言は不正確な栄養成分ラベルを生み出し、App Storeの執行措置を招くリスクとなります。
NSPrivacyAccessedAPITypes(辞書の配列)
必須理由APIの宣言です。各エントリは、必須理由APIカテゴリと承認済みの理由コードのセットを組み合わせます4。
<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>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
</array>
理由はクローズドリストです。アプリはAppleが公開するカテゴリごとのリストから1つ以上を選択します。任意の文字列は提出時に拒否されます。
5つの必須理由APIカテゴリ
Appleの2024年初期のリストでは、宣言された理由が必要となるAPIを5つのカテゴリで定義しました4:
NSPrivacyAccessedAPICategoryFileTimestamp
ファイルの作成、変更、アクセス時刻を返す任意のAPIでトリガーされます。一般的なエントリポイント:URL.resourceValues(forKeys: [.creationDateKey, ...])、FileManager.attributesOfItem(atPath:)、stat()、fstat()、lstat()。承認済みの4つの理由4:
- DDA9.1. デバイスユーザーにファイルタイムスタンプを表示する。この理由でアクセスした情報はデバイス外に送信できません。
- C617.1. アプリのコンテナ、App Groupコンテナ、またはCloudKitコンテナ内のファイルのファイルメタデータ(タイムスタンプ、サイズなど)にアクセスする。
- 3B52.1. ユーザーが明示的にアクセスを許可したファイルまたはディレクトリ(ドキュメントピッカーなど)のファイルメタデータにアクセスする。
- 0A2A.1. アプリがラッパーを呼び出した時のみ、ファイルタイムスタンプAPIにアクセスするサードパーティSDKラッパー。SDK専用。
ほとんどのアプリは、内部のファイル管理にC617.1(自身のコンテナへのアクセス)を使用します。ユーザー向けUIにファイルの日付を表示するアプリはDDA9.1を使用します。ユーザーが許可したファイル(ドキュメントピッカー、共有エクステンションのターゲット)を読むアプリは3B52.1を使用します。SDK作者は0A2A.1のみを使用します。
NSPrivacyAccessedAPICategorySystemBootTime
mach_absolute_time()、mach_continuous_time()、および関連する稼働時間APIでトリガーされます。プライバシー上の懸念は、システム起動時刻が再インストールを跨いでデバイスを識別するために使用できる、フィンガープリント可能なシグナルだということです。承認済みの3つの理由4:
- 35F9.1. アプリのイベント間の時間間隔を計測したり、タイマーを有効にしたりするためにシステム起動時刻にアクセスする。
- 8FFB.1. アプリ内のイベントの絶対タイムスタンプを計算するためにシステム起動時刻にアクセスする。
- 3D61.1. ユーザーが提出を選択した任意のバグレポートにシステム起動時刻情報を追加する。
ほとんどのアプリはパフォーマンス計測に35F9.1を使用します。8FFB.1は、アプリが起動時刻からイベントタイムスタンプを派生させる場合(デバイスセッションに対する相対値)をカバーします。Date()とDate.nowはこのカテゴリをトリガーしないことに注意してください。これらは異なる時間ソースを使用します。このカテゴリは、特にmach_*_timeファミリーの呼び出しを対象としています。
NSPrivacyAccessedAPICategoryDiskSpace
ディスク容量または空き容量を返すAPIでトリガーされます。これにはURL.resourceValues(forKeys: [.volumeAvailableCapacityKey, ...])やNSFileManagerのファイルシステム属性APIが含まれます。プライバシー上の懸念は、ディスク容量のパターンがフィンガープリント可能なシグナルだということです。承認済みの4つの理由4:
- 854F.1. デバイスユーザーにディスク容量情報をデータ単位またはメディア時間単位で表示する。
- E174.1. ファイル書き込み時、または低ディスク容量を管理する際(アセットをダウンロードするかどうかの判断、キャッシュファイルのクリーンアップなど)にディスク容量をチェックする。
- 7D9E.1. ユーザーが提出を選択した任意のバグレポートにディスク容量情報を含める。
- B728.1. 健康研究アプリが、研究データ収集に影響する低ディスク容量を検出して参加者に通知する。
NSPrivacyAccessedAPICategoryActiveKeyboards
UITextInputMode.activeInputModesでトリガーされます。このリストを読み取るアプリ(通常は動作のローカライズや入力言語の検出のため)は、理由を宣言する必要があります。承認済みの2つの理由4:
- 3EC4.1. デバイス上のアクティブなキーボードを判定するカスタムキーボードアプリ。
- 54BD.1. それに応じてユーザーインターフェースをカスタマイズするためにアクティブキーボード情報にアクセスする(通常は入力言語に応じたUXのため)。
ほとんどのアプリはこのカテゴリを必要としません。コードがサードパーティライブラリ経由で間接的にactiveInputModesを呼び出している場合、そのライブラリのマニフェストがこれを宣言します。
NSPrivacyAccessedAPICategoryUserDefaults
ほぼすべてのアプリが該当するカテゴリです。UserDefaultsへの任意のアクセス(UserDefaults.standard、init(suiteName:)によるApp Groupデフォルト、個別のset/get呼び出し)が要件をトリガーします7。承認済みの4つの理由4:
- CA92.1. アプリ自身(またはアプリのみとペアになっているアプリエクステンション)専用のデータを読み書きするためにUser Defaultsにアクセスする。
- 1C8F.1. 同じApp Groupに属するアプリ、アプリエクステンション、App Clip内でのみデータを読み書きするためにUser Defaultsにアクセスする。
- C56D.1. アプリがラッパーを呼び出した時のみ、User DefaultsAPIにアクセスするサードパーティSDKラッパー。SDK専用。
- AC6B.1. MDM/IT管理者が設定した管理対象アプリ構成を取得するため、または管理者向けのフィードバック情報を保存するためにUser Defaultsにアクセスする。
ほぼすべてのiOSアプリは、少なくとも1つの状態(ユーザーの最後に選択したタブ、好みのソート順、フィーチャーフラグ)にUserDefaults.standardを使用しています。CA92.1の理由がこれをカバーします。App Groupを通じてアプリエクステンション間で状態を共有するアプリは1C8F.1を追加します。SDK作者はC56D.1を使用します。MDM経由でデプロイされ、管理者が設定したキー(例:com.apple.configuration.managed)を読むアプリはAC6B.1を使用します。
注意点:UserDefaultsに触れるサードパーティSDKは、アプリに代わって要件をトリガーします。SDKのマニフェストが理由を宣言する必要があります。SDKがAppleのプライバシーマニフェストを同梱する必要があるSDKのリストに含まれている場合、SDKのマニフェストの欠落はアプリをブロックします。
トラッキングドメイン:実行時バリデーション
NSPrivacyTrackingDomainsは、App Privacy Reportを通じて実行時に強制されます6。アプリがNSPrivacyTracking = trueを宣言すると、システムはすべてのネットワークリクエストを追跡し、宛先を宣言されたリストと照合します。トラッキングのために接続されているが宣言されていないドメインは、App Privacy Reportの「Frequent Locations」と「Other Domains Contacted」セクションに表示されます。
実行時バリデーションは興味深いインセンティブ構造を生み出します。NSPrivacyTracking = false(トラッキングなし)と宣言したアプリが既知のトラッキングドメインに接続していると観測されると、App Privacy Reportでフラグ付けされ、ユーザーからの苦情リスクが生じます。正しい戦略は誠実な宣言です。
SDKの場合、SDKのプライバシーマニフェストがそのトラッキング動作を宣言します。アプリのマニフェストはSDKのトラッキングドメインを列挙する必要はありません。SDKのマニフェストがすでにそれを行っているからです。提出時にAppleがマニフェストをマージし、整合性をチェックします。
SDKマニフェスト:本物の義務
サードパーティSDKのうち、次の2つのカテゴリはプライバシーマニフェストの同梱が必須です5:
- Appleのプライバシーマニフェストを必要とするSDKの公開リスト上のSDK。iOS 26時点で、このリストにはFirebase Analytics、Google Mobile Ads、Adjust、Segment、AppsFlyer、その他約30個が含まれます。
- アプリがリンクするビルド済みバイナリ(XCFramework、静的ライブラリ)として配布されるSDK。
必須SDKのマニフェストなしでSDKをリンクするアプリの提出は、ITMS-91xxxシリーズのエラーで失敗します。これはプライバシーマニフェストの欠落、マニフェスト署名の欠落、またはSDKの名前空間におけるAPI宣言の欠落をカバーします2。修正方法は、マニフェストを同梱するバージョンのSDKに更新するか、SDKを削除することです。
ファーストパーティSDK(チームが社内SDKをアプリに使用する場合)については、フレームワークがAppleのリストに含まれていなければマニフェストをスキップすることもできます。しかし実用的な選択は、それでもマニフェストを同梱することです。将来的なAppleのリスト拡張、将来の監査作業、将来のサードパーティでの再利用、いずれもマニフェストが整っていれば恩恵を受けます。
よくある落とし穴
App Storeの却下ログから見える、5つの繰り返し起こる失敗パターンです:
1. UserDefaults宣言の忘れ。 最も一般的な却下です。アプリがどこか目立たない場所で@AppStorage(UserDefaultsをラップしている)を使用していて、マニフェストがそれを宣言していない。修正:@AppStorage、UserDefaults、またはそれらをラップしたものを使用するすべてのアプリは、CA92.1を伴うNSPrivacyAccessedAPICategoryUserDefaultsが必要です。
2. URLResourceValuesを介した隠れたファイルタイムスタンプアクセス。 URL.resourceValues(forKeys: [.contentModificationDateKey])を介してファイル変更日を読むコードは、呼び出し箇所がstatのように見えなくてもカテゴリをトリガーします。
3. SDKマニフェストへの期待。 アプリチームは、SDKのマニフェストはSDK作者の問題だと考えがちです。確かにそうですが、SDKがマニフェストを同梱するまで、アプリチームの提出は失敗し続けます。
4. トラッキングSDKをリンクしているのにNSPrivacyTracking = false。 Firebase AnalyticsやGoogle Mobile Adsをデフォルト設定でリンクすると、しばしばトラッキング動作がトリガーされます。アプリのマニフェストがNSPrivacyTracking = falseを宣言する一方でSDKのマニフェストがtrueを宣言していると、マージで矛盾としてフラグ付けされます。
5. 古い理由コード。 Appleは承認済みの理由コードを時折更新します。2024年に有効だったコードが置き換えられたり拡張されたりすることがあります。修正方法は、古いマニフェストをそのまま流用するのではなく、メジャーリリースのたびに現在の公開リストを再確認することです。
バリデーションツール
提出前に実行する価値のある3つのチェックです:
Xcodeの「Generate Privacy Report」アーカイブワークフロー。 Product > Archiveの後、Organizerで「Generate Privacy Report」アクションが提供され、アプリとリンクされたすべてのSDKのマニフェストから集約レポートが生成されます。このレポートはApp Store Connectが取り込むものであり、ローカルで実行することは提出前のドライランに最も近い手段です。
必須理由APIの静的解析。 オープンソースのツールが、5つのカテゴリをトリガーするAPI呼び出し箇所をプロジェクト内でスキャンします。コミュニティ管理のstelabouras/privacy-manifestCLIはSwiftソースとxcframeworkバイナリをパースし、宣言済みおよび未宣言の理由コードを表面化します。crasowas/app_store_required_privacy_manifest_analyserも同様のスキャンを提供します。どちらも、宣言漏れに対する有用な提出前のキャッチを提供してくれます。
App Privacy Reportのクロスチェック。 iOSのApp Privacy Reportモード(設定 > プライバシーとセキュリティ > Appプライバシーレポート)でアプリを実行します。アプリが接続するドメインがレポートに表示されるので、マニフェストのトラッキング宣言と照合します。
このパターンがiOS 26+アプリにもたらす意味
3つの要点です。
-
プライバシーマニフェストをチェックボックスではなく、構造化された契約として扱うこと。 マニフェストは、アプリがプライベートデータをどう扱うかの唯一の機械可読な記録です。一度作って永遠に放置するというのは、半年後にSDKの更新がマニフェストの必須サーフェスを静かに拡張したときに却下される道です。
-
リリースごとに
UserDefaultsとファイルタイムスタンプのアクセスを監査すること。 この2つのカテゴリは、コードベースとともに静かに成長します。リファクタで追加された@AppStorageを使用するSwiftUIビューはNSPrivacyAccessedAPICategoryUserDefaultsをスコープに引き込みます。後から追加されたファイル一覧機能はNSPrivacyAccessedAPICategoryFileTimestampを引き込みます。毎回再検証してください。 -
独自のマニフェストを同梱するSDKを使うこと。 サードパーティSDKを評価する際、プライバシーマニフェストの存在と品質は今や品質シグナルとなります。マニフェストのないSDKは、アプリチームに上流と戦うことを強います。マニフェスト付きのSDKは、マージにきれいに収まります。
Apple Ecosystemクラスター全体:型付きApp Intents、MCPサーバー、ルーティングの問題、Foundation Models、ランタイム対ツーリングLLMの区別、3つのサーフェス、単一の真実の源パターン、2つのMCPサーバー、Apple開発のためのhooks、Live Activities、watchOSランタイム、SwiftUIの内部構造、RealityKitの空間メンタルモデル、SwiftDataスキーマ規律、Liquid Glassパターン、マルチプラットフォーム展開、プラットフォームマトリックス、Vision framework、Symbol Effects、Core MLによる推論、Writing Tools API、Swift Testing、私が書くことを拒むもの。ハブはApple Ecosystem Seriesにあります。AIエージェントを伴うiOSのより広い文脈については、iOS Agent Developmentガイドをご覧ください。
FAQ
NSPrivacyTrackingとNSPrivacyCollectedDataTypeTrackingの違いは何ですか?
NSPrivacyTrackingはアプリレベルのboolです。このアプリは(Appleの狭い定義に従って)ユーザーをトラッキングするのか、しないのか。NSPrivacyCollectedDataTypeTrackingはデータ型単位です。アプリが収集する特定のデータ型について、そのデータがトラッキングに使用されるのか。アプリはトラッキングなしでデータを収集できます(企業を跨いで紐付けない分析)。データ型単位のフラグは、各特定のデータ型がトラッキング動作に寄与するかどうかをキャプチャします。
内部のみのTestFlightアプリにもプライバシーマニフェストは必要ですか?
必要です。プライバシーマニフェストの強制は、TestFlightビルドを含むApp Store Connectへの提出時に実行されます。マニフェストのない内部ベータも、公開リリースと同じITMS-91053チェックで失敗します。
必須理由APIを使用せずに宣言した場合はどうなりますか?
機能的には何も起こりません。マニフェストはAPIサーフェスの上限を宣言しているので、未使用カテゴリの宣言は無害です。コストはドキュメントのドリフトです。将来のメンテナーは、宣言が現在のコードを反映していると考えるかもしれませんが、実際には呼び出しが削除されている場合があります。正しい動きは、アプリが実際に使用するものを宣言し、メジャーリリースごとに監査することです。
元の5つを超える必須理由APIカテゴリはありますか?
iOS 26時点で、元の5つのカテゴリ(ファイルタイムスタンプ、システム起動時刻、ディスク容量、アクティブキーボード、User Defaults)が標準的なリストとして残っています4。Appleは時間とともにカテゴリ内に承認済みの理由コードを追加してきましたが、カテゴリリスト自体は拡張していません。追加についてはAppleの必須理由APIドキュメントページを見守ってください。
プライバシーマニフェストはApp Tracking Transparencyとどう関わりますか?
App Tracking Transparency(ATT)は、クロスアプリトラッキングの実行時のパーミッションプロンプトを管理します。プライバシーマニフェストはアプリの意図を静的に宣言します。両者は補完的です。クロスアプリトラッキングを行うアプリは、マニフェストでNSPrivacyTracking = trueを宣言し、実行時にATTパーミッションをリクエストします。NSPrivacyTracking = falseを宣言するアプリはATTをリクエストすべきではありません(クロスアプリトラッキングがないということは、プロンプトが不要だということです)。
参照
-
Apple Developer Documentation:Privacy manifest files。フォーマットのリファレンスと2024年5月1日の強制タイムライン。 ↩
-
Apple Developer:App Store Connect submission errors ITMS-91053(API宣言の欠落)と関連コードをカバー。 ↩↩
-
Apple Developer Documentation:App privacy configuration。4つのトップレベルキー(NSPrivacyTracking、NSPrivacyTrackingDomains、NSPrivacyCollectedDataTypes、NSPrivacyAccessedAPITypes)とそのスキーマ。 ↩↩↩↩
-
Apple Developer Documentation:Describing use of required reason API。承認済みの理由コードを伴う5つの必須理由APIカテゴリ。 ↩↩↩↩↩↩↩↩↩
-
Apple Developer:Third-party SDK privacy manifest requirements。プライバシーマニフェストを同梱しなければならないSDKのリスト。 ↩↩
-
Apple Developer Documentation:User privacy and data use。トラッキングの狭い定義とApp Tracking Transparencyフレームワーク。 ↩↩
-
Apple Developer Documentation:
NSPrivacyAccessedAPICategoryUserDefaults。@AppStorageベースのラッパーを含むすべてのUserDefaultsアクセスをカバーするカテゴリ。 ↩