React Native Publishing to App Stores

Publishing your app puts it in the hands of real users. The path goes through Google Play Store for Android and the Apple App Store for iOS. Expo provides a build service called EAS (Expo Application Services) that creates the installable app files without requiring Xcode or Android Studio on your machine.

The Publishing Pipeline

Your Code
    │
    ▼
Configure app.json (name, icons, version)
    │
    ▼
EAS Build (cloud build service)
    │
    ├── Android → .aab file (Android App Bundle)
    │
    └── iOS     → .ipa file (iOS App Archive)
    │
    ▼
Submit to Stores
    │
    ├── Google Play Console → Google reviews → Published on Play Store
    │
    └── App Store Connect  → Apple reviews  → Published on App Store

Step 1 — Prepare app.json

The app.json file controls your app's identity on the stores. Fill in every field before building.

// app.json
{
  "expo": {
    "name": "My Awesome App",          // display name on device
    "slug": "my-awesome-app",          // unique identifier for Expo
    "version": "1.0.0",               // public version shown on stores
    "orientation": "portrait",
    "icon": "./assets/icon.png",       // 1024x1024 PNG, no transparency
    "splash": {
      "image": "./assets/splash.png",  // 1284x2778 PNG for iPhone
      "backgroundColor": "#ffffff"
    },
    "android": {
      "package": "com.yourcompany.myapp",  // unique ID (reverse domain)
      "versionCode": 1,               // integer, increment each release
      "adaptiveIcon": {
        "foregroundImage": "./assets/adaptive-icon.png",
        "backgroundColor": "#ffffff"
      }
    },
    "ios": {
      "bundleIdentifier": "com.yourcompany.myapp",  // same format as Android
      "buildNumber": "1"              // string, increment each release
    }
  }
}
Version Numbers Explained:
"version": "1.0.0"     → shown to users (Semantic Versioning)
"versionCode": 1       → Android internal number, must increase per upload
"buildNumber": "1"     → iOS internal number, must increase per upload

Release history:
v1.0.0 (versionCode: 1) → first release
v1.0.1 (versionCode: 2) → bug fix
v1.1.0 (versionCode: 3) → new feature
v2.0.0 (versionCode: 4) → major redesign

Step 2 — Set Up EAS

# Install EAS CLI globally
npm install -g eas-cli

# Log in to your Expo account
eas login

# Configure EAS for your project (creates eas.json)
eas build:configure

The eas.json file defines build profiles — development, preview, and production.

// eas.json (auto-generated)
{
  "build": {
    "development": {
      "developmentClient": true,
      "distribution": "internal"
    },
    "preview": {
      "distribution": "internal"    // share with testers only
    },
    "production": {
      "distribution": "store"       // submit to public stores
    }
  }
}

Step 3 — Create App Icons and Splash Screen

Required assets:
┌──────────────────────────────────────────────────────────────┐
│ assets/icon.png             1024 × 1024 px (PNG, no alpha)   │
│ assets/splash.png           1284 × 2778 px                   │
│ assets/adaptive-icon.png    1024 × 1024 px (Android only)    │
│ assets/favicon.png          48  × 48   px (web only)         │
└──────────────────────────────────────────────────────────────┘

Icon design rules:
- No text smaller than the eye can read at thumbnail size
- Works in both light and dark backgrounds
- No transparency in the main icon (stores reject it)
- Test it at 57×57 px — still recognisable?

Step 4 — Build for Android

# Production build for Google Play
eas build --platform android --profile production

EAS uploads your code to Expo's cloud servers.
The build takes 5–15 minutes.
You receive a download link for the .aab file.

Output:
✓ Build started (Build ID: abc-123)
✓ Code archived and uploaded
✓ Build in progress...
✓ Build complete!
  Download: https://expo.dev/artifacts/...

Step 5 — Build for iOS

# Production build for App Store
eas build --platform ios --profile production

# You need:
# - Apple Developer account ($99/year)
# - EAS manages certificates and provisioning profiles for you

Step 6 — Submit to Google Play Store

Create a Google Play Console account at play.google.com/console. Pay the one-time $25 registration fee. Create your app listing and fill in the store details.

Store listing checklist:
[ ] App title (50 characters max)
[ ] Short description (80 characters)
[ ] Full description (4000 characters)
[ ] Screenshots: phone (min 2), tablet optional
[ ] Feature graphic: 1024 × 500 px
[ ] Privacy policy URL (required)
[ ] App category (Games / Productivity / etc.)
[ ] Content rating questionnaire completed
[ ] Target age group set
# Or submit directly via EAS
eas submit --platform android

Step 7 — Submit to Apple App Store

Create an Apple Developer account at developer.apple.com. Pay the $99/year fee. Create your app in App Store Connect at appstoreconnect.apple.com.

App Store listing checklist:
[ ] App name (30 characters max)
[ ] Subtitle (30 characters)
[ ] Description (4000 characters)
[ ] Keywords (100 characters, comma-separated)
[ ] Screenshots: 6.7" iPhone, 6.5" iPhone, 12.9" iPad
[ ] App preview video (optional but recommended)
[ ] Privacy policy URL
[ ] Support URL
[ ] Age rating
[ ] Copyright string
# Submit via EAS
eas submit --platform ios

Review Process

Google Play:          Apple App Store:
───────────────────────────────────────────────────
Review time: 2–3 hrs  Review time: 24–72 hrs
to 3 days             (first submission takes longer)

Common rejection reasons:
- Privacy policy missing
- Permissions not explained (camera, location)
- App crashes on review device
- Misleading screenshots or description
- Placeholder content left in the app

Updating the App After Launch

There are two types of updates: native builds (require store review) and JavaScript-only updates (instant, no review needed).

Type                          When to use
──────────────────────────────────────────────────────────────────
Full native build + store      New native code, config changes,
  review required              new permissions, major version bump

EAS Update (JS-only, instant)  Bug fixes in JS code, text changes,
  no store review              logic fixes that don't touch native code

# Push a JS-only update instantly
eas update --branch production --message "Fix login bug"

Semantic Versioning for App Releases

Format: MAJOR.MINOR.PATCH

1.0.0 → Initial launch
1.0.1 → Bug fix (patch)
1.1.0 → New feature added (minor)
2.0.0 → Breaking redesign or major overhaul (major)

Summary

Configure app.json with your app name, version, package name, and assets before building. Use eas build to create Android .aab and iOS .ipa files in the cloud without local tooling. Submit builds to Google Play Console and Apple App Store Connect. Keep store listings accurate and include a privacy policy. Use EAS Update for fast JS-only patches that skip the store review process entirely.

Leave a Comment