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 AccountApple 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 ProgramGoogle Play Console
初期費用99 USD(年額に含む)25 USD(一回限り)
年額99 USDなし
3年間の合計297 USD25 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$0iOS/Android各15回1,000
Starter$19$45相当の優先ビルド3,000
Production$199$225相当の優先ビルド50,000

出典: Expo公式料金ページ

無料プランでもストア公開に必要な機能はすべて利用可能です。個人開発や小規模プロジェクトであれば、無料枠で十分にカバーできます。

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 を開き、以下を設定します。

  1. Signing & Capabilities タブで、Teamに自分のApple Developer Programアカウントを選択
  2. Bundle Identifier をApp Store Connectで登録したものと一致させる
  3. Build Settings > Code Signing Identity を「Apple Distribution」に設定

リリースビルドの作成は、Xcodeのメニューから Product → Archive を実行します。

Step 2:App Store Connectの設定

App Store Connect にログインし、新規アプリを作成します。設定が必要な主要項目は以下のとおりです。

項目内容
アプリ名ストアに表示される名前(30文字以内)
プライマリ言語日本語 (ja)
バンドルIDXcode / 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.gradlesigningConfigs セクションに上記の値を参照する設定を追加します。

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 ではバージョン管理の仕組みが異なります。

項目iOSAndroid
ユーザー向けバージョン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回目以降はコードのプッシュだけでストアに届けられるようになります。審査でのリジェクトを防ぐためにも、プライバシーマニフェストの設定やテストの徹底を怠らないようにしてください。