Web アプリを App Store と Google Play に公開するには、ビルド済みの Web アプリを Capacitor 付きのネイティブプロジェクトにラップし、いくつかのネイティブ機能を追加します。Apple と Google の開発者アカウントを作成し、iOS と Android のバイナリに署名してビルドし、実際のユーザーでテストします。ストアの掲載情報を準備して審査に提出します。既存の HTML、CSS、JavaScript はネイティブ WebView 内でそのまま動作するため、アプリを書き直す必要はありません。
以下は、待ち時間を避けるための順序で並べた 11 ステップです。Capacitor 8 のコマンドと、2026 年 10 月に適用されるストアのルールを含みます。
必要なもの
- 静的ファイルにビルドされる Web アプリ(React、Vue、Angular、Svelte、Next.js の静的エクスポート、Nuxt generate、プレーン HTML、または Lovable や Bolt などの AI ビルダーで作成したアプリ)。
- Node.js 22 以降(Capacitor 8 の要件)と、Bun または他のパッケージマネージャー。
- Android ビルド用の Android Studio。
- iOS ビルド用の macOS 上の Xcode 26、または Mac がない場合はクラウドビルドサービス。
- Apple は年間 99 USD、Google は一度きりで 25 USD。
現実的なタイムライン
| フェーズ | 標準的な所要時間 | 並行実行可能? |
|---|---|---|
| 開発者アカウント登録 | 個人: 数時間 / 組織(新規D-U-N-S): 2週間 | はい、初日から開始可能 |
| Capacitor セットアップと初回デバイス実行 | 1日 | |
| モバイルの仕上げとネイティブ機能 | 3日から3週間 | |
| 署名と初回ビルド | 1日 | |
| Google Play クローズドテスト(新規個人アカウント) | 最短14日、その後本番アクセス審査 | はい、iOS TestFlightで可能です |
| ストア掲載情報 | 1〜2日 | はい |
| アプリ審査ガイド | Appleは通常1〜2日、Googleは数時間から数日 |
ステップ1: 開発者アカウント登録を今日始める
アカウント認証は短縮できないため、コーディング前に済ませましょう。
- Apple Developer Program: 年間99米ドル。個人は2要素認証が有効なApple Accountと本名が必要です。法人はD-U-N-S番号、会社ウェブサイト、およびそのドメインの業務用メールアドレスも必要です。
- Google Play Console: 25米ドル(初回のみ)。法人はD-U-N-S番号が必要です。本人確認を想定してください。
個人として Google Play に登録した場合、アカウントはクローズドテストのルール(ステップ 9)の対象となります。詳細な手順は以下の通りです: Apple と Google Play の開発者アカウントの作成方法.
ステップ 2: Web アプリをスマートフォン向けに準備する
Capacitor はアプリを WebView で実行します。ブラウザのタブでは問題なくても、アプリでは不自然に感じるものがあります:
- 静的なビルド出力。 Capacitor はアプリの bundle からファイルを読み込みます。サーバーサイドレンダリングは端末上では動作しないため、フレームワークの静的出力(
next buildを使用してoutput: 'export',nuxt generate、Vitebuild)を使用してください。API からの呼び出しは、これまでどおり HTTPS でバックエンドに送信されます。 - ファイルオリジンで動作するクライアントサイドルーティング。 history ルーティングを使用してください(Capacitor は Android では
https://localhost、iOS ではcapacitor://localhostからアプリを配信するので動作します)。また、ディープURLが確実にフォールバックするようにしてください。index.html. - CORS。 API の allowed origins に Capacitor のオリジンを追加してください:
capacitor://localhost(iOS) とhttps://localhost(Android)。 - タッチ操作、ホバーは使わない。 ホバー専用メニューを削除し、タップターゲットは最低44 x 44ポイントに設定してください。
- セーフエリア。 追加
viewport-fit=coverviewportメタタグに追加し、ヘッダーと下部バーにenv(safe-area-inset-top)とenv(safe-area-inset-bottom). - オフラインおよび低速ネットワーク。 真っ白な画面ではなく、適切な状態を表示してください。レビュアーは不安定なWi-Fiでテストします。
- 「アプリをダウンロード」バナーは不要 主要なタスクをウェブサイトで行わせるリンクも不要です。
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
ステップ 3: Capacitor を追加
Web プロジェクトのルートで:
bun add @capacitor/core
bun add -d @capacitor/cli
bunx cap init "My App" com.example.myapp --web-dir dist
bun add @capacitor/ios @capacitor/android
bun run build
bunx cap add ios
bunx cap add android
実際の出力フォルダを使ってください: --web-dir: dist Vite の場合: out Next.js の static export の場合: .output/public Nuxt generate の場合: build Create React App の場合: dist/<project>/browser Angular の場合:
Bundle ID (com.example.myapp) は、アプリがストアに公開されると変更できません。自身が管理するリバースドメインを使用してください。
お使いの capacitor.config.ts は次のようになります:
import type { CapacitorConfig } from '@capacitor/cli';
const config: CapacitorConfig = {
appId: 'com.example.myapp',
appName: 'My App',
webDir: 'dist',
};
export default config;
Capacitor 8 はデフォルトで Swift Package Manager を使用して iOS プロジェクトを作成するため、CocoaPods は不要です。Web の code を変更するたびに:
bun run build
bunx cap sync
実行:
bunx cap run ios
bunx cap run android
フォルダをコミットしてください。 ios/ と android/ これらは、編集が必要なソース code です(権限、アイコン、署名など)。詳細については、 Capacitor を使って Web アプリをいかに簡単にモバイルアプリ化できるか、AI ツールで構築した場合は、当社の Lovableアプリのモバイル化ガイド.
ステップ 4: アプリにする価値のあるネイティブ機能を追加
Apple のガイドライン 4.2(最低限の機能)では、ウェブサイトをシェルで包んだだけのアプリは拒否されます。何十ものネイティブ機能は必要ありませんが、アプリらしく動作する必要があります。よくある便利な追加機能:
| 機能 | プラグイン |
|---|---|
| プッシュ通知 | @capacitor/push-notifications |
| Google、Apple、Facebookのネイティブサインイン | @capgo/capacitor-social-login |
| Face ID / 指紋認証によるロック解除 | @capgo/capacitor-native-biometric |
| カメラと写真 | @capacitor/camera |
| アプリ内課金とサブスクリプション | @capgo/capacitor-native-purchases |
| ネイティブのシェアシート | @capacitor/share |
| ハプティクス | @capacitor/haptics |
| ステータスバーとスプラッシュ画面 | @capacitor/status-bar, @capacitor/splash-screen |
| アプリの評価を促すプロンプト | @capgo/capacitor-in-app-review |
| Live Updates | @capgo/capacitor-updater |
例:「リンクをコピー」ボタンの代わりに、ネイティブのシェアシートを表示する。
import { Share } from '@capacitor/share';
import { Capacitor } from '@capacitor/core';
export async function shareLink(url: string, title: string) {
if (Capacitor.isNativePlatform()) {
await Share.share({ title, url });
} else {
await navigator.clipboard.writeText(url);
}
}
デジタルコンテンツやサブスクリプションを販売するなら、決済方法は今のうちに検討しておきましょう。多くの場合、AppleとGoogleはデジタル商品に自社のアプリ内課金システムを義務付けています。米国App Storeでは2025年の判決以降、外部のWeb決済へのリンクも可能です。その他の地域には独自のルールがあります。物販やサービス(配送、配車など)はStripeなど任意の決済プロバイダーを利用できます。詳細は Capacitor によるアプリ内課金.
Capgo プラグインの全カタログは プラグインページ.
ステップ 5: アイコン、スプラッシュ画面、権限文字列
2つのソース画像からすべてのアイコンとスプラッシュサイズを生成します:
bun add -d @capacitor/assets
# assets/icon.png 1024x1024, assets/splash.png 2732x2732
bunx capacitor-assets generate
iOS では、使用するすべての権限に ios/App/App/Info.plistに使用説明が必要です。ない場合、リクエスト時にアプリがクラッシュし、Apple に拒否されます:
<key>NSCameraUsageDescription</key>
<string>Take a photo of your receipt to attach it to an expense.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Choose receipt photos from your library.</string>
具体的な理由を記載してください。「このアプリはカメラが必要です」では拒否されます。
Android では、プラグインがほとんどの権限をマニフェストに自動追加します。使用しない権限は削除し、機微な権限については Google に正当化を求められます。
また、 プライバシーマニフェスト (PrivacyInfo.xcprivacy) を追加してください。code が required-reason API を使用する場合です。詳細は iOSアプリ向けプライバシーマニフェストガイド.
ステップ 6: 署名の設定
iOS。 Apple Distribution 証明書(秘密鍵を含む、通常は .p12) と、バンドル ID 用の App Store Connect プロビジョニング プロファイルが必要です。Xcode で自動作成することも、Mac なしで手動で作成することもできます。 iOS証明書とプロビジョニングプロファイルの解説。 iOS証明書ジェネレーター はブラウザで CSR ステップを処理します。
Android。 アップロード用キーストアを作成し、バックアップを取っておく。Google Play は Play App Signing を使用するため、最終的なアプリ署名キーは Google が保持し、アップロードには自分のキーで署名する。
keytool -genkeypair -v -keystore upload-keystore.jks -alias upload \
-keyalg RSA -keysize 2048 -validity 10000
または、 Android keystore ジェネレーター.
ステップ 7: リリース用バイナリのビルド
ローカル環境
iOSと (2026年4月以降の App Store アップロードに必須の Xcode 26 を搭載した Mac で):
bunx cap open ios- 次の アプリ ターゲットを選択し、バージョンとビルド番号を設定して、Signing & Capabilities でチームを選択します。
- 選択: すべてのiOSデバイス (arm64)、次に 製品 > アーカイブ.
- Organizerで、 Distribute App > App Store Connect > Upload.
Android:
bun run build
bunx cap sync android
cd android
./gradlew bundleRelease
AABはここにあります: android/app/build/outputs/bundle/release/. 設定する signingConfigs における android/app/build.gradle には、keystore を指定し、環境変数からパスワードを読み込みます。
必ず targetSdkVersion は36です。2026年8月31日以降、Google Play では新規アプリとアップデートで Android 16 (API 36) をターゲットにすることが必須です。これは Capacitor 8 のデフォルトです。
クラウドで
Macを持っていない場合、またはCIから再現可能なビルドが必要な場合は、 Capgo のビルド ホストされたマシンで両プラットフォームをビルドし、TestFlightやGoogle Playに直接アップロードできます:
bunx @capgo/cli@latest build credentials save --appId com.example.myapp --platform ios
bunx @capgo/cli@latest build credentials save --appId com.example.myapp --platform android
bunx @capgo/cli@latest build request com.example.myapp --platform ios --path .
bunx @capgo/cli@latest build request com.example.myapp --platform android --path .
認証情報はビルド時のみ使用され、Capgoのサーバーには保存されません。詳細は Capgo Build ドキュメント.
ステップ8: テスターに配布
AppleやGoogleのレビュー前に、実際のデバイスでビルドをテストします。
- iOSと: TestFlightにアップロード。内部テスター(最大100名)は処理後すぐに、外部テスター(最大10,000名)は短いBeta App Review後に利用可能になります。
- Androidでは: Play Consoleで内部テストリリースを作成し、オプトインリンクを共有します。
サインアップ、ログイン、サンドボックスでの決済、プッシュ通知、オフライン動作、キーボードによる入力欄の被り、Androidでの戻るボタンの挙動をテストしてください。各項目の詳細は以下の通りです: iOSおよびAndroidアプリをテスターに配布する方法.
ステップ 9: Google Playのクローズドテストの実施(新規個人アカウントの場合)
Playアカウントが2023年11月13日以降に作成された個人アカウントの場合、以下を実施するまで本番環境に公開することはできません: 12名以上のテスターが参加登録した状態で14日間連続して行うクローズドテストその後、Play Consoleのダッシュボードで本番環境へのアクセスを申請します。Googleによる審査は通常1週間ほどです。
利用可能なAndroid buildができ次第、すぐに開始してください。テスターが自分で参加できるよう、Google Groupをテスターリストとして使いましょう。Googleからは学んだことを聞かれるので、14日間の間にアップデートを配信してフィードバックを集めてください。組織アカウントは対象外です。
ステップ 10: ストア掲載情報の準備と申請
両方のストアで必要なもの:アプリ名、説明文、規定サイズのスクリーンショット、アイコン、プライバシーポリシーのURL、プライバシー開示(Apple App PrivacyとGoogle Data safety)、年齢レーティングのアンケート、サポート連絡先、アプリにログインがある場合はデモアカウント。Googleではさらに1024 x 500のフィーチャーグラフィックも必要です。仕様と制限: App StoreとGoogle Playの掲載情報を準備する方法.
iOSでの申請手順: App Store Connectでバージョンを作成し、TestFlightのbuildを選択、App Review Information(デモアカウント、メモ)を入力して、以下をクリックします レビュー用に追加、次に 提出.
Androidでの申請: AABで本番リリースを作成(またはテスト済みのものをテストトラックから昇格)し、すべての アプリのコンテンツ 宣言を完了して、対象国を設定し、審査へ提出します。
Webアプリでよくあるリジェクト理由:
- 4.2 最小限の機能要件: アプリが単なるウェブサイトになっている。ネイティブならではの価値を加え、ブラウザっぽいUIをなくしてください。
- ログインが必要だがデモアカウントがない、またはアカウントが機能しない。
- プライバシーに配慮したログインオプションがない iOSでGoogleやFacebookログインを提供する場合。ガイドライン4.8では、データ収集を制限する同等のオプションが求められます。通常はSign in with Appleを選びます。
- アカウント削除機能がない アプリ内でユーザーがアカウントを作成できるようにする。
- Stripe によるデジタル購入 アプリ内購入が必須となる場合。
- iPad レイアウトの崩れ プロジェクトがデフォルトで iPad をサポートしているため。
- 権限文字列の欠落または曖昧さ。
私たちの 初回アプリ審査ガイド と iOSアプリ提出ガイド 各項目を詳しく見ていきましょう。
ステップ11: レビューを待たずにアップデートを配信
リリース後、変更の多くは依然としてWeb code にあります。すべての修正のために新しいストアビルドを作成する代わりに、Live Updateを追加します。Capgo アプデーターは Capgo から新しいWebバンドルをダウンロードし、次回起動時に適用します。新しいバンドルの起動に失敗した場合は、自動的にロールバックされます。
bun add @capgo/capacitor-updater
bunx cap sync
bunx @capgo/cli@latest init
呼び出す notifyAppReady() アプリが起動したことをアプデーターに通知し、バンドルが正常であることを知らせます:
import { CapacitorUpdater } from '@capgo/capacitor-updater';
CapacitorUpdater.notifyAppReady();
その後、Web code の各リリースは1つのコマンドで完了します:
bun run build
bunx @capgo/cli@latest bundle upload --channel production
両方のストアは、アップデートがアプリの主な目的を変更したり、支払いルールを迂回したりしない限り、解釈型 code に対してこれを許可しています。ネイティブの変更(新しいプラグイン、新しい権限、Capacitor アップグレード)は依然としてストアを経由する必要があります。詳細は Capgo Live Updates および updater のドキュメント.
最初のストア提出前にプラグインを追加してください。ユーザーがインストールするバイナリに含まれていなければ、最初の live update は2回目のストアリリース後にのみユーザーに届くことになります。
最後に自動化しましょう。GitHub ActionsやGitLab CIでタグを打つたびにbuildとuploadし、マージのたびにライブアップデートを配信し、 main、ネイティブの変更はネイティブリリースに回します。
リリース前チェックリスト
- Apple/Googleアカウントの承認、規約への同意
- オフライン動作、または明確なオフライン状態の表示
- セーフエリア、キーボード、Androidの戻るボタンへの対応
- Webサイトでは実現できないネイティブ機能がいくつかあること
- アイコン、スプラッシュ、権限の説明文、Privacy Manifest
- 配布用証明書、App Storeプロファイル、アップロード用keystoreのバックアップ
- AndroidはSDK 36をターゲットに、iOSはXcode 26でビルド
- 実機によるTestFlightおよびPlay内部テストの完了
- Google Playのクローズドテスト完了(個人アカウントの場合)
- 両ストアのリストが完了し、デモアカウントを追加
- ユーザーがサインアップできる場合、アプリ内でのアカウント削除
- 最初のバイナリに Live Update プラグインを含む
トラブルシューティング
起動時にホワイトスクリーンが表示される。 webDir フォルダが間違っている、または忘れている bunx cap sync ビルド後に確認してください。 ios/App/App/public と android/app/src/main/assets/public が含まれている index.html.
アプリ内でのみ API の呼び出しが失敗する。 CORS: 許可 capacitor://localhost と https://localhost. また、呼び出していないかも確認してください http:// iOSがデフォルトでブロックするURL。
リフレッシュやディープリンク後にルートが404になる。 フォールバックするルーターを使用します index.html、または古いセットアップにはハッシュルーティングを使用します。
Xcodeの署名エラー。 エラーリストは iOS証明書とプロビジョニングプロファイルの解説.
アップグレード後にGradleビルドが失敗する。 Capacitor 8には、Android Studio Otter (2025.2.1) 以降とJDK 21が必要です。 Capacitor 8 アップグレードガイド。その他のGradleエラーについては、 Capacitor での Android ビルドエラーの解決方法.
Google Play アップロードがターゲット SDK に対して拒否されました。 設定 targetSdkVersion = 36 における android/variables.gradle.