取り組みの背景:なぜプライバシーマニフェストが必要なのか
2024年5月以降、App Storeへの新規申請・アップデートには**プライバシーマニフェスト(PrivacyInfo.xcprivacy)**の提出が義務付けられましました。これは、アプリが使用するAPIの目的やデータ収集の内容をAppleに申告するための仕組みです。
プライバシーマニフェストの設定を怠ると、App Store審査でリジェクトされるだけでなく、ITMS-91053などのエラーメールが届くことがあります。しかし、正確な設定は複雑で、どのAPIがどのカテゴリに該当するかを手動で調べるのは時間がかかります。
この記事で学べること:
- プライバシーマニフェストの基礎知識と必須項目
- AntigravityによるAPIスキャンの自動化
- PrivacyInfo.xcprivacyの自動生成ワークフロー
- App Store審査を通過するための確認チェックリスト
対象読者は、iOSアプリ開発の基礎知識があり、プライバシーマニフェスト対応を効率化したい方です。Antigravityの基本操作については、AntigravityでiOSアプリを作る入門ガイドも合わせてご参照ください。
プライバシーマニフェストの基礎知識
対象となるAPIカテゴリ
Appleが指定する「Required Reason API」は、主に以下のカテゴリに分類されます。
- File timestamp APIs — ファイルの作成日時・更新日時へのアクセス
- System boot time APIs — デバイスの起動時間の取得
- Disk space APIs — ディスク容量・空き容量の取得
- Active keyboard APIs — 現在使用中のキーボード情報の取得
- User defaults APIs —
UserDefaultsを使ったデータの読み書き
これらのAPIを使用する場合、その「理由コード(Reason Code)」をマニフェスト内に記述する必要があります。理由コードはAppleが定めた固定の文字列で、たとえばUserDefaultsを設定の保存目的で使う場合はCA92.1などが該当します。
PrivacyInfo.xcprivacyのファイル構造
マニフェストファイルはXML形式のプロパティリスト(plist)で、以下のような構造になっています。
<?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>NSPrivacyCollectedDataTypes</key>
<array>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeDeviceID</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<false/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
</array>
<!-- APIアクセスの理由 -->
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</array>
<!-- トラッキング -->
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
</dict>
</plist>この構造を手動で記述するのは煩雑です。特にサードパーティライブラリを多数使用している場合、各ライブラリのマニフェストとの整合性を保つのが難しくなります。
Step 1:Antigravityでプロジェクトをスキャンする
エージェントへの指示
Antigravityのエディタを開き、以下のようにエージェントに指示します。
以下の作業を行ってください:
1. このXcodeプロジェクト内で使用されている
Required Reason APIをすべてスキャンしてください。
対象:UserDefaults, FileManager, ProcessInfo,
UIDevice, UITextInputMode など
2. 各APIの使用箇所(ファイル名・行番号)を一覧化してください
3. Apple公式の理由コードに基づき、適切なNSPrivacyAccessedAPITypeReasons
を提案してください
4. PrivacyInfo.xcprivacyファイルの内容を生成してください
自動スキャンの結果例
Antigravityはプロジェクト内のSwiftファイルを解析し、以下のようなレポートを返してくれます。
スキャン結果:
[UserDefaults]
- AppSettings.swift:23 - ユーザー設定の保存・読み込み
- OnboardingManager.swift:45 - オンボーディング完了フラグ
→ 推奨理由コード: CA92.1(アプリの設定保存)
[FileManager.attributesOfItem]
- CacheManager.swift:67 - キャッシュファイルのタイムスタンプ確認
→ 推奨理由コード: C617.1(ファイル管理)
[ProcessInfo.systemUptime]
- AnalyticsHelper.swift:89 - セッション時間の計算
→ 推奨理由コード: 35F9.1(セッション分析)
このように、コードベース全体を俯瞰してAPIの使用状況を把握できます。
Step 2:PrivacyInfo.xcprivacyを自動生成する
生成コマンドの例
スキャン結果をもとに、Antigravityに生成を依頼します。
スキャン結果をもとに、以下の条件でPrivacyInfo.xcprivacyを生成してください:
- NSPrivacyTracking: false(広告トラッキングなし)
- NSPrivacyTrackingDomains: 空配列
- NSPrivacyCollectedDataTypes: デバイスIDなし、クラッシュデータあり
- 検出されたAPIすべての理由コードを含める
- Xcode 15以降の形式に準拠する
生成されたファイルの確認
Antigravityが生成したファイルは、/YourApp/YourApp/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>NSPrivacyAccessedAPITypes</key>
<array>
<!-- UserDefaults: アプリ設定の保存 -->
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
<!-- FileManager: キャッシュ管理 -->
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
<!-- ProcessInfo: セッション計測 -->
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategorySystemBootTime</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>35F9.1</string>
</array>
</dict>
</array>
<key>NSPrivacyCollectedDataTypes</key>
<array>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeCrashData</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<false/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
</array>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
</dict>
</plist>Step 3:Xcodeプロジェクトへの組み込み
ファイルの追加手順
生成したファイルをXcodeプロジェクトに追加するには、以下の手順を踏みます。
Xcodeで以下の手順を案内してください:
1. PrivacyInfo.xcprivacyをメインターゲットのフォルダにドラッグ&ドロップ
2. "Add to targets" でメインアプリターゲットを選択
3. ターゲットの "Build Phases → Copy Bundle Resources" に追加されているか確認
4. 追加後にビルドエラーがないか確認するコマンドを教えてください
Antigravityはターミナルコマンドも提案してくれます。
# プロジェクトをビルドして警告・エラーを確認
xcodebuild -project YourApp.xcodeproj \
-scheme YourApp \
-configuration Debug \
build 2>&1 | grep -E "(error:|warning:|ITMS)"サードパーティライブラリの確認
使用しているライブラリが独自のプライバシーマニフェストを持っているかも確認が必要です。
以下の処理を行ってください:
1. Package.resolved または Podfile.lock を解析して
使用中のサードパーティライブラリを一覧化する
2. 各ライブラリが PrivacyInfo.xcprivacy を提供しているか確認する
(GitHubの最新リリースページを参照)
3. 提供されていないライブラリについては、手動追加が必要な
APIアクセスコードを検出してリストアップする
Step 4:App Store Connect での検証
Privacy Nutrition Labels との整合性チェック
プライバシーマニフェストの内容は、App Store Connectで設定するPrivacy Nutrition Labelsと一致している必要があります。
以下の検証を行ってください:
1. PrivacyInfo.xcprivacyのNSPrivacyCollectedDataTypesを解析する
2. App Store Connectで申告すべきデータタイプの一覧を生成する
3. 不整合が生じそうな箇所にコメントを追記する
よくあるリジェクト原因と対策
Antigravityに以下を尋ねることで、審査通過の可能性を高められます。
# ITMS-91053エラーの原因を特定するスクリプト例
#!/bin/bash
echo "=== プライバシーマニフェスト検証 ==="
# plistファイルの存在確認
if [ ! -f "YourApp/PrivacyInfo.xcprivacy" ]; then
echo "❌ PrivacyInfo.xcprivacy が見つかりません"
exit 1
fi
# XMLの妥当性確認
plutil -lint "YourApp/PrivacyInfo.xcprivacy"
if [ $? -eq 0 ]; then
echo "✅ XMLフォーマット: 正常"
else
echo "❌ XMLフォーマット: エラーがあります"
fi
# NSPrivacyTrackingの確認
TRACKING=$(plutil -extract NSPrivacyTracking raw "YourApp/PrivacyInfo.xcprivacy" 2>/dev/null)
echo "📋 NSPrivacyTracking: $TRACKING"
echo "=== 検証完了 ==="期待する出力:
=== プライバシーマニフェスト検証 ===
✅ XMLフォーマット: 正常
📋 NSPrivacyTracking: 0
=== 検証完了 ===
よくあるエラーと対処法
エラー①:ITMS-91053 Missing Privacy Manifest
原因: PrivacyInfo.xcprivacyがバンドルに含まれていません。
対処法:
XcodeのBuild Phases → Copy Bundle Resourcesにファイルが含まれているか確認してください。Antigravityに「ITMS-91053エラーが出ています、PrivacyInfo.xcprivacyの配置を確認してください」と尋ねると、確認手順を案内してもらえます。
エラー②:理由コードの不一致
原因: 使用しているAPIに対応する理由コードが指定されていない、または誤っています。
対処法:
Antigravityに「NSPrivacyAccessedAPICategoryUserDefaultsの有効な理由コードをすべて教えてください」と質問し、Appleのドキュメントに基づいた最新の理由コードを確認しましょう。
エラー③:サードパーティライブラリのマニフェスト未対応
原因: 使用しているライブラリが古いバージョンでプライバシーマニフェストを提供していません。
対処法: Antigravityに「[ライブラリ名]のプライバシーマニフェスト対応状況と代替策を調べてください」と依頼してください。最新バージョンへのアップデートや、そのライブラリの代替手段を提案してもらえます。
応用:CI/CDパイプラインへの統合
継続的にマニフェストを検証するには、GitHub Actionsなどに組み込むのが効果的です。
# .github/workflows/privacy-manifest-check.yml
name: Privacy Manifest Validation
on:
pull_request:
paths:
- '**/*.swift'
- '**/PrivacyInfo.xcprivacy'
jobs:
validate:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Validate Privacy Manifest
run: |
# マニフェストの存在確認
if [ ! -f "YourApp/PrivacyInfo.xcprivacy" ]; then
echo "::error::PrivacyInfo.xcprivacy が見つかりません"
exit 1
fi
# XML妥当性チェック
plutil -lint "YourApp/PrivacyInfo.xcprivacy"
echo "✅ プライバシーマニフェスト: 検証OK"このワークフローをAntigravityで設定する方法については、Antigravity × Xcode 26 × iOS 26 — WWDC 2026 に備えるiOS開発完全ガイドも参考にしてください。
まとめ
iOSアプリのプライバシーマニフェスト対応は、Antigravityを活用することで大幅に効率化できます。手動でAPIを洗い出す手間が省け、理由コードの選定ミスも防ぐことができます。
主なポイントをまとめると、Antigravityによる自動スキャンでRequired Reason APIの使用状況を把握できること、スキャン結果をもとにPrivacyInfo.xcprivacyを自動生成できること、CI/CDパイプラインに組み込むことで継続的な品質管理が可能なこと、の3点が挙げられます。
プライバシーマニフェスト対応が完了したら、次のステップとして非同期処理の最適化も検討してみてください。より複雑なiOSアプリ開発を目指す方には、Antigravity × Swift Concurrency 完全マスターガイドで async/await や Actor の実践的な使い方を深掘りしています。