app-store-submission-auditor について
App Store Submission Auditorは、プロジェクト内のApp Store審査リスクを調べ、問題と修正案を報告するスキルです。開発者の経験、プロジェクトの技術スタック、ビルド状況に応じて監査内容を調整します。
主な機能
- 01プロジェクトファイルから提出リスクを検出
- 02権限、アカウント削除、サインインの確認
- 03決済、ネットワーク設定、プライバシー開示の点検
- 04デバッグ残留物とWebラッパーのパターンを検出
- 05経験やビルド状況に応じたガイダンス
活用シーン
- 01App Store提出前のiOSアプリ監査
- 02機能と一致しない権限説明の発見
- 03アカウント削除と決済フローの確認
- 04未完成アプリ向けに監査かビルドチェックリストを選択
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ itsncki-design/ app-store-submission-auditor --skill app-store-submission-auditorインストール後、Claude Code で/app-store-submission-auditorを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
README.mdconfig.jsonreferences/flutter-patterns.mdfirst-time-dev.md詳細
App Store 提出監査
プロジェクトフォルダーをスキャンし、App Store で却下されるリスクを確認します。やり取りは不要です。コードを読み、問題を見つけて報告します。ユーザーのレベルやビルド状況に応じて対応します。
初めて開発する方
ユーザーが「初めてのアプリ」「初めての提出」「これまで提出したことがない」「新しい開発者」と述べた場合は、まず references/first-time-dev.md を読み込み、そのチェックリストを実行してから、以下の完全な監査に進みます。
設定 — スキャン前に確認
スキルディレクトリーで config.json を探します。存在する場合は読み込み、保存済みの設定(スタック、アプリの種類、サブスクリプションの状況、EU での配信、過去の監査結果)を確認します。
存在しない場合は、初回監査の後、検出した内容を記録して作成します。
{
"mode": "vibe_coder",
"stack": "flutter",
"has_subscriptions": true,
"has_social_features": true,
"has_location": true,
"eu_distribution": false,
"first_time_submitter": false,
"last_audit": "2026-03-19",
"issues_fixed": []
}
次回以降は、設定を読み込み、すでに判明している情報の再検出は省略します。issues_fixed に値が設定されている場合は、「前回の監査:[date] — それ以降に [N] 件の問題を修正しました。」と記載します。
注意点 — よくある誤検出を避ける
以下は、この監査の実行時に Claude が特に間違えやすい点です。 問題として指摘する前に、必ず確認してください。
1. 物理的な商品に対する Stripe の利用は問題ありません Stripe/PayPal の利用が違反にあたるとして指摘するのは、デジタル商品や機能に使われている場合に限ります。物理的な商品の交換、マーケットプレイスのエスクロー、実世界のサービスに対する Stripe の利用は、違反ではありません。クレジットや支払いによってアプリ内のデジタル機能が利用可能になる場合に限り、指摘してください。
2. ヘルプや法務情報の WebView は問題ありません WebView が主要な UI として使われている場合に限り、Web ラッパーとして指摘してください。利用規約ページ、ヘルプ記事、外部リンクを、その他はネイティブのアプリ内で読み込む WebView は問題なく、一般的に想定されています。ネイティブ画面が約 5 つ未満で、WebView がメインコンテンツを読み込む場合に限り、指摘してください。
3. トラッキング SDK がない場合の NSUserTrackingUsageDescription このキーが存在していても、既知のトラッキング SDK が見つからない場合は、「不要な ATT プロンプト」(P1)として指摘してください。文字列の欠落として指摘してはいけません。すでに存在するため、欠落とはいえません。不必要なプロンプトによって却下される可能性がある点を指摘してください。
4. Firebase Analytics は自動的に却下されるわけではありません Firebase Analytics によるデータ収集自体が却下理由になるわけではありません。プライバシーポリシーと App Privacy ラベルに開示されていない場合に限り、問題になります。却下が確定した問題ではなく、「開示が必要」として指摘してください。
5. ステージング URL が意図的な場合もあります ステージング/開発 URL は、確実な却下理由としてではなく、「⚠️ 本番ビルドに含まれていないことを確認してください」として指摘してください。開発者がステージング用と本番用のビルド設定を使い分けている場合があります。確認せずに、本番バイナリーに含まれていると決めつけてはいけません。
6. 起動時の位置情報要求が常に不適切とは限りません アプリの主要な目的が位置情報に基づくもの(例:地図アプリ、近隣のリスティングを表示するアプリ)で、起動直後に位置情報を要求する場合は問題ありません。位置情報を使わない機能が位置情報なしでも利用できるのに、起動時に位置情報を要求する場合に限り、指摘してください。
7. チャット機能のないアプリにブロック機能がなくても却下理由にはなりません ユーザー同士の実際のやり取り(チャット、メッセージ、ソーシャルプロフィール)があるアプリに限り、ユーザーブロック機能の欠落を指摘してください。リスティングはあるものの、ユーザー間の直接メッセージ機能がないマーケットプレイスには、ブロック機能は不要です。
ステップ 1 — スキャン前に 3 つの項目を検出
A) ユーザーモードを検出
バイブコーディングの兆候: Claude Code/Cursor/Bolt/「バイブコーディング」/「AI で作成」といった言及、くだけた言葉遣い、ファイル名やフレームワークについての具体的な情報がない、開発者以外からの質問。
技術的な兆候: ファイル名やフレームワークを自発的に挙げる、コードを貼り付ける、開発用語を使う、ガイドラインの番号に言及する。
判断できない場合のデフォルト: バイブコーダーモード。
B) スタックを検出(トップレベルのフォルダーを確認)
pubspec.yaml→ Flutter →references/flutter-patterns.mdを読み込むpackage.json+ios/→ React Native →references/flutter-patterns.mdを読み込む*.xcodeprojのみ → ネイティブ Swift
C) ビルド状態を検出する(初回のフォルダスキャン時に確認)
ビルド途中の兆候 — 次のうち2つ以上に当てはまる場合は警告してください:
- ユーザーに表示される文字列に
TODO、FIXME、coming soon、placeholderが3件を超えて含まれている - コア機能がまったくない(認証画面、メイン機能、ナビゲーションがない)
- スタブ/モック関数名(
stubAuth()、mockPayment()、fakeLocation()) - 意味のある画面またはウィジェットが約8個未満
ビルド途中の兆候が見つかった場合 → 続行する前に一時停止して確認してください:
「アプリはまだ開発途中のようです。次の兆候が見つかりました:[見つかった具体的な兆候]。 今、どちらが役立ちますか?
A) 提出前監査 — Apple に却下される可能性がある項目をすべて指摘します B) ビルドチェックリスト — 提出について考える前に仕上げるべき内容をお伝えします」
- A の場合:完全な監査を続行し、エグゼクティブサマリーにビルド途中の状態を記載します
- B の場合:ビルドチェックリストモードを実行します(スキルの最後を参照)
ステップ 2 — モードを伝える
バイブコーダー:
「平易な英語モードで実行します。専門用語は使わず、コピー&ペーストできる修正を提示します。 (開発者ですか? そのままお伝えください。)」
技術者:
「開発者モードで実行します。技術的な用語を使い、正確なコード差分を提示します。 (平易な英語を希望しますか? そのままお伝えください。)」
訂正された場合は、すぐに切り替えてください。
ステップ 3 — 次のファイルをスキャンする
確認を求めずに読み込みます。ファイルが見つからない場合は記録し、そのまま続行してください。
Flutter: ios/Runner/Info.plist · pubspec.yaml · lib/main.dart ·
ios/Runner/PrivacyInfo.xcprivacy · *.entitlements ·
次に一致するファイル:*auth* *account* *delete* *user* *block* *report*
*location* *geo* *permission* *payment* *purchase* *subscription*
*iap* *credits* *paywall* *api* *network* *config* *env*
*constants* *privacy* *policy* *eula* *terms* *legal*
ネイティブ Swift: */Info.plist · AppDelegate.swift · *.entitlements ·
PrivacyInfo.xcprivacy · *Account* *Auth* *Delete* *Block* *Report*
*Location* *Permission* *Payment* *Purchase* *IAP* *Subscription*
*Network* *API* *Config* *Constants*
ステップ 4 — 確認する項目
問題を記録し、ステップ 5 でまとめて出力します。
重大度:
- 🚨 P0 — これがあると Apple に却下されます
- ⚠️ P1 — 積極的に確認され、指摘される可能性が高い項目
- 💡 P2 — 必ずしも却下にはつながりませんが、修正する価値があります
権限の説明文
Info.plist 内のすべての NS*UsageDescription を確認します。
次の場合は指摘してください:
- 値が空 → 🚨
- 汎用的な値(「アプリに必要」「機能に必要」「ユーザー体験を向上させるため」) → 🚨
- コードに機能があるのにキーがない → 🚨
- キーがあるのにコードに該当する機能がない → ⚠️ 過剰な権限要求
- 明確なバックグラウンド利用の必要性がないのに
NSLocationAlwaysUsageDescriptionがある → ⚠️ - トラッキング SDK が含まれているのに
NSUserTrackingUsageDescriptionがない → 🚨 - トラッキング SDK が含まれているのに
PrivacyInfo.xcprivacyがない、または不完全 → ⚠️
位置情報権限の順序
requestPermission() が呼び出される前に位置情報へアクセスしている場合、またはすべての機能で位置情報が必要ではないのにアプリ起動時にアクセスしている場合は指摘してください。Flutter(Geolocator)とネイティブ(CLLocationManager)の両方を確認します。
アカウント削除
次の場合は指摘してください:mailto: へのリダイレクト → 🚨 · Web URL へのリダイレクト → 🚨 · 確認ダイアログがない → 🚨 · 認証プロバイダーが1つしか削除されない → ⚠️ · 削除フローがどこにも見つからない → 🚨
ユーザーのブロック
次の場合は指摘してください:ブロック機能がない → 🚨 · ブロックと報告が同じ機能 → ⚠️ · UI で隠すだけで、データ層では適用されない → ⚠️ · プロフィール画面またはチャット画面にブロック機能がない → ⚠️
Apple でサインイン
サードパーティのソーシャルログイン(Google、Facebook、Twitter)があるのに Apple でサインインがない場合は指摘してください(サードパーティのログインを提供する場合は必須です)→ 🚨
決済と IAP
次の場合は指摘してください:デジタル商品に Stripe/PayPal/独自決済を使用 → 🚨 · IAP を介さずにクレジットでデジタル機能を解除 → 🚨 · 購入を復元する呼び出しが見つからない → ⚠️ · Apple EULA の URL がコードベースにない → ⚠️ · デジタル機能の外部購入リンク → 🚨 · 購入前にサブスクリプション条件が表示されない → ⚠️
ネットワーク設定
検出対象:ハードコードされた IPv4 リテラル → 🚨 · 本番設定内の http:// → 🚨 ·
本番ビルド内のステージング URL → ⚠️ · NSAllowsArbitraryLoads: true → ⚠️
暗号化コンプライアンス
Info.plist の ITSAppUsesNonExemptEncryption を読み取ります。
検出対象:
- キーが完全に欠落している → ⚠️(Apple は提出時に確認し、アップロードをブロックします)
- 輸出コンプライアンス文書がない状態で
trueに設定されている → ⚠️
バイブコーダー向け:「アプリでは暗号化を使用しているかどうかを申告する必要があります。一般的な HTTPS(ほとんどのアプリが使用)しか使っていない場合は、これを Info.plist に追加します。 Claude Code に次のように伝えてください:『ITSAppUsesNonExemptEncryption を値 NO で Info.plist に追加して』」
技術者向け: ITSAppUsesNonExemptEncryption が Info.plist にありません。
アプリが HTTPS のみを使用する場合は、NO に設定します。独自の暗号化を使用する場合は、YES に設定し、App Store Connect に輸出コンプライアンス文書をアップロードします。
デバッグ用の成果物
検出対象:debugShowCheckedModeBanner: true → ⚠️ · ユーザーに表示される文字列内の「beta」「demo」「coming soon」「placeholder」「TODO」→ ⚠️ · 空の状態を示す UI がない空白画面 → ⚠️ · 過剰な print 文 → 💡
SDK インベントリ
pubspec.yaml / package.json を読み取ります。開示されていないデータ収集 SDK を検出します:
firebase_analytics facebook_* amplitude_flutter mixpanel_flutter
appsflyer_sdk adjust_sdk → 各 SDK につき ⚠️(開示が必要ですが、それ自体が却下理由になるわけではありません)
規制対象のコンテンツ
ユーザーに表示される文字列をスキャンします。検出対象:医療に関する主張(「治療する」「治癒する」「臨床的に証明済み」)→ ⚠️ · 免責事項のない個別の金融アドバイス → ⚠️ · 免責事項のない安全機能/緊急機能 → ⚠️
ATT/トラッキングのプロンプト
Info.plist と pubspec.yaml / package.json を読み取ります。
検出対象:
- トラッキング SDK があるのに
NSUserTrackingUsageDescriptionがない → 🚨 NSUserTrackingUsageDescriptionがあるが、説明が曖昧 → 🚨- トラッキング SDK があるのに
PrivacyInfo.xcprivacyがない → ⚠️ - ユーザーが価値を実感する前に、アプリ起動時に ATT を要求している → ⚠️
- トラッキング SDK が見つからないのに
NSUserTrackingUsageDescriptionがある → ⚠️ (不要な ATT プロンプトです。実際にはトラッキングしていないのにトラッキングを求めるアプリは Apple に却下されます)
Flutter: ATT には app_tracking_transparency パッケージが必要です。トラッキング SDK があるのに、このパッケージが pubspec.yaml にない場合は検出します。
Web ラッパーの検出
検出対象:webview_flutter / flutter_inappwebview を主要 UI として使い、ネイティブ画面が約 5 未満 → 🚨 · アプリ全体として外部 URL を読み込む WKWebView → 🚨 · ネイティブナビゲーションがなく、すべてのナビゲーションが WebView 内で完結 → 🚨
検出対象外:ネイティブ機能に加えて、補助的な単一機能に WebView を使用している場合。
2025/2026 年の要件
検出対象:
- 新しい年齢レーティング区分:アプリに UGC、チャット、または広告がある場合、2026 年 1 月の更新された質問票により、従来の 12+ が 13+/16+ を必要とする可能性があります → ⚠️(注:App Store Connect で確認してください)
- 外部 AI の同意:アプリが個人ユーザーデータを外部 AI サービスに送信しているのに、コード内に同意モーダルが見つからない → ⚠️
- Swift 6(ネイティブのみ):ATT と StoreKit の呼び出しに
@MainActorが付いていない → 💡
ステップ 5 — 出力
全スキャンの完了後、すべてのセクションを一度に出力します。
モード別の文体ルール
バイブコーダー向け: わかりやすい英語を使います。問題を指摘する前に、それが何かを説明します。 Claude Code へのプロンプトでは、汎用テンプレートではなく、実際に見つかったファイルと関数を具体的に指定します。
形式:Tell Claude Code: "[specific instruction referencing actual file/function found]"
技術者向け: 開発者向けの用語を使って構いません。実際のファイルと行を参照した正確なコード差分を示します。 判明している場合はガイドライン番号を記載します。
セクション 1 — エグゼクティブサマリー
[VIBE CODER]
YOUR APP AUDIT
══════════════
What your app does: [inferred — 1 sentence]
Issues found: [X] — [Y] will get you rejected, [Z] are risky
3 biggest things to fix:
• [top issue in plain English]
• [second]
• [third]
3 quick wins:
• [easiest fix]
• [second]
• [third]
[TECHNICAL]
AUDIT SUMMARY
═════════════
Stack: [stack] · Files scanned: [N] · Issues: [X] ([Y] P0, [Z] P1)
App: [inferred purpose]
Top risks: [top 3] · Fast wins: [top 3]
セクション 2 — リスク一覧
どちらのモードでもこの表を使用します。セル内の表現は検出されたモードに合わせて調整します。
問題がない行は省略します。コード上の証拠がない場合は Assumption — verify manually を使用します。
| Priority | Area | Finding | Evidence | Fix | Effort | Confidence |
|----------|------|---------|----------|-----|--------|------------|
| P0 🚨 | [area] | [finding] | [file:line or function] | [fix] | S/M/L | High/Med/Low |
作業量:S = 1 時間未満 · M = 半日 · L = 複数日
セクション 3 — 詳細な指摘事項
領域ごとにまとめます。問題のない領域は省略します。
各指摘事項:見つかった内容(具体的なファイル/関数)・Apple が却下する理由・具体的な修正方法 雰囲気:平易な英語+具体的な Claude Code のプロンプト 技術的な内容:コード差分
セクション 4 — 審査担当者の体験
Apple の審査担当者が行う操作をシミュレートします。それぞれに印を付けてください: ✅ 合格する可能性が高い · ⚠️ リスクあり · ❌ 不合格になる · ⬜ コードからは判断できない
Install & launch
[?] App opens without crashing
First run
[?] Clear what app does on first screen
[?] Permissions explained before requested
[?] No dead ends or blank screens
Core features
[?] Reviewer reaches main features without special setup
[?] Test account path exists (if login required)
Purchases (if applicable)
[?] Paywall shows price, billing, terms
[?] Restore purchases visible
[?] No external payment links for digital features
Account (if applicable)
[?] Account creation works
[?] Account deletion findable and works in-app
Links & legal
[?] Support URL loads · Privacy policy loads · EULA accessible
Edge cases
[?] No internet → graceful error (not crash)
[?] Empty states have UI
セクション 5 — 審査担当者向けメモの草案
App Store Connect → App Review 用メモに、そのまま貼り付けられる文章を作成します。
実際のコードから各セクションを推測してください。Claude が判断できない項目にのみ [fill in] を使用してください。
--- NOTES FOR APP REVIEW ---
ABOUT THIS APP
[Inferred from code]
TEST ACCOUNT
Email: [fill in]
Password: [fill in]
HOW TO REACH KEY FEATURES
[Steps inferred from navigation structure]
PERMISSIONS
[Each NS*UsageDescription found — feature it's used for]
ACCOUNT DELETION
[Path inferred from code, or omit if not found]
[Any unusual flows, credits systems, or gated features]
--- END NOTES ---
セクション 6 — 手動チェックリスト+スキャン後の質問 4 つ
自動検出された問題の後に、このセクションを最後に記載してください。
[VIBE CODER]
THINGS TO CHECK YOURSELF
════════════════════════
In App Store Connect:
□ Fill in the App Privacy section
□ Age rating — updated tiers as of Jan 2026: check if your app
needs 13+ or 16+ (not just 12+) if it has chat, UGC, or ads
□ All subscription plans in ONE group
□ Add Apple's EULA link to your App Store description:
apple.com/legal/internet-services/itunes/dev/stdeula/
Your listing:
□ Description matches current build
□ Screenshots show the current version (not Figma)
□ Support link loads · Privacy policy link loads
Before submitting:
□ Test on a real iPhone, final build — not simulator
□ Open on iPad — shouldn't crash
□ Paste test account into Review Notes
Good to know:
□ Phased release — after approval you can roll out to
1% → 2% → 5% → 10% → 50% → 100% instead of everyone at once.
Great for catching issues before full launch.
□ Expedited review — if it's a critical bug fix or urgent,
you can ask Apple to fast-track it in App Store Connect
under App Review → Contact Us → Expedite Request.
[TECHNICAL]
MANUAL CHECKS — NOT IN CODE
════════════════════════════
App Store Connect
□ App Privacy nutrition label completed
□ Age rating updated (Jan 2026 questionnaire — new 13+/16+/18+ tiers)
□ All subscription tiers in single subscription group
□ Apple EULA in App Store description
□ ITSAppUsesNonExemptEncryption set in Info.plist
□ EU DSA trader status verified (if distributing paid app in EU)
Metadata
□ Description matches current build · No prices in description
□ No "Also available on Android" references
□ Screenshots match current build (real UI, not marketing renders)
□ Support URL resolves · Privacy policy URL live
Device testing
□ Physical device, release build · iPad doesn't crash
□ IPv6 network test (Apple review network is IPv6-only)
Review Notes
□ Demo credentials added · Reviewer notes draft pasted
Useful options
□ Phased release available after approval (1%→2%→5%→10%→50%→100%)
□ Expedited review available for critical fixes (App Review → Contact Us)
手動チェックリストの後に、次の 4 つの質問をしてください:
[VIBE CODER]
One last thing — a few things I can't check from your code:
1. Have you tested the app on a real iPhone recently?
(Not just the simulator)
2. Do your App Store screenshots show the current
version of your app?
3. Have you added a test account to your Review Notes?
(Skip this if your app doesn't require login)
4. Is this your first time submitting to the App Store?
(Say yes and I'll walk you through a setup checklist)
[TECHNICAL]
Four things I can't verify from code:
1. Tested on physical device with release build?
2. Screenshots in ASC match current build?
3. Demo credentials in App Review Notes? (skip if no login)
4. First submission? (yes → I'll load the first-time setup checklist)
ユーザーが質問 4 に「はい」と答えた場合は、references/first-time-dev.md を読み込んでください。
締めくくりの文
雰囲気重視のコーダー向け:
"修正が必要な項目が [X] 件あります。まずは 🚨 の項目に取り組みましょう。却下が確実な問題です。 上記の 4 つの質問に答え、審査担当者向けメモの草案にテストアカウントを記入すれば、提出準備は完了です。 (「fix [anything]」と言えば、Claude Code に伝える内容をそのまま作成します。)"
技術者向け:
"問題が [X] 件あります。まずは P0 から対応してください。4 つの質問に答え、審査担当者向けメモにログイン情報を記入してください。 (「fix [issue]」と言えば、修正済みコードを提示します。)"
コード上の問題がない場合:
"コード上の問題は見つかりませんでした。上記の 4 つの質問に答え、手動チェックリストを確認すれば、提出準備は完了です。"
再監査
ユーザーが「[X] を修正した」と言った場合、または更新後のコードを共有した場合:
- 該当領域のみを再スキャンします
- ✅ を確認するか、残っている問題を具体的に説明します
- リスク一覧の該当項目のみを更新します
- 注:メタデータの却下は App Store Connect で修正するため、新しいビルドは不要です バイナリの却下はコードを修正し、新しいアーカイブを作成して、新しいビルドをアップロードする必要があります
ビルドチェックリストモード
ビルド途中の検出後にユーザーがオプション B を選んだ場合に実行します。
YOUR BUILD CHECKLIST
════════════════════
[What the app does so far — inferred from code]
FINISH THESE FIRST
[Unfinished things found — stubs, TODOs, missing flows.
Specific file references.]
ALREADY DONE ✅
[What's clearly implemented and working]
WHEN YOU'RE DONE BUILDING
Come back and say "audit my app" — I'll check for
App Store submission then.
トーン:前向きにします。却下に関する警告はしません。次に何を作るべきかに焦点を当てます。