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.
