
Learn how to build, configure, and publish your Expo React Native mobile apps to the Apple App Store and Google Play Store smoothly.
When I first started building mobile apps with React Native, the hardest part was never writing the JavaScript code. The hardest part was always the submission process. Between provisioning profiles, certificates, keystores, and app store review guidelines, deployment used to feel like walking through a minefield.
Luckily, tools like EAS (Expo Application Services) have completely transformed this workflow. Today, I want to share how I handle building and publishing Expo apps for both Android and iOS without losing my sanity.
In the early days of React Native, you had to eject from Expo to native code just to handle basic push notifications or native modules. Then you had to open Xcode and Android Studio, fiddle with Gradle settings, and manually archive builds.
With Expo EAS, you stay in managed workflow heaven while still having full access to native configurations via plugins and EAS Build. Instead of building apps locally on your machine—where your Mac might run out of RAM or your Windows PC won't compile iOS apps—EAS builds your app in the cloud.
Here is how I set up my projects for a smooth publishing pipeline.
Before you touch the command line, your app.json file needs to be rock solid. This is the single source of truth for your app's metadata.
{
"expo": {
"name": "Nept Track",
"slug": "nept-track",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/icon.png",
"userInterfaceStyle": "automatic",
"splash": {
"image": "./assets/splash.png",
"resizeMode": "contain",
"backgroundColor": "#ffffff"
},
"ios": {
"supportsTablet": true,
"bundleIdentifier": "com.nazmulislam.nepttrack"
},
"android": {
"package": "com.nazmulislam.nepttrack",
"adaptiveIcon": {
"foregroundImage": "./assets/adaptive-icon.png",
"backgroundColor": "#ffffff"
}
},
"plugins": [
"expo-router"
]
}
}
Make sure your bundleIdentifier for iOS and package name for Android are unique. Once you publish to the stores, changing these identifiers is extremely painful.
Tagged with
Leave a comment
First, install the EAS CLI globally if you haven't already:
npm install -g eas-cli
Log in to your Expo account:
eas login
Next, initialize EAS in your project root:
eas build:configure
This generates an eas.json file in your project. This file controls your build profiles for development, preview, and production. Here is a production configuration I frequently use:
{
"cli": {
"version": ">= 12.0.0"
},
"build": {
"development": {
"developmentClient": true,
"distribution": "internal"
},
"preview": {
"distribution": "internal"
},
"production": {
"android": {
"gradleCommand": ":app:bundleRelease"
}
}
},
"submit": {
"production": {}
}
}
When building for Android, EAS can handle generating your keystore automatically. Just run:
eas build --platform android --profile production
For iOS, Apple requires developer accounts, provisioning profiles, and certificates. EAS handles all of this automatically as well. When you run the iOS build command for the first time, EAS will prompt you to log in with your Apple ID and will handle certificate generation for you:
eas build --platform ios --profile production
Wait for the cloud builders to finish. Once complete, you will have an .aab file for Android and an .ipa file for iOS.
Instead of manually downloading binaries and uploading them via Transporter or the Google Play Console, you can let EAS submit the app for you.
For Android, you need to set up Google Play Service Account credentials. Expo guides you through linking your Google Cloud project and generating a JSON key.
For iOS, you need an App Store Connect API Key.
Once configured, submitting is as simple as:
eas submit --platform android
eas submit --platform ios
This pushes your compiled binary directly to TestFlight and Google Play Console internal testing tracks.
app.json plugins (like camera, location, or notifications). If a native module uses a permission that isn't declared, Apple and Google will reject your app.eas secret:create) to securely store API keys and environment variables instead of hardcoding them in your source code.Publishing mobile apps doesn't have to be a frustrating bottleneck in your development cycle. By leveraging Expo and EAS, you can automate builds and deployments with just a few terminal commands.
Need help building or publishing your next React Native mobile app? Let's get in touch and talk about your project.