Skip to content
Muhammet Şafak
tr
Journal 4 min read

Submitting a Mobile App to the Stores with Expo

A first-hand account of the preparation steps and real experience of submitting a React Native app to the App Store and Google Play using Expo and EAS Build.


I had already produced Looplio’s first testable build, but actual store distribution was a different beast. There is a gap between an app that works in your development environment and one that is live in a store — and it is not a technical gap, it is a process gap. Crossing that gap took longer than I expected.

Expo and EAS (Expo Application Services) simplify this process significantly, but “simplify” does not mean “eliminate.”

From Expo Go to EAS Build

Working with the Expo Go app during development is fast: scan a QR code, grab your phone, and you are testing instantly. But that build cannot be used for production. Submitting to a store requires a real native build: .ipa for iOS, .aab (Android App Bundle) for Android.

That is where EAS Build comes in. It is Expo’s cloud-based build service — it compiles the iOS and Android native code on Expo’s servers and delivers the finished file to you.

# Install EAS CLI
npm install -g eas-cli

# Connect the project to EAS
eas init

# Generate build configuration
eas build:configure

The eas build:configure command creates an eas.json file. Three profiles can be defined: development, preview, and production. The production profile is the one used for the build you submit to the store.

{
  "build": {
    "development": {
      "developmentClient": true,
      "distribution": "internal"
    },
    "preview": {
      "distribution": "internal"
    },
    "production": {
      "autoIncrement": true
    }
  }
}

Certificates and Signing

This is the part of iOS that demands the most attention. You need an Apple Developer account — $99 a year. EAS can automate certificate and provisioning profile management: use the eas credentials command to hand that responsibility over to Expo, or supply your own certificates.

The first time around I let Expo handle it automatically. After answering a few questions, it generated the required certificates and wired them into the build. Doing this by hand would have taken considerably longer.

Signing on Android is similar — you need to generate a keystore file. EAS can manage that too. One important note: losing this file means you can no longer update the app. Back it up.

app.json / app.config.js Configuration

The configuration file must be complete before you build. The most commonly overlooked fields:

{
  "expo": {
    "name": "Looplio",
    "slug": "looplio",
    "version": "1.0.0",
    "ios": {
      "bundleIdentifier": "com.looplio.app",
      "buildNumber": "1"
    },
    "android": {
      "package": "com.looplio.app",
      "versionCode": 1
    }
  }
}

The bundleIdentifier and package values must match what you registered in the store. Once set, changing them causes serious problems — choose carefully.

Running the Build

# Production build for iOS
eas build --platform ios --profile production

# Production build for Android
eas build --platform android --profile production

# Both platforms at once
eas build --platform all --profile production

The build runs on Expo’s servers, so it keeps going even if you close the terminal. When it finishes, you get a download link — a .ipa for iOS, an .aab for Android.

My first iOS build took around 20 minutes. Subsequent builds are faster because dependencies come from the cache.

App Store Connect and Google Play Console

You have the build files; now comes the store side. For iOS that means creating an app record in App Store Connect; for Android, in Google Play Console.

Each store has its own requirements:

App Store: A privacy policy URL is mandatory. App descriptions and screenshots are required for multiple device sizes (iPhone and iPad separately). Category, language, age rating, and pricing. Review takes 24–72 hours.

Google Play: Privacy policy is mandatory. App description, screenshots, a target audience and content rating questionnaire. The initial review takes a bit longer than the App Store; subsequent updates move faster.

EAS Submit

EAS’s second major feature: automatically submitting the build to the store.

# Submit to the App Store for iOS
eas submit --platform ios --latest

# Submit to Google Play for Android
eas submit --platform android --latest

This requires an App Store Connect API key and a Google Play service account JSON file. Set them up once and you never have to do a manual upload again.

The Reality of the Process

“Submitting an app to the store” is a one-day job — in theory. In practice, the first time — creating accounts, preparing all the documentation, validating the configuration, waiting for review — it can stretch across an entire week. Planning around that expectation matters.

EAS significantly eased the technical side of this process. Store requirements and review policies will always be there. But at least you can largely stay out of the native Xcode and Android Studio complexity.

The process is complete for Looplio — the app is live in both stores. The next update will be much faster.

Share:

Comments

Sign in with your GitHub account to join the discussion. Comments are stored in GitHub Discussions.

Related Posts

Search the site

Start typing to search posts, projects and pages.

Esc to close Powered by Pagefind