appstore-review について
iOSアプリの審査準備を支援する監査スキルです。コード、権限、プライバシー、提出メタデータを確認し、PASS、WARN、FAILで結果をまとめます。
主な機能
- 01コードと権限の確認
- 02プライバシーマニフェストとデータ監査
- 03サブスクリプションとIAPの確認
- 04App Storeメタデータのチェックリスト
- 05PASS、WARN、FAILによる結果報告
活用シーン
- 01iOSアプリの提出前確認
- 02サブスクリプション画面の表示内容確認
- 03プライバシー宣言とデータ利用の監査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ 3paws-ai/ mobile-ai-skills --skill appstore-reviewインストール後、Claude Code で/appstore-reviewを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
README.mdreferences/appstore-review-ref.mdsetup-guide.md詳細
App Store 審査準備状況の監査
目的
提出前に、App Store で警告や却下につながる可能性のある問題をすべて見つけます。このスキルでは、コード/エンタイトルメントと提出用メタデータの2つの観点から監査を実行します。Apple の 2024 年透明性レポートのデータに基づき、却下される頻度が高い順(リスクが高い順)に並んでいます。
参考ファイル:references/appstore-review-ref.md には、各チェック項目の根拠となる Apple のドキュメント、WWDC セッション、コミュニティリソースの全一覧が記載されています。
監査の実行方法
実行時には、以下のすべてのセクションを順番に実行してください。各チェック項目について、次の手順に従います。
- プロジェクト内の関連ファイルや設定を調べます
- 1 行の説明を添えて、PASS、WARN、またはFAILを報告します
- 最後に、すべての結果をまとめた表を作成します
セクションを省略してはいけません。実行するセクションをユーザーに尋ねず、すべて実行してください。
トラック 1 — コードとエンタイトルメントの監査
1.1 アプリの完全性(ガイドライン 2.1)— 却下理由第 1 位
未解決の却下の 40% 以上を占めます。
- クリーンインストール後、アプリがクラッシュせずに起動する
- UI のどこにもプレースホルダーや Lorem Ipsum のテキストがない(すべての
.swiftファイルとアセットカタログを検索する) - ユーザーに見える未完了の作業を示す TODO/FIXME/HACK コメントがない
- すべてのナビゲーション経路が機能する(行き止まりの画面や未実装のボタンがない)
- すべての URL(サポート、プライバシーポリシー、利用規約)が有効で、正しく読み込まれる
- ログイン/オンボーディングのフローがエラーなく完了する
- ディープリンクとユニバーサルリンクが正しく解決される(該当する場合)
- 機内モードでも動作する、またはネットワークがない状態を適切に処理する
1.2 プライバシーマニフェスト(ITMS-91053/ITMS-91061)— 自動却下
2024 年 5 月 1 日以降、必須となっています。宣言がない場合、人による審査の前に却下されます。
- アプリのターゲットに
PrivacyInfo.xcprivacyがある - 5 つの Required Reason API カテゴリすべてについて、使用状況を確認する:
NSPrivacyAccessedAPICategoryFileTimestamp—creationDate、modificationDate、stat()NSPrivacyAccessedAPICategorySystemBootTime—systemUptime、mach_absolute_time()NSPrivacyAccessedAPICategoryDiskSpace—volumeAvailableCapacityKey、NSFileSystemFreeSizeNSPrivacyAccessedAPICategoryActiveKeyboards—UITextInputMode.activeInputModesNSPrivacyAccessedAPICategoryUserDefaults—UserDefaults
- 使用している Required Reason API ごとに、承認済みの理由コードを含む対応する宣言がある
-
NSPrivacyCollectedDataTypesに、アプリが収集するすべてのデータが正確に反映されている -
NSPrivacyTrackingが正しく設定されている(IDFA/ATT を使用する場合のみtrue) - Apple のリストに記載されているサードパーティ製 SDK に、それぞれ独自のプライバシーマニフェストが含まれている
- Xcode Organizer でプライバシーレポートを生成し、宣言内容を照合する
1.3 サブスクリプションと IAP のコンプライアンス(ガイドライン 3.1.1 / 3.1.2)
サブスクリプションアプリで、リスクが2番目に高い領域です。
ペイウォール UI — 必須の開示事項(ガイドライン 3.1.2(c) + Schedule 2 §3.8(b)):
- サブスクリプション名と期間が表示されている
- 更新時の合計金額が最も目立つ価格表示になっている(月額換算ではない)
- 無料トライアルの期間とトライアル終了後の価格が表示されている(該当する場合)
- 利用規約へのタップ可能なリンクがあり、機能している
- プライバシーポリシーへのタップ可能なリンクがあり、機能している
- 「購入を復元」ボタン/仕組みにアクセスできる(ガイドライン 3.1.1)
- ダークパターンがない:偽の緊急性をあおらない、年間料金を隠さない、明確な開示なしに高額な選択肢を事前選択しない
- サブスクリプションの自動更新に関する文言がある(例:「サブスクリプションは、現在の期間終了の少なくとも24時間前までにキャンセルされない限り、自動更新されます」)
- キャンセル/管理の手順が記載されている(または
AppStore.showManageSubscriptions(in:)を使用する)
注: アプリ内での開示だけでは不十分です。セクション 2.1 では、利用規約とプライバシーポリシーへのリンクが App Store Connect の App Store の説明または EULA フィールドにも記載されていることを確認します。Apple は両方を必須としています。
StoreKit の実装:
- StoreKit 2 を使用している(非推奨の StoreKit 1 /
SKPaymentQueueではない) - トランザクションが検証されている(JWS 検証または RevenueCat による処理)
- 購入、復元、サブスクリプションの期限切れ後に、エンタイトルメントが正しく更新される
- 猶予期間の処理が実装されている(App Store Connect で有効にしている場合)
- アプリ内でサンドボックス購入が正しく動作する
App Store Connect の設定:
- IAP 製品が「審査提出の準備中」に設定され、審査提出に追加されている(その提出内でのステータスは「審査準備完了」)、または「承認済み」になっている。単独の「提出準備完了」という表記は、現在の審査提出モデルより前のものです
- IAP のApp Review スクリーンショットは、実際の購入 UI をアプリ対応デバイスのスクリーンショットサイズ(例:6.9" = 1320×2868)で撮影した未加工の画像である — 1024×1024 ではない(これは隣接するプロモーション画像フィールド用であり、審査スクリーンショットとしては却下されます)
- 各 IAP に審査用スクリーンショットがある(複数の SKU を表示した購入シートの共通キャプチャを、それら各 SKU に使用してもかまいません)
- IAP ごとの審査メモに、アプリ内で購入画面に移動する方法、購入によって利用可能になる機能、復元の仕組み、アカウントが不要な場合はその旨を記載している
- サブスクリプショングループが正しく設定されている
- 必要なすべての地域の価格が設定されている
提出の構成: どの製品をいつアプリのバージョンとともに提出する必要があるかという審査提出の組み立てルールについては、セクション 2.7 で説明します。初めての IAP が原因で実際の提出が却下された事例があります。
1.4 プライバシーとデータの取り扱い(ガイドライン 5.1)
- App Store Connect にプライバシーポリシーの URL が設定され、アクセス可能である
- アプリ内からもプライバシーポリシーの URL にアクセスできる
- App Store Connect の App Privacy のプライバシーラベルが、実際のデータ収集と一致している
- アプリが IDFA を使用する場合、ATT プロンプトが実装されている(
ATTrackingManager.requestTrackingAuthorization) - サードパーティの AI を使用する場合、データ共有について明示的な同意を得ている(ガイドライン 5.1.2(i)、2025年11月に適用開始)
- アプリでアカウントを作成できる場合、アカウント削除の選択肢を提供している(ガイドライン 5.1.1(v))
権限リクエスト前の説明文(ガイドライン 5.1.1(iv)):
- オンボーディング/説明画面を grep し、システムの権限プロンプトが表示される前に「有効にする…」「許可する…」「オンにする…」とラベル付けされたボタンが表示されないことを確認する — これらのボタンには中立的な文言(「続ける」/「次へ」)を使用する必要があります。システムプロンプトへの回答を事前に促すボタンは、5.1.1(iv) による却下の対象です
- 説明画面の本文で説明することは問題なく、推奨されています — 中立的にする必要があるのはボタンのラベルのみです
- 拒否後にユーザーを「設定」へ誘導する画面は対象外です(「設定を開く」と表示してもかまいません)
1.4b 顔および生体データ(ガイドライン 2.1 / 5.1)
アプリで Vision /顔検出 API を少しでも使用している場合は、収集を一切行わず、すべてデバイス上で処理している場合でも、審査時に Apple の標準的な顔データに関する 6 つの質問への回答を求められることを想定してください。質問の項目は次のとおりです。
- 収集する顔データと、その使用方法
- 顔データを第三者と共有するか(共有する場合は共有先)
- 顔データの保持期間
- 顔データを削除するか、また削除する場合はその方法
- 顔データの保存場所(デバイス上かサーバー上か)
- プライバシーポリシーのどこにこの情報を開示しているか(Apple は該当する文章の引用を求めます)
- プライバシーポリシーに、収集、使用、共有、保持、削除、保存について網羅した、明示的で引用可能な**「顔データ」**のセクションがあること。「写真」のような一般的な表現では審査担当者の要件を満たしません
- そのセクションで、バイナリ内の顔検出の呼び出し箇所をすべて正確に列挙していること。Apple は実際の API 使用状況と照合して申告内容を検証します(エクスポート時の検出を見落とすだけでも不合格になる可能性があります)
- 顔の特徴量(Faceprint)/顔認識 API を使用していないこと。使用している場合は、ADPLA §3.3.3(C)/(K) への準拠を文書化していること
- サードパーティの AI 処理業者の保持に関する申告が、その処理業者自身が文書化した保持ポリシーと一致していること。契約上の Zero Data Retention(ZDR)契約が実際に締結されている場合に限り、保持期間がゼロと申告すること
- 6 つの標準質問への回答案を、提出時のメタデータとともに保管していること(注:App Store Connect の返信欄は 4,000 文字までなので、ポリシーの長い引用文は抜粋する必要があります)
1.5 App Transport Security
- Info.plist に
NSAllowsArbitraryLoads = YESがないこと(正当な理由がある場合を除く) - すべてのネットワーク接続で HTTPS / TLS 1.2 以降を使用していること
-
NSExceptionDomainsによるドメイン例外がある場合、それぞれに正当な理由が文書化されていること
1.6 輸出コンプライアンス
- Info.plist で
ITSAppUsesNonExemptEncryptionが設定されていること - 標準的な HTTPS(URLSession)のみを使用する場合、値が
NO(免除)であること - 独自の暗号化を使用する場合、値が
YESであり、CCATS / ERN の文書があること
1.7 エンタイトルメントと機能
- 必要なエンタイトルメントのみが設定されていること(未使用の機能がないこと)
- アプリ ID が明示的に指定されていること(ワイルドカードではないこと)。これは IAP に必須です
- Signing & Capabilities で In-App Purchase 機能が有効になっていること
- Push Notification エンタイトルメントは、プッシュ通知を実装する場合に限り設定されていること
- Apple Pay を使用しない場合、
com.apple.developer.in-app-paymentsが設定されていないこと(これは IAP のエンタイトルメントではありません)
プラットフォームの対象(スクリーンショットの要求に影響します — 2.2 を参照):
-
TARGETED_DEVICE_FAMILYが製品の対象と一致していること(iPhone のみの場合は1。Xcode テンプレートのデフォルトである"1,2"は iPad にも対応すると宣言するため、App Store Connect で iPad のスクリーンショットを求められます) -
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD、Mac Catalyst、およびその他の Designed for 対象が、テンプレートのデフォルトのままにせず、意図的に設定されていること - 注:iPad を対象として宣言していない場合でも、審査時に互換モードで iPad 上でアプリが実行されることがあります
1.8 コード品質に関する確認事項
- 本番コードに
print()文がないこと(os.Loggerを使用してください) - テスト以外で強制アンラップ(
!)を使用していないこと - ソースコードに API キー、シークレット、トークンをハードコードしていないこと
- 内部用/デバッグ用 URL、テストサーバー、ステージング環境のエンドポイントへの参照がないこと
- リリースビルドでテスト用 UI が表示される
#if DEBUGブロックがないこと
トラック 2 — 提出メタデータのチェックリスト
2.0 アプリ情報に関する一度限りの必須項目
アプリレベルの以下の設定が完了するまで、審査に追加ボタンが表示されない状態になります — 年齢制限に関する質問票(セクション 2.5)と同種の必須項目です。
- App Information ページでコンテンツ権利情報を申告していること(アプリに第三者のコンテンツが含まれるかどうか。「はい」か「いいえ」で回答します。回答はアプリによって異なります。通常、ユーザー生成コンテンツのみの場合は「いいえ」、外部コンテンツやウェブコンテンツを表示する場合は「はい」です)
- 初回の審査に追加の前に、App Information の必須項目をすべて入力していること
2.1 App Store Connect のメタデータ
- App Name:30文字以内で、キーワードを詰め込まない
- Subtitle:30文字以内
- Description:冒頭の1行で関心を引き、機能よりもメリットを訴求し、プレースホルダーテキストを含めない
- Keywords:100文字以内で、カンマ区切りにし、カンマの後にスペースを入れず、タイトルに含まれる単語と重複させない
- Promotional Text:設定済み(新しいバージョンを公開せずに編集可能)
- What's New:平易な言葉で、ユーザーのメリットを中心に記載
- Support URL:設定済みで、正しく読み込まれる
- Privacy Policy URL:設定済みで、正しく読み込まれる
- アプリにサブスクリプションがある場合:App Description に Terms of Use(EULA)のリンクを記載するか、App Store Connect でカスタム EULA を設定
- アプリにサブスクリプションがある場合:App Description に Privacy Policy のリンクを記載
- アプリにサブスクリプションがある場合:App Description に自動更新に関する説明(価格、期間、キャンセル方法)を記載
- Copyright:現在の年と正しい事業体名を設定
- Primary Category と任意の Secondary Category を適切に設定
2.2 スクリーンショットとプレビュー
- 少なくとも1セットのスクリーンショットを、正確な iPhone のアップロード枠仕様で用意:6.9" = 1320×2868 または 6.5" = 1284×2778 — その他の実機サイズ(例:6.3")は有効なアップロード枠ではありません
- ユニバーサルアプリの場合は iPad のスクリーンショットを用意
- iPhone 以外(iPad、visionOS)のスクリーンショットが必要な場合は、対象の宣言済み配信先を再監査します — セクション 1.7 を参照してください(通常は
TARGETED_DEVICE_FAMILY/設計時のデフォルト設定が原因です) - スクリーンショットは JPEG または PNG 形式
- プレースホルダーや明らかに偽物のスクリーンショットを使用しない
- App Preview は30秒以内、H.264 または ProRes 422(使用する場合)
- スクリーンショットには実際のアプリ UI を表示(誤解を招く表示は不可)
2.3 アプリアイコン
- 1024x1024 の App Store アイコンを用意
- アイコンに透明部分やアルファチャンネルが含まれていない
- アイコンが他のアプリのアイコンと重複していない
- アプリ内のアイコンが App Store のアイコンと一致している
2.4 バージョンとビルド
- バージョン番号を適切に更新(セマンティックバージョニング)
- ビルド番号を前回のアップロードから増加
- アプリターゲットとエクステンションターゲット(ある場合)の両方で、バージョン/ビルド番号が一致
- 現在必須の SDK バージョンでビルド
2.5 年齢制限指定
- App Store Connect で年齢制限に関する質問票に回答済み
- 実際のコンテンツを反映したレーティング(該当する場合は特に AI/チャットボットのコンテンツ)
- 拡張年齢制限(13+/16+/18+)が適用される場合:2026年1月31日の期限までに回答を更新
2.6 審査メモ
- アプリにログイン機能がある場合:審査メモにデモ用の認証情報を記載
- アプリに特別なフロー(サブスクリプション、ハードウェア機能)がある場合:手順を記載
- アプリがデバイス上の AI を使用する場合:デバイス/OS の要件について記載
- アプリにサブスクリプションがある場合:アプリ内のサブスクリプションに関する説明の場所(ペイウォールの場所、設定など)を審査メモに記載
- 審査担当者向けの連絡先情報が最新である
2.7 審査提出物の構成(ガイドライン 2.1(b))
App Store Connect では、バージョンとその IAP が 1 つの審査提出物にまとめられます。 以下の構成ルールは UI 上ではわかりにくく、2.1(b)「App Completeness」による 却下の原因になります。
- アプリで初めて提供する IAP は、アプリのバージョンと同じ審査提出物に必ず含める必要があります。 製品が「Prepare for Submission」にある状態でバージョンだけを提出すると、2.1(b) による却下(「アプリが製品への参照を含んでいますが、関連する In-App Purchase 製品が提出されていません」)につながります。Apple が指定する対処方法は、IAP と新しいバイナリを提出することです。
- 各プラットフォームで同時に提出できる審査提出物は 1 つです。 バージョンが Waiting for Review/In Review の間に審査に送信した IAP は、別のドラフト提出物に入り、提出できず、自動的に同じ提出物に含まれることもありません。バージョンの提出物がすでに確定している場合、UI から IAP を追加する方法はありません。却下または承認されるまで待つ必要があります。
確認項目:
- バイナリから参照されるすべての IAP 製品が、単に「ready」の状態にあるだけでなく、バージョンと同じ審査提出物に含まれている
- 初回の IAP:バージョンの Add for Review をクリックする前に、バージョンの提出物に含まれていることを確認
- IAP を含めずにバージョンがすでに審査中の場合:2.1(b) による却下を想定し、あらかじめ新しいビルド番号を用意する
- リリース時期:承認済みのバージョンに未承認の IAP があると、製品を読み込めないペイウォールがリリースされます。必要に応じて、IAP が承認されるまで手動リリースを保留してください
出力形式
すべての確認が完了したら、次の要約を出力してください。
## App Store Review Audit — [App Name]
Date: [YYYY-MM-DD]
### Results
| # | Check | Status | Notes |
|---|-------|--------|-------|
| 1.1 | App Completeness | PASS/WARN/FAIL | ... |
| 1.2 | Privacy Manifest | PASS/WARN/FAIL | ... |
| ... | ... | ... | ... |
### Critical Issues (FAIL — must fix before submission)
- [list]
### Warnings (WARN — should fix, risk of rejection)
- [list]
### Recommendations
- [list]
FAIL 項目が 0 件の場合は、次のように記載してください:"重大な問題は見つかりませんでした。提出可能です。"
要件が変更された場合
Apple が公開している適用期限はこちらです:
https://developer.apple.com/news/upcoming-requirements/
ユーザーが具体的な期限や新しい要件に言及した場合は、
references/appstore-review-ref.md のセクション 8 と照合し、追跡中の最新の変更を確認してください。