capacitor-apple-review-preflight について
Capacitor アプリの提出前監査を行い、Apple の審査要件とプロジェクト設定を確認するスキルです。提出準備や却下理由の調査に使え、根拠と修正案を優先度順にまとめます。
主な機能
- 01Apple 審査ルールの確認
- 02Capacitor と iOS ファイルの調査
- 03メタデータとプライバシーの監査
- 04根拠付きの優先順位付け
- 05審査メモの下書き
活用シーン
- 01App Store 提出前のアプリ確認
- 02App Review の却下理由の調査
- 03プライバシーマニフェストと権限の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ cap-go/ capgo-skills --skill capacitor-apple-review-preflightインストール後、Claude Code で/capacitor-apple-review-preflightを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
metadata.jsonreferences/guidelines/README.mdreferences/guidelines/by-app-type/ai_apps.mdall_apps.mdcrypto_finance.mdgames.mdhealth_fitness.mdkids.mdmacos.mdsocial_ugc.mdsubscription_iap.mdvpn.mdreferences/rules/design/minimum_functionality.mdsign_in_with_apple.mdreferences/rules/entitlements/unused_entitlements.mdreferences/rules/metadata/accurate_metadata.mdapple_trademark.mdchina_storefront.mdcompetitor_terms.mdsubscription_metadata.mdreferences/rules/privacy/privacy_manifest.mdunnecessary_data.mdreferences/rules/subscription/misleading_pricing.mdmissing_tos_pp.md詳細
Capacitor Apple Review Preflight
Capacitor アプリの提出前または却下後に Apple の審査監査を実施し、優先順位を付けた、根拠に基づくレポートを返します。
このスキルは、truongduy2611/app-store-preflight-skills の Apple ガイドラインおよび却下ルールのコーパスを応用し、ワークフローを Capacitor 固有のプロジェクト検査に絞っています。
使用する場面
次の場合に使用します:
- ユーザーが Capacitor アプリの App Store 審査前チェックを希望している。
- ユーザーが App Review の却下、または App Store Connect のアップロード警告メールを受け取り、プロジェクトの監査を希望している。
- メタデータ、エンタイトルメント、プライバシーマニフェスト、Sign in with Apple、サブスクリプション、AI 機能、または最低限の機能が審査を通過するかどうかをユーザーが尋ねている。
- Capacitor での提出に向けた審査担当者用のメモ(デモアカウント、ライブアップデート、ハードウェア機能)をユーザーが希望している。
次の用途には使用しないでください:
- Google Play のポリシーまたはデータセーフティ →
capacitor-app-store(Android の参考資料)。 - アーカイブ、アップロード、スクリーンショット、TestFlight →
capacitor-app-store。 - ウェブサイトを一からネイティブアプリのようにする →
webapp-to-capacitor。 - 審査ルールを超えたセキュリティ強化 →
capacitor-security。
ライブプロジェクトのスナップショット
検出された Capacitor、認証、サブスクリプション、分析、プライバシー関連のパッケージ:
!node -e "const fs=require('fs');if(!fs.existsSync('package.json'))process.exit(0);const pkg=JSON.parse(fs.readFileSync('package.json','utf8'));const sections=['dependencies','devDependencies'];const out=[];for(const section of sections){for(const [name,version] of Object.entries(pkg[section]||{})){if(name.startsWith('@capacitor/')||name.startsWith('@capgo/')||name.includes('firebase')||name.includes('sentry')||name.includes('revenuecat')||name.includes('purchase')||name.includes('subscription')||name.includes('auth')||name.includes('analytics')||name.includes('segment')||name.includes('amplitude')||name.includes('mixpanel')||name.includes('openai')||name.includes('anthropic')||name.includes('gemini'))out.push(section+'.'+name+'='+version)}}console.log(out.sort().join('\n'))"
Apple の審査に関連するファイルパス:
!find . -maxdepth 6 -not -path '*/node_modules/*' \( -name 'package.json' -o -name 'capacitor.config.json' -o -name 'capacitor.config.ts' -o -name 'capacitor.config.js' -o -name 'Info.plist' -o -name '*.entitlements' -o -name 'PrivacyInfo.xcprivacy' -o -name 'SceneDelegate.swift' -o -name 'project.pbxproj' -o -path './ios' -o -path './fastlane/metadata' -o -path './metadata' \)
現在の Apple 要件(2026 年 10 月)
まず次の項目を確認してください。審査が始まる前にアップロードエラーの原因となります:
- SDK:2026 年 4 月 28 日以降、アップロードするビルドには Xcode 26 以降/iOS 26 SDK を使用する必要があります。2027 年 4 月からは iOS 27 SDK(Xcode 27)が必須です。
- UIScene:Xcode 27 でビルドするにはシーンライフサイクルが必要です。Capacitor 8.5 以降はこれをサポートしています。アプリには
SceneDelegate.swift、Info.plist内のUIApplicationSceneManifest、およびAppDelegate内のconfigurationForConnectingが必要です。導入後は、AppDelegate のapplication(_:open:options:)、continue userActivity、フォアグラウンド/バックグラウンドのコールバックが呼び出されなくなります。これらにあるカスタムネイティブコードはシーンデリゲートに移動する必要があります。 - プライバシーマニフェスト:アプリコードで使用する必須理由 API について、アプリのターゲットに独自の
PrivacyInfo.xcprivacyが必要です。Apple のプライバシーに影響するリストに含まれる SDK は、それぞれ独自のマニフェストと署名を同梱する必要があります(Capacitor core と CapacitorCordova はマニフェストを同梱しています)。 - 年齢制限指定:更新された質問票(4+、9+、13+、16+、18+)に回答しないと、新しいバージョンを提出できません。
- AI によるデータ共有:ガイドライン 5.1.2(i)(2025 年 11 月改訂)では、個人データをサードパーティの AI サービスに送信する前に、アプリ内で明確に開示し、明示的な許可を得ることが求められます。
手順
ステップ 1:対象範囲を確認
Apple の審査に関する作業のみを対象とします。タスクの大半がリリース手順に関するものであれば、capacitor-app-store に引き継いでください。却下理由が示されている場合は、まず該当するガイドラインを優先し、その後、関連するリスクを確認してください。
ステップ 2:アプリの種類を特定し、チェックリストを読み込む
references/guidelines/by-app-type/all_apps.md は必ず読んでください。次に、該当するチェックリストを追加します。
| アプリに含まれるもの | 読み込むファイル |
|---|---|
| サブスクリプションまたは IAP | subscription_iap.md |
| UGC、チャット、ソーシャルフィード | social_ugc.md |
| キッズカテゴリ | kids.md |
| 健康、フィットネス、医療に関する表示 | health_fitness.md |
| ゲーム | games.md |
| AI / LLM 機能 | ai_apps.md |
| 暗号資産、取引、金融 | crypto_finance.md |
| VPN / ネットワーク | vpn.md |
| macOS にも配信 | macos.md |
却下理由に特定のセクションが記載されている場合は、references/guidelines/README.md でガイドラインの全インデックスを確認してください。
ステップ 3:Capacitor プロジェクトと iOS プロジェクトを調査する
スナップショットから開始し、次を確認します。
- 認証、分析、広告、決済、AI SDK を確認するため、
package.jsonを調べます。 appId、server.url(リリースビルドでのリモートserver.urlは 4.2 / 2.5.2 のリスクです)、ライブアップデート設定を確認するため、capacitor.config.*を調べます。- プラグインが要求する可能性のあるすべての
NS...UsageDescription、ITSAppUsesNonExemptEncryption、UIApplicationSceneManifest、UIBackgroundModesを確認するため、ios/App/App/Info.plistを調べます。 *.entitlementsと実際に配信する機能を照合します。PrivacyInfo.xcprivacy(アプリターゲットへの所属、必須理由 API、トラッキングドメイン)を確認します。- 存在する場合は、
fastlane/metadataまたはmetadata/を調べます。
Capacitor 固有のリスク:
- ネイティブの価値やモバイル UX を備えない、WebView のみのエクスペリエンス → 4.2。
- ウェブサイトを読み込むリモートの
server.url→ 4.2 および 2.5.2。 - 「Appleでサインイン」または同等のプライベートな選択肢がないソーシャルログイン → 4.8。
- iOS ビルドで表示されるデジタル商品向けの Web 決済 → 3.1.1。
- アプリの目的の変更や、審査対象外の機能の追加にライブアップデートを使用する場合 → ガイドライン 2.5.2 および Apple Developer Program License Agreement のインタープリタ型コードに関する条項。仕組みを開示し、アップデートを Web アセットの修正に限定してください。
Info.plistにプラグインの権限があり、説明文が曖昧またはコピーされたもの → 5.1.1。- Xcode で有効になっているものの未使用の機能(Push、iCloud、HealthKit、Associated Domains)。
ステップ 4:ルールに基づく確認を実施する
ルールファイルを正式な基準として使用します。
- メタデータ:
references/rules/metadata/*.md - サブスクリプション:
references/rules/subscription/*.md - プライバシー:
references/rules/privacy/*.md - デザイン:
references/rules/design/*.md - エンタイトルメント:
references/rules/entitlements/*.md - ビルド:
references/rules/build/sdk_and_scene_lifecycle.md(Xcode / SDK の最低要件、UIScene)
メタデータルールを App Store のテキスト、スクリーンショット、プレビュー、審査メモに対応付けます。プライバシールールは Info.plist、マニフェスト、SDK、データフローに、デザインルールはナビゲーション、ネイティブの価値、ログインに、エンタイトルメントルールは有効な機能に対応付けます。
メタデータがローカルになく、asc CLI が設定済みの場合は、asc metadata pull --output-dir ./metadata で取得します。それ以外の場合はローカルのソースを監査し、メタデータの確認を一部のみ実施したものとして記録します。
ステップ 5:報告する
## Apple Review Preflight
### Rejections Found
- [GUIDELINE X.X.X] Issue summary
- Evidence: file:line or metadata field
- Why it matters for this Capacitor app
- Fix: exact remediation
### Warnings
- [GUIDELINE X.X.X] Potential issue
### Passed
- [Category] Checks that looked clean
### Missing Inputs
- Metadata or assets not available locally
重大度の高い順に並べます。大幅な変更(機能の削除、認証や課金の変更)を行う前に報告し、その判断が必要な段階でユーザーに確認してください。
ステップ 6:審査メモとフォローアップ
デモアカウント、非表示またはハードウェアに依存する機能、サブスクリプションのテスト手順、AI のモデレーションとデータ共有への同意、ライブアップデートの動作(Web アセットのみ。ネイティブの変更はなし)、および特別なエンタイトルメントやバックグラウンドモードの理由について、メモを作成します。
検証
- 却下に関する指摘すべてに、具体的な修正が適用されているか、担当者または判断が明示されています。
plutil -lint ios/App/App/Info.plist ios/App/App/PrivacyInfo.xcprivacyが成功します。PrivacyInfo.xcprivacyが App ターゲットに含まれています(project.pbxprojに Resources ビルドフェーズ内の記載があることを確認します)。grep -c "UsageDescription" ios/App/App/Info.plistの結果が、プラグインが要求する可能性のある権限と一致します。- リリースビルドがアーカイブされ、ITMS 警告なしで Xcode Organizer で検証されます。
- クリーンインストール後、デモアカウントで本番バックエンドにログインできます。
エラー処理
| 入力 | 対応 |
|---|---|
| カテゴリ名を含む ITMS-91053「API 宣言の不足」 | NSPrivacyAccessedAPIType と承認済みの理由をアプリのマニフェスト(references/rules/privacy/privacy_manifest.md)に追加します |
| SDK 名を示す ITMS-91061「プライバシーマニフェストの不足」 | バンドル済みのマニフェストを含むバージョンに SDK/プラグインを更新します。SDK の慣行をアプリのマニフェストに貼り付けないでください |
| ITMS-90683「目的文字列の不足」 | 指定されたキーに具体的な目的文字列を追加します |
| ラッパーアプリに対するガイドライン 4.2 の却下 | 最も重大な問題として扱います。具体的なネイティブ機能と UX の不足を列挙します。審査担当者のメモだけで回答しないでください |
| ガイドライン 4.8 | 「Apple でサインイン」を追加します(@capgo/capacitor-social-login は apple をサポートしています)。または、4.8 の基準を満たす同等のオプションを追加します |
| ガイドライン 5.1.1(v) | アプリ内アカウント削除を追加します(サポートメールだけでは不十分です) |
メタデータが利用できず、asc もない | コード監査を続行し、メタデータの確認は一部のみ完了と記録します |
| サードパーティ SDK で必須理由 API が示されている | 準拠していると判断する前に、各 SDK にバンドルされたマニフェストを確認します |