ITMS-91053の直し方:Expoでの対処法
著者:Mehdi Azizi
公開・8 分
ITMS-91053は必須理由APIの未宣言エラーです。ios.privacyManifestsにカテゴリと理由コードを追加し、再ビルドしましょう。
ITMS-91053は、ビルドを提出したあとにメールで届く、Appleの自動チェックです。アプリのコードが「必須理由API」(環境設定、ファイルの日付、起動からの経過時間、ディスク容量、キーボード)を使っているのに、その理由がプライバシーマニフェストに書かれていない、という意味です。Expoでは ios.privacyManifests で修正します。Appleが挙げたカテゴリと、実際の使い方を表すコードを書き、新しくビルドし直します。
ミニゲーム付き目覚ましアプリのSolysでは、これらの理由をアプリの設定で宣言しています。この記事では、Solysで実際に使っている宣言、依存関係が使っているAPIを一覧にするコマンド、そして提出前に最終ファイルで確認すべきことを紹介します。
ITMS-91053エラーとは?
メッセージのタイトルは「ITMS-91053: Missing API declaration」です。ビルド内の特定のファイルのコードが、理由の記載が必要なAPIを1つ以上参照している、と書かれています。続いて、対象のカテゴリが一覧で示されます。たとえば NSPrivacyAccessedAPICategoryUserDefaults です。
これらのAPIは、ユーザーに許可を求めません。ただし、端末を識別するのに使えてしまいます。Appleはこれをフィンガープリンティングと呼んでいます。これは、ユーザーがトラッキングを許可していても禁止です。Appleは必須理由APIのページでこう説明しています。すべてのアプリとSDKは、これらを使う理由を宣言しなければなりません。
同じページにルールも書かれています。2024年5月1日以降、App Store Connectは、マニフェストにこれらの使用目的を記載していないアプリを受け付けません。 承認されたビルドで、ただの警告としてこのメールを受け取ったという開発者の報告もあります。でも、それを当てにしないでください。ブロッカーとして扱い、次の提出までに直しましょう。
ほかのITMSエラーと同じく、これはレビュアーによるリジェクトではありません。誰もアプリを開いていません。Appleがバイナリを解析した結果です。
iOSのプライバシーマニフェスト:PrivacyInfo.xcprivacyファイル
プライバシーマニフェストは PrivacyInfo.xcprivacy という名前のファイルで、アプリのバンドルのルートに置かれます。Appleのプライバシーマニフェストのドキュメントによると、収集するデータ、トラッキング、必須理由APIを記述するファイルです。必須理由APIは NSPrivacyAccessedAPITypes 配列に入れます。カテゴリごとに1エントリで、種類と理由のリストを持ちます。
ハマりやすいポイントがあります。マニフェストは自分のバンドルしかカバーしません。 Appleも、これらのAPIを使う実行ファイルや動的ライブラリは、それぞれのバンドルにマニフェストを持つ必要があると書いています。アプリのマニフェストは埋め込まれたフレームワークをカバーしませんし、SDKもアプリのマニフェストを頼ることはできません。
ITMS-90683で求められるInfo.plistの文言と混同しないでください。あちらは許可リクエストのときにユーザーに表示されます。マニフェストを読むのはAppleだけです。
APIの5つのカテゴリと理由コード
カテゴリの正式名は NSPrivacyAccessedAPICategory で始まります。APIと理由の一覧は、NSPrivacyAccessedAPITypeキーのページにあります(2026年10月15日に確認)。
| カテゴリ | 代表的なAPI | よく使う理由 |
|---|---|---|
| UserDefaults | UserDefaults | CA92.1 |
| FileTimestamp | creationDate | C617.1 |
| SystemBootTime | systemUptime | 35F9.1 |
| DiskSpace | volumeAvailableCapacityKey | E174.1 |
| ActiveKeyboards | activeInputModes | 54BD.1 |
よく見かけるコードは次のとおりです。
- CA92.1:アプリが自分専用の環境設定を読み書きする。他のアプリからはアクセスできない。
- 1C8F.1:同じApp Groupのウィジェットや拡張機能と環境設定を共有する。
- C617.1:アプリのコンテナ内にあるファイルの日付やサイズ。
- 3B52.1:ユーザーが選んだファイル。たとえばドキュメントピッカーで選んだもの。
- 35F9.1:アプリ内の2つのイベント間の経過時間を測る、またはタイマーを動かす。
- E174.1:ファイルを書き込む前に空き容量を確認する。ユーザーに見える形で影響がある場合。
- 85F4.1:ディスク容量をユーザーに表示する。
一番広そうな理由ではなく、実際の使い方に合った理由を宣言してください。 Appleは、これらのAPIとそのデータは宣言した理由のためだけに使い、トラッキングには絶対に使わないよう明記しています。C56D.1と0A2A.1の2つはサードパーティSDK専用のコードです。アプリのマニフェストに入れるものではありません。
Expoでプライバシーマニフェストを宣言する
Expoでは、ファイルを自分で書きません。app.jsonまたはapp.configの expo.ios.privacyManifests に記述すると、prebuildが PrivacyInfo.xcprivacy を生成します。これがExpoのプライバシーマニフェストのドキュメントに書かれている方法です。
Solysの設定から実際に抜き出したものです。このキーにはトラッキングと収集データも含まれていますが、ここでは省いています。
{
"expo": {
"ios": {
"privacyManifests": {
"NSPrivacyAccessedAPITypes": [
{
"NSPrivacyAccessedAPIType": "NSPrivacyAccessedAPICategoryUserDefaults",
"NSPrivacyAccessedAPITypeReasons": ["CA92.1", "1C8F.1"]
},
{
"NSPrivacyAccessedAPIType": "NSPrivacyAccessedAPICategoryFileTimestamp",
"NSPrivacyAccessedAPITypeReasons": ["C617.1"]
},
{
"NSPrivacyAccessedAPIType": "NSPrivacyAccessedAPICategorySystemBootTime",
"NSPrivacyAccessedAPITypeReasons": ["35F9.1"]
}
]
}
}
}
}
CA92.1、C617.1、35F9.1は、React Nativeとアプリで使っているExpoモジュールが宣言している内容をそのまま書いたものです。1C8F.1はSolys自身によるものです。アプリがApp Groupを通じてウィジェットと設定を共有しているからです。
知っておきたい落とし穴があります。ios フォルダが生成物でgitに無視されている場合、そのフォルダに手書きした PrivacyInfo.xcprivacy はビルドに入りません。 EASがprebuildをやり直してフォルダを再生成するからです。私も2026年9月9日に自分のプロジェクトで確認しました。prebuildのあと、手書きしたマニフェストが消えていました。宣言は設定に書く必要があります。
最後にもう1つ。マニフェストはバイナリの一部です。リモートアップデートでは変更できません。ビルドし直して、再提出する必要があります。
独自のマニフェストを含むサードパーティSDK
最近のライブラリの多くは、自分のマニフェストを持っています。これらのAPIを使うExpoパッケージは、React Nativeと同じく、ios フォルダに PrivacyInfo.xcprivacy を含んでいます。問題は、それらがアプリにどうリンクされるかです。
Expoのドキュメントは注意を促しています。Appleは、静的リンクされたCocoaPods依存関係のマニフェストをすべて正しく読めるわけではありません。Expoパッケージはまさにこのケースです。そのため、それらの理由をアプリの設定に書き写す必要が出ることがあります。
この手間を減らすために、expo-build-propertiesの ios.privacyManifestAggregationEnabled 設定を使うと、CocoaPods依存関係のマニフェストを1つのファイルにまとめられます。私のプロジェクト(SDK 57)でExpoが生成するPodfileでは、無効にしない限りこの統合が有効になっています。
統合には限界があります。マニフェストを持っている依存関係しか見えません。マニフェストのない古いライブラリは見えないままです。だから、メールに書かれたファイルのパスを読んでください。 どこを直せばいいかがわかります。
| 指摘されたファイル | 修正場所 |
|---|---|
| アプリの実行ファイル | ios.privacyManifests |
.framework | SDKをアップデートする |
拡張機能 .appex | 拡張機能のマニフェスト |
提出前に確認する
Expoは、提出後にAppleのメールを待つ方法を紹介しています。それでも直せますが、やり直すたびにビルドが1回分かかります。私が提出前にやっている4つのチェックを紹介します。
1. 依存関係が宣言している内容を一覧にする。 プロジェクトのルートで実行します。
find node_modules -name PrivacyInfo.xcprivacy -not -path '*/example/*' \
-exec grep -ho "NSPrivacyAccessedAPICategory[A-Za-z]*" {} + | sort | uniq -c
2026年10月15日にSolysで実行したところ、13個のマニフェストと4つのカテゴリが見つかりました。ファイルの日付、環境設定、起動からの経過時間、ディスク容量です。一覧に出たカテゴリは、すべてアプリの最終マニフェストか、それを使うフレームワークのマニフェストに入っている必要があります。
2. 自分のネイティブコードを検索する。 自作モジュール、プラグイン、ウィジェットなどのターゲット。こうしたコードは、どのSDKも代わりに宣言してくれません。
grep -rlE "UserDefaults|systemUptime|mach_absolute_time|creationDate|modificationDate|volumeAvailableCapacity|activeInputModes" \
--include='*.swift' --include='*.m' --include='*.mm' modules plugins targets
フォルダは自分のプロジェクトに合わせて変えてください。Solysでは、この検索でApp Groupによる環境設定の共有が見つかりました。これが1C8F.1を入れている理由です。
3. 生成されたマニフェストを読む。 npx expo prebuild -p ios を実行し、ios/<NomDeTonApp>/PrivacyInfo.xcprivacy を開きます。注意点として、このコマンドは ios フォルダを削除して作り直すことがあります。手で変更を加えている場合は、プロジェクトのコピーで作業してください。
4. 最終ビルドを確認する。 意味のある証拠はこれだけです。expo.devのビルドページからIPAをダウンロードし、Macで次を実行します。
unzip -q MonApp.ipa -d ipa
find ipa/Payload -name PrivacyInfo.xcprivacy
plutil -p ipa/Payload/*.app/PrivacyInfo.xcprivacy
2行目は、アプリとフレームワークを含め、埋め込まれたすべてのマニフェストを一覧にします。3行目はアプリのマニフェストを表示します。これをステップ1の一覧と照らし合わせます。
マニフェストとストアページの内容をそろえる
マニフェストは単独では完結しません。トラッキングや収集データを宣言しているなら、App Storeのページとプライバシーポリシーにも同じことが書かれている必要があります。3つの間に食い違いがあると、あとでガイドライン5.1.1を理由に人によるリジェクトを受けることがあります。そろえるべき内容はアプリのプライバシーポリシーで詳しく解説しています。
トラブルなくビルドを提出するために
ITMSエラーは、読み方さえわかればすぐに直せます。その後に来るリジェクトには、もう少し落ち着いた対応が必要です。進め方はAppleにアプリをリジェクトされたときのページに、よくある理由はAppleがアプリをリジェクトする理由にまとめています。
提出前にプロジェクトを確認したいなら、Apple Review Kitに私のチェックリストと、プロジェクトを見直してくれるClaude Codeのスキルをまとめています。提出で行き詰まって人の目で見てほしいなら、私と1時間のセッションを予約してください。ビデオ通話で、あなたの画面を見ながら一緒にプロジェクトを確認します。初めてのリリースを準備中なら、無料の診断を受けてください。やるべきステップを順番に整理し、AppleのリジェクトAを防ぐための私のチェックリストをお送りします。
よくある質問
ITMS-91053でビルドの提出はブロックされますか?
Appleは、2024年5月1日以降、App Store Connectはこれらのapiの使用目的を記載していないアプリを受け付けないと書いています。一方で、承認されたビルドで警告としてメールを受け取った開発者もいます。どちらの場合でも、次のビルドまでにマニフェストを直してください。
UserDefaultsにはどの理由コードを選べばいいですか?
アプリが自分の環境設定だけを読み書きするならCA92.1です。App Groupを通じてウィジェットや拡張機能と共有するなら、1C8F.1も追加します。C56D.1はサードパーティSDK専用なので、アプリのマニフェストには入れないでください。
各SDKのマニフェストをapp.jsonに書き写す必要がありますか?
必ずしも必要ありません。マニフェストの統合が有効なら、CocoaPods依存関係のマニフェストはPodのインストール時にまとめられます。最終マニフェストにカテゴリが欠けている場合だけ、実際の使い方を表す理由と一緒に書き写してください。
ウィジェットや拡張機能には専用のマニフェストが必要ですか?
Appleによると、これらのAPIを使う実行ファイルを含むバンドルは、それぞれ専用のマニフェストを持つ必要があります。拡張機能は独自のバンドルに入った別の実行ファイルなので、アプリのマニフェストではカバーされません。
ビルドし直さずにITMS-91053を直せますか?
できません。プライバシーマニフェストはバイナリの一部です。設定を直してビルドし直し、TestFlightでテストしてから審査に提出してください。