Build & App Store
Your app works in development — now it's time to ship it. In this course, you will learn to build production binaries with EAS, distribute through TestFlight and the Play Store, prepare your store listing, and push updates without going through app review.
Development vs Production Build
During development, you run the app through Expo Go — a shell app that loads your JavaScript code over the network. This is fast for iteration but not distributable. For the App Store, you need a standalone binary — a real .ipa (iOS) or .apk/.aab (Android) file.
.ipa for iOS, .aab for Android) that contains your app's JavaScript bundle and all native dependencies. This is what you submit to the App Store or Play Store. Users download and install it like any other app.Challenge: Understand the Difference
Explain in your own words why you cannot submit an Expo Go-based app to the App Store. What is the difference between loading JavaScript over the network and bundling it into a standalone binary?
EAS Build
Install the EAS CLI and configure your project:
# Install EAS CLI globally
npm install -g eas-cli
# Log in to your Expo account
eas login
# Initialize EAS in your project
cd apps/expo && eas build:configureThis creates an eas.json file with build profiles:
{
"build": {
"development": {
"developmentClient": true,
"distribution": "internal"
},
"preview": {
"distribution": "internal"
},
"production": {}
}
}To build for a specific platform:
# Build for iOS
eas build --platform ios
# Build for Android
eas build --platform android
# Build for both
eas build --platform allpreview profile for internal testing (distributes via QR code or link) and production for store submissions.Challenge: Set Up EAS
Install eas-cli with npm install -g eas-cli. Run eas whoami to check if you're logged in. If not, run eas login to create an account and log in.
iOS Build
Building for iOS requires an Apple Developer account ($99/year). Apple requires all iOS apps to be signed with certificates and provisioning profiles. EAS handles this automatically — it creates and manages certificates for you.
Requirements for an iOS build:
- Apple Developer account ($99/year)
- App ID registered in Apple Developer portal (EAS does this automatically)
- Signing certificates and provisioning profiles (EAS manages these)
- Bundle identifier (e.g.,
com.yourcompany.fitness)
# Build for iOS production
eas build --platform ios --profile production
# Submit to App Store Connect (TestFlight)
eas submit --platform iosChallenge: iOS Requirements
What do you need to build for iOS? List all the requirements. Which ones does EAS handle automatically, and which ones do you need to set up yourself?
Android Build
Android builds require a signing keystore — a file that proves you are the developer of the app. EAS can generate one for you automatically on your first build.
# Build an APK (for direct sharing/testing)
eas build --platform android --profile preview
# Build an AAB (for Play Store submission)
eas build --platform android --profile production
# Submit to Google Play Store
eas submit --platform androidFor the Play Store, you need a Google Play Developer account ($25 one-time fee). Unlike Apple, the Android build process works on any operating system.
Challenge: APK vs AAB
What's the difference between an APK and an AAB? When would you use each? If you wanted to send a test build to a friend who has an Android phone, which format would you use?
App Store Assets
Both the Apple App Store and Google Play Store require specific assets before you can publish your app:
| Asset | Requirement |
|---|---|
| App Icon | 1024x1024 PNG, no transparency (iOS), 512x512 PNG (Android) |
| Screenshots | Various sizes for different devices (iPhone, iPad, Android phones/tablets) |
| Description | Short description (~80 chars) + full description (~4000 chars) |
| Keywords | Up to 100 characters of comma-separated keywords (iOS only) |
| Privacy Policy | A URL to your privacy policy (required by both stores) |
| Category | Primary and optional secondary category (e.g., Health & Fitness) |
Challenge: Write a Store Description
Write a 3-sentence App Store description for your fitness app. It should explain what the app does, who it's for, and what makes it useful. Keep it clear and compelling.
Challenge: Plan Your Screenshots
List 5 screenshots you would take for your app's store listing. For each, describe the screen shown and what feature it highlights. The first screenshot is the most important — it's what users see when browsing.
OTA Updates
OTA updates are one of the biggest advantages of React Native with Expo. App Store review can take 1-3 days. With OTA, your fix reaches users in minutes.
# Push an OTA update to all users on the production channel
eas update --branch production --message "Fix workout timer bug"
# Push to a preview channel for testing first
eas update --branch preview --message "Test new feature"There are important limitations to OTA updates:
- Can update: JavaScript code, images, fonts — anything in the JS bundle
- ✕ Cannot update: Native code, new native modules, app icon, splash screen
Challenge: OTA vs Full Build
Explain why OTA updates are useful. Give two examples of changes that can be shipped via OTA and two examples that require a full build and store submission.
Deploying the API
Your mobile app needs a live API to talk to. During development, the app connects tolocalhost. In production, it connects to your deployed API server.
Deploy the Go API using grit deploy (covered in the Grit Web Deploy course) to a VPS with a domain and HTTPS. Then update the mobile app's API URL:
// lib/api.ts
const API_URL = __DEV__
? "http://localhost:8080" // Development
: "https://api.fitness.com" // ProductionThe __DEV__ variable is true in development and false in production builds. This lets you switch between local and remote APIs automatically.
Challenge: Update the API URL
If your API is deployed at api.fitness.com, what changes would you make in the mobile app's API client? Where is the base URL configured? How do you handle the difference between development and production?
Summary
Here's what you learned in this course:
- EAS Build compiles your app in the cloud — no Xcode or Android Studio needed
- iOS requires an Apple Developer account; Android requires a Google Play Developer account
- TestFlight distributes iOS betas; APKs distribute Android test builds directly
- OTA updates ship JS changes instantly — no store review required
- Deploy the Go API to a VPS with HTTPS for production mobile apps
Challenge: Write a Launch Checklist
Write a complete launch checklist for your fitness app with these sections: (1) API deployment, (2) iOS build with TestFlight testing, (3) Android build with APK for internal testing, (4) App Store and Play Store listing assets, (5) OTA update strategy for post-launch fixes.
Challenge: Ship It
If you have developer accounts, run a real build with eas build --platform all. If not, run eas build --platform android --profile preview (free, no account required for APK) and install the APK on an Android device or emulator. Take a screenshot of your app running as a standalone build.
Enjoying the course?
Help us grow — star us on GitHub, subscribe on YouTube, and follow on LinkedIn.