React Nativeで開発したアプリをApp StoreやGoogle Playに並べるには、コードを書き上げるだけでは足りません。開発者アカウントの取得、証明書やキーストアの管理、ストア固有のメタデータ入力、審査対応と、開発とはまったく異なるスキルセットが求められます。
特にiOSとAndroidの両方にリリースする場合、それぞれのストアで必要な作業やルールが異なるため、手順を把握しないまま進めると想定外の手戻りが発生します。
公開までの全体フローを把握する
React Nativeアプリをストアに公開するまでの工程は、大きく5つのフェーズに分かれます。
| フェーズ | 作業内容 | 所要時間の目安 |
|---|---|---|
| 開発者登録 | Apple Developer Program・Google Play Console アカウント取得 | 1〜3日(Apple審査待ち含む) |
| ビルド設定 | 署名鍵の作成、ビルド環境の構築 | 数時間〜1日 |
| バイナリ生成 | iOS用 .ipa / Android用 .aab ファイルの作成 | 数分〜数十分(CI利用時) |
| ストア設定 | メタデータ入力、スクリーンショット登録、プライバシーポリシー準備 | 1〜2日 |
| 審査〜公開 | Apple/Google へ提出、審査通過後に一般公開 | 1〜7日(iOS審査は平均24〜48時間) |
各フェーズで必要な前提知識と具体的なコマンドを順に整理していきます。
開発者アカウントの登録と費用
Apple Developer Program
App Storeにアプリを提出するには、Apple Developer Programへの加入が必須です。年額99 USD(日本円ではApple設定のレートにより約12,980円)で、更新しないとアプリがストアから取り下げられます。
登録は Apple Developer サイト から行いますが、個人として登録する場合と法人(Organization)として登録する場合で手続きが異なります。
| 項目 | 個人 | Organization |
|---|---|---|
| ストア表示名 | 開発者の本名 | 法人名 |
| 必要書類 | Apple Account | Apple Account + D-U-N-S Number |
| 審査期間 | 即日〜48時間 | 数日〜数週間 |
| 費用 | 99 USD/年 | 99 USD/年 |
個人登録の場合、アプリのストア表示名には本名が使われます。ニックネームやブランド名での表示を希望する場合はOrganization登録が必要です。D-U-N-S Numberは Appleの申請フォーム から無料で取得できますが、発行まで数営業日かかるため、早めに手続きを始めてください。
Google Play Console
Google Playへの公開には、Google Play Consoleへの開発者登録が必要です。登録時に25 USDの一回限りの手数料がかかりますが、年額費用はありません。
登録は Google Play Console から行います。個人アカウントと組織アカウントがあり、2023年以降に新規作成されたアカウントには本人確認の義務化が段階的に適用されています。
費用の比較
| 項目 | Apple Developer Program | Google Play Console |
|---|---|---|
| 初期費用 | 99 USD(年額に含む) | 25 USD(一回限り) |
| 年額 | 99 USD | なし |
| 3年間の合計 | 297 USD | 25 USD |
| アプリ手数料 | 売上の15〜30% | 売上の15〜30% |
両プラットフォームとも、アプリ内課金やサブスクリプションの売上には手数料が発生します。Appleでは年間売上100万ドル以下の開発者を対象に手数料が15%に下がる App Store Small Business Program があります。Googleでは全開発者が年間の最初の100万ドルまでの売上に対して15%の手数料が適用される 15%サービス手数料プログラム に登録できます。いずれも100万ドルを超えた分には標準の30%が課されます。
ビルド方式の選択:Expo(EAS Build)と Bare React Native
React Nativeアプリのビルド方式は、主に2つの選択肢があります。Expoエコシステムの EAS Build を使う方法と、React NativeのCLIから直接ネイティブプロジェクトをビルドする Bare ワークフロー です。
| 比較項目 | EAS Build(Expo) | Bare React Native |
|---|---|---|
| macOSの必要性 | iOSビルドもクラウドで完結 | iOSビルドにはmacOS + Xcode必須 |
| 環境構築の手間 | npx create-expo-app で即開始 | Xcode / Android Studio のセットアップ必要 |
| ネイティブモジュール | Config Plugin 経由で対応、一部制限あり | 制限なし |
| ビルド料金 | 無料枠あり(iOS/Android各15回/月) | 無料(ローカルマシンで実行) |
| OTAアップデート | EAS Update で対応 | 別途 CodePush 等を導入 |
| CI/CD連携 | EAS CLI 一本で完結 | GitHub Actions等で自前構築 |
WindowsやLinuxマシンでiOSアプリもビルドしたい場合は、EAS Buildが唯一の実用的な選択肢です。 macOSがなくてもiOS向けの .ipa ファイルをクラウド上で生成できます。
一方、カスタムのネイティブモジュール(Java/Swift/Objective-C で書いたコード)を多用する場合は、Bareワークフローの方が柔軟性があります。
EAS Buildの料金体系
EAS Buildには無料プランが用意されていますが、ビルド回数に制限があります。
| プラン | 月額 | ビルドクレジット | EAS Update MAU |
|---|---|---|---|
| Free | $0 | iOS/Android各15回 | 1,000 |
| Starter | $19 | $45相当の優先ビルド | 3,000 |
| Production | $199 | $225相当の優先ビルド | 50,000 |
無料プランでもストア公開に必要な機能はすべて利用可能です。個人開発や小規模プロジェクトであれば、無料枠で十分にカバーできます。
iOSアプリをApp Storeに公開する
Step 1:プロジェクトのビルド設定
EAS Build を使う場合
Expoプロジェクトであれば、eas.json にビルドプロファイルを設定します。
{
"build": {
"production": {
"ios": {
"distribution": "store",
"autoIncrement": true
}
}
}
}
app.json(または app.config.js)には、バンドルIDやバージョン情報を設定します。
{
"expo": {
"name": "MyApp",
"slug": "myapp",
"version": "1.0.0",
"ios": {
"bundleIdentifier": "com.example.myapp",
"buildNumber": "1",
"supportsTablet": true
}
}
}
ビルドコマンドは次のとおりです。
# EAS CLIのインストール
npm install -g eas-cli
# Expoアカウントへのログイン
eas login
# プロダクション向けiOSビルド
eas build --platform ios --profile production
初回ビルド時にはApple Developer Programの認証情報を求められます。EAS CLIが証明書とプロビジョニングプロファイルを自動生成・管理してくれるため、手動でKeychainを操作する必要はありません。
Bare React Native の場合
Bareワークフローでは、Xcodeを使ったビルドが必要です。
# iOSの依存関係インストール
cd ios && pod install && cd ..
Xcodeで ios/MyApp.xcworkspace を開き、以下を設定します。
- Signing & Capabilities タブで、Teamに自分のApple Developer Programアカウントを選択
- Bundle Identifier をApp Store Connectで登録したものと一致させる
- Build Settings > Code Signing Identity を「Apple Distribution」に設定
リリースビルドの作成は、Xcodeのメニューから Product → Archive を実行します。
Step 2:App Store Connectの設定
App Store Connect にログインし、新規アプリを作成します。設定が必要な主要項目は以下のとおりです。
| 項目 | 内容 |
|---|---|
| アプリ名 | ストアに表示される名前(30文字以内) |
| プライマリ言語 | 日本語 (ja) |
| バンドルID | Xcode / app.json で設定したものと同一 |
| SKU | アプリの一意な識別子(内部管理用) |
Step 3:スクリーンショットの準備
2026年現在、App Storeのスクリーンショットは 6.9インチ(1320 x 2868 px / 1290 x 2796 px / 1260 x 2736 px のいずれか)を用意すれば、他のデバイスサイズにはApp Storeが自動でスケーリングしてくれます。6.9インチのスクリーンショットがない場合は 6.5インチ(1284 x 2778 px)がフォールバックとして使用されます。
(出典: Apple Developer - Screenshot specifications)
スクリーンショットの取得にはシミュレータが便利です。
# Xcodeのシミュレータで6.9インチ相当のデバイスを起動
xcrun simctl boot "iPhone 16 Pro Max"
# スクリーンショットを撮影
xcrun simctl io booted screenshot screenshot.png
Step 4:プライバシーマニフェストの対応
2024年5月以降、AppleはApp Storeに提出するすべてのアプリに プライバシーマニフェスト(PrivacyInfo.xcprivacy)の同梱を義務化しています。React Nativeフレームワーク自体がRequired Reason APIを使用しているため、最低限の宣言は必須です。
Expoプロジェクトの場合、app.json に以下のように設定します。
{
"expo": {
"ios": {
"privacyManifests": {
"NSPrivacyAccessedAPITypes": [
{
"NSPrivacyAccessedAPIType": "NSPrivacyAccessedAPICategoryUserDefaults",
"NSPrivacyAccessedAPITypeReasons": ["CA92.1"]
}
]
}
}
}
}
(出典: Expo公式ドキュメント - Privacy manifests)
Bareワークフローの場合、React Native 0.74以降では pod install 時にテンプレートが自動生成されます。ただし、使用しているサードパーティライブラリが追加のAPIを利用している場合は、手動で理由コードを追加する必要があります。
Step 5:審査への提出
EAS Buildを使っている場合、ビルド完了後にEAS CLIからApp Store Connectへ直接アップロードできます。
eas submit --platform ios
Bareワークフローの場合は、XcodeのOrganizerウィンドウから Distribute App → App Store Connect を選択してアップロードします。CLIからアップロードしたい場合は、Apple公式の Transporter アプリか xcrun altool --upload-package コマンドが利用できます。
App Store Connectのダッシュボードでバージョン情報・審査用メモを入力し、「審査に提出」をクリックすると審査プロセスが開始されます。
AndroidアプリをGoogle Playに公開する
Step 1:署名キーの作成
Android アプリの公開には、リリース用の署名キーが必要です。
EAS Build を使う場合
EAS CLIが初回ビルド時にキーストアを自動生成し、Expoのサーバー上で安全に管理します。手動でキーストアを作成する必要はありません。
# プロダクション向けAndroidビルド
eas build --platform android --profile production
Bare React Native の場合
keytool コマンドでキーストアを手動生成します。
keytool -genkeypair -v -storetype PKCS12 \
-keystore my-upload-key.keystore \
-alias my-key-alias \
-keyalg RSA -keysize 2048 -validity 10000
生成したキーストアは android/app/ ディレクトリに配置し、android/gradle.properties に認証情報を設定します。
MYAPP_UPLOAD_STORE_FILE=my-upload-key.keystore
MYAPP_UPLOAD_KEY_ALIAS=my-key-alias
MYAPP_UPLOAD_STORE_PASSWORD=*****
MYAPP_UPLOAD_KEY_PASSWORD=*****
android/app/build.gradle の signingConfigs セクションに上記の値を参照する設定を追加します。
android {
signingConfigs {
release {
storeFile file(MYAPP_UPLOAD_STORE_FILE)
storePassword MYAPP_UPLOAD_STORE_PASSWORD
keyAlias MYAPP_UPLOAD_KEY_ALIAS
keyPassword MYAPP_UPLOAD_KEY_PASSWORD
}
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
AAB(Android App Bundle)形式でリリースビルドを生成します。
cd android
./gradlew bundleRelease
生成されたファイルは android/app/build/outputs/bundle/release/app-release.aab に出力されます。
Step 2:Google Play Consoleの設定
Google Play Console で新規アプリを作成し、以下の情報を登録します。
| 項目 | 内容 |
|---|---|
| アプリ名 | ストアに表示される名前 |
| デフォルト言語 | 日本語 |
| アプリのタイプ | アプリ / ゲーム |
| 無料/有料 | 公開後に有料→無料への変更は可、逆は不可 |
Google Play Consoleでは、アプリを公開する前に以下の項目をすべて設定する必要があります。
- ストアの掲載情報: アプリの説明、スクリーンショット(最低2枚)、フィーチャーグラフィック(1024 x 500 px)
- コンテンツのレーティング: IARC質問票への回答
- ターゲットユーザー: 対象年齢の設定
- データセーフティ: アプリが収集するデータの宣言
- アプリのカテゴリ: カテゴリの選択とタグ付け
Step 3:テストトラックの活用
Google Playにはアプリを段階的にリリースするためのテストトラックが用意されています。
| トラック | 対象 | 用途 |
|---|---|---|
| 内部テスト | 最大100名の指定ユーザー | 開発チーム内の動作確認 |
| クローズドテスト | 指定したテスターグループ | ベータテスト |
| オープンテスト | Google Play上で誰でも参加可 | 大規模ベータ |
| 製品版 | 全ユーザー | 正式リリース |
内部テストは審査不要でほぼ即座に配信されるため、ストア経由での動作確認を素早く行えます。
Step 4:審査への提出
EAS Buildを使っている場合は、CLIから直接Google Play Consoleへアップロードできます。
eas submit --platform android
初回は Google Play Console で作成したサービスアカウントの JSON キーを設定する必要があります。
Bareワークフローの場合は、Google Play Consoleのダッシュボードから .aab ファイルを手動でアップロードします。
Google Playの審査はAppleに比べて短く、通常は数時間〜数日で完了します。ただし、初回リリースの場合は最大7日かかることがあります。
審査でリジェクトされやすいパターンと対処法
iOS(App Store Review)
Apple の審査はGoogle Playに比べて厳格で、リジェクトの発生頻度も高めです。React Nativeアプリで特によく見られるリジェクト理由を整理します。
| リジェクト理由 | 具体例 | 対処法 |
|---|---|---|
| Guideline 4.3 - スパム / 最小機能 | WebViewでサイトをラップしただけのアプリ | ネイティブ機能(プッシュ通知、オフライン対応等)を追加 |
| Guideline 5.1.1 - プライバシー | プライバシーポリシーが未設定 / 内容が不十分 | アプリで収集するすべてのデータを明記したポリシーをホストする |
| Guideline 2.1 - クラッシュ / バグ | 審査中にアプリがクラッシュ | TestFlightで実機テストを十分に実施する |
| Guideline 5.1.2 - データの使用と共有 | プライバシーマニフェストの不備 | PrivacyInfo.xcprivacy の Required Reason API 宣言を確認 |
| Guideline 2.3.3 - スクリーンショット | スクリーンショットが実際のアプリ画面と異なる | 実機/シミュレータのスクリーンショットをそのまま使用 |
| Guideline 3.1.1 - アプリ内課金 | 独自の決済システムを使用 | StoreKitを使ったApple公式の課金フローに変更 |
審査にリジェクトされた場合、App Store Connectの「解決センター」から審査チームとメッセージのやり取りが可能です。理由を正確に把握し、修正版を再提出してください。
Android(Google Play)
Google Playの審査は自動化が進んでおり、ポリシー違反があると公開後でも突然非公開にされることがあります。
| 違反内容 | 具体例 | 対処法 |
|---|---|---|
| データセーフティの不備 | 宣言内容とアプリの実動作が不一致 | アプリが実際に収集するデータを正確に申告 |
| 権限の過剰要求 | 不要なカメラ・マイク権限 | 使用しないパーミッションを AndroidManifest.xml から削除 |
| ターゲットAPI レベルの未達 | targetSdkVersion が古い | Google Playが要求する最新のtargetSdkVersionに更新 |
EAS BuildとGitHub Actionsを組み合わせたCI/CD
手動でビルド・提出を繰り返すのは非効率です。EAS Buildは GitHub Actions との連携が容易で、main ブランチへのプッシュをトリガーにストアへの自動提出を実現できます。
# .github/workflows/eas-build.yml
name: EAS Build & Submit
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- name: Install dependencies
run: npm ci
- name: Setup EAS
uses: expo/expo-github-action@v8
with:
eas-version: latest
token: ${{ secrets.EXPO_TOKEN }}
- name: Build for iOS
run: eas build --platform ios --profile production --non-interactive
- name: Build for Android
run: eas build --platform android --profile production --non-interactive
- name: Submit to App Store
run: eas submit --platform ios --latest --non-interactive
- name: Submit to Google Play
run: eas submit --platform android --latest --non-interactive
このワークフローにより、コードのプッシュだけで iOS・Androidのビルドとストアへの提出が自動化されます。EXPO_TOKEN はGitHubリポジトリのSecrets に、ストアの認証情報はEAS CLIのセットアップ時に設定しておきます。
OTAアップデートで審査なしにアプリを更新する
React NativeにはJavaScriptバンドルを差し替えるだけでアプリの挙動を変更できる特性があります。これを活かした OTA(Over-The-Air)アップデート を使えば、ストア審査を経ずにバグ修正やUI変更を配信できます。
EAS Update
Expoプロジェクトであれば、EAS Updateが標準で利用可能です。
# アップデートを公開
eas update --branch production --message "バグ修正: ログイン画面のクラッシュを解消"
アプリ起動時にアップデートの有無が自動チェックされ、新しいバンドルがあればダウンロード・適用されます。
OTAで変更できる範囲には制限があります。 JavaScriptコードやアセット(画像・フォント等)の変更は可能ですが、ネイティブコード(Swift/Kotlin)やネイティブモジュールの追加・変更にはストア経由のバイナリアップデートが必要です。
また、Apple・Googleのポリシーに抵触しないよう、OTAアップデートでアプリの主要機能を大幅に変更することは避けてください。
公開後の運用で押さえるべきポイント
バージョン番号の管理
iOS と Android ではバージョン管理の仕組みが異なります。
| 項目 | iOS | Android |
|---|---|---|
| ユーザー向けバージョン | CFBundleShortVersionString(例: 1.2.0) | versionName(例: 1.2.0) |
| 内部ビルド番号 | CFBundleVersion(例: 42) | versionCode(例: 42) |
| ルール | 新しいバージョンを提出するたびにビルド番号を増加 | versionCode は前回より大きい整数 |
EAS Build では eas.json に "autoIncrement": true を設定すると、ビルドのたびにビルド番号が自動でインクリメントされます。
TestFlight / 内部テストの活用
正式リリース前にテスターへ配布して動作確認を行うことで、リジェクトやクラッシュのリスクを大幅に減らせます。
- iOS: App Store Connectの TestFlight から内部テスター(最大100名)・外部テスター(最大10,000名)にビルドを配布
- Android: Google Play Consoleの 内部テストトラック から指定のGoogleアカウントに配布
クラッシュ・パフォーマンスの監視
公開後のアプリ品質を維持するためにクラッシュ監視ツールを導入してください。
- Sentry: React Native向けの公式SDKあり。JavaScriptとネイティブ両方のクラッシュを捕捉
- Firebase Crashlytics: Googleの無料クラッシュレポートツール。Google Play Consoleとの連携がスムーズ
公開前チェックリスト
ストアへ提出する前に、以下の項目をすべて確認してください。
共通
- アプリ名・説明文にストアポリシー違反がないか
- プライバシーポリシーのURLが有効か
- すべての画面で実機テストを実施したか
- クラッシュ監視ツールを組み込んだか
iOS固有
- Apple Developer Programが有効期限内か
-
PrivacyInfo.xcprivacyに使用APIの理由を記載したか - スクリーンショットが6.9インチサイズ(6.5インチでも可)で用意されているか
- App Store Connectのすべての必須項目を入力したか
- TestFlightで動作確認を完了したか
Android固有
- 署名キー(キーストア)を安全な場所にバックアップしたか
-
targetSdkVersionがGoogle Playの要件を満たしているか - データセーフティの宣言が正確か
- コンテンツのレーティング質問票に回答したか
- 内部テストトラックで動作確認を完了したか
まとめ
React NativeアプリのApp Store・Google Play公開には、開発者登録からビルド設定、ストアのメタデータ入力、審査対応まで多くの工程があります。EAS Buildを使えばmacOSなしでもiOSビルドが可能で、CI/CD連携による自動化も容易です。
初回のリリースは手間がかかりますが、一度パイプラインを構築してしまえば、2回目以降はコードのプッシュだけでストアに届けられるようになります。審査でのリジェクトを防ぐためにも、プライバシーマニフェストの設定やテストの徹底を怠らないようにしてください。
