ExpoLaunch

Submit IOS to App Store

A guide to publishing your iOS app via GitHub Actions and EAS Submit.

To submit your iOS app to the App Store, we use EAS Build and Submit via GitHub Actions.

In this setup, we build the app on GitHub-hosted runners using the --local flag, which means the build is executed inside the GitHub CI environment — not on Expo’s servers. This helps avoid Expo’s build limits and costs, especially if you already pay for GitHub (e.g., via GitHub Pro or GitHub Team).

Keep in mind: GitHub-hosted runners also have usage limits. If you exceed the free tier, builds may be throttled or disabled.

I chose this approach to centralize CI/CD billing via GitHub and avoid additional charges from EAS Build servers.

In this setup, we use only the production build profile. Other profiles like preview or development are not configured and serve as a placeholder for possible staging environments in the future. If you plan to use them, you'll need to set up separate credentials, environments, and services (e.g., Supabase, RevenueCat).


Prerequisites

To submit your iOS app to the App Store, you need:

  • An active Apple Developer account ($99/year)
  • An Expo account for building and submitting your app using EAS
  • A properly configured GitHub repository with your app code and GitHub Actions
  • Your app linked to an Expo project via eas init
  • A Sentry account if you're using sentry-expo for error tracking

Once you've registered and connected your Apple Developer and Expo accounts, and configured your GitHub project, you can submit your app using GitHub Actions.

1. Prepare Your App for Submission

Before you can submit your app, make sure:

  • The app is fully developed and tested
  • All required assets are in place (icons, splash screens, screenshots, descriptions)
  • App metadata is ready on App Store Connect

You can use Expo’s documentation to prepare your app for submission.


2. Create Expo Account

Before proceeding, create a free Expo account. It’s required to build and submit iOS apps using Expo Application Services (EAS).


This template already includes the eas.json and .eas/ folders.

However, you must link the project to your own Expo account to use builds and submissions.

To link the project, run:

npx eas init --id-only

This will link the current project to your Expo account and create .eas/project.json.

To confirm the link:

npx eas project:view

You should see your Expo username and linked project name.


4. Set up eas.json

This template already includes a basic eas.json. You only need to update one field:

eas.json
{
  "cli": {
    "version": ">=3.0.0"
  },
  "build": {
    "production": {
      "releaseChannel": "production",
      "developmentClient": false,
      "distribution": "internal"
    }
  },
  "submit": {
    "production": {
      "ios": {
        "ascAppId": "YOUR_ASC_APP_ID"
      }
    }
  }
}

🔍 What is ascAppId?

It’s the App Store Connect App ID, assigned when you register your app on App Store Connect.

You’ll find it in the app URL:

https://appstoreconnect.apple.com/apps/<ascAppId>

Replace the value with your actual ID:

"ascAppId": "YOUR_ASC_APP_ID"

setup eas


5. Generate an Expo Access Token

Expo needs a personal access token to build apps from GitHub.

  1. Run this locally:
npx expo login
npx expo token:access
  1. Go to your GitHub repo → Settings → Secrets → Actions → New repository secret

  2. Add:

  • Name: EXPO_TOKEN
  • Value: (paste the token)

This token will authenticate EAS builds from GitHub Actions. expo token


6. Run eas credentials locally (important)

Before triggering a GitHub Action for iOS builds, you must configure your credentials locally:

If you skip this step, your GitHub Action will fail with a Credentials are not set up error.

What you need:

Step 1: Start credentials setup

In your terminal, run:

npx eas credentials

Step 2: Configure Build Credentials

Select:

Build Credentials: Manage everything needed to build your project

Then complete the setup:

  • Log into your Apple Developer account
  • Choose your team
  • You can either:
  • Let Expo generate or upload your own Distribution Certificate
  • Let Expo manage or upload your own Provisioning Profile

Alternatively, you can upload your existing credentials manually — for example, a .p12 certificate and .mobileprovision profile exported from App Store Connect — via the Expo website

Once uploaded, you can view and manage these credentials in your Expo dashboard. setup eas setupeas

Step 3: Configure App Store Connect API Key

Return to the main eas credentials menu, and then select:

App Store Connect: Manage your API Key

Choose one of the following:

  • Use an existing API Key for EAS Submit (recommended if you already have one)
  • Add a new API Key for EAS Submit (Expo will generate and configure it automatically)

Both steps are required — Build Credentials and API Key. Otherwise, eas submit --non-interactive will fail.

Once completed, credentials (cert + provisioning profile) will be stored on Expo’s servers.

Now you’re ready to automate iOS builds with GitHub Actions.

app store connect


7. Configure Sentry Integration

If you use Sentry to monitor your app, you can integrate it with EAS builds to automatically upload source maps and native debug symbols.

Required secrets:

  • SENTRY_AUTH_TOKEN: Create one from your Sentry account here Expolaunch
  • EXPO_PUBLIC_SENTRY_DSN: Copy from your Sentry project settings Expolaunch sentry

Sentry CLI setup:

Expo CLI will automatically detect these variables during build and upload source maps.

More info: Expo + Sentry integration


8. Configure Secrets in GitHub

To use GitHub Actions with EAS, configure the following secrets in your GitHub repository:

  • EXPO_TOKEN: Personal access token from Expo
  • EXPO_PUBLIC_SUPABASE_PROJECT_URL
  • EXPO_PUBLIC_SUPABASE_ANON_KEY
  • EXPO_PUBLIC_GOOGLE_WEB_CLIENT_ID
  • EXPO_PUBLIC_GOOGLE_WEB_CLIENT_SECRET
  • EXPO_PUBLIC_GOOGLE_IOS_CLIENT_ID
  • EXPO_PUBLIC_REVENUECAT_API_KEY_IOS
  • EXPO_PUBLIC_SENTRY_DSN
  • SENTRY_AUTH_TOKEN

Expolaunch github secrets


9. Trigger the GitHub Action

Once everything is set up, you can manually trigger the GitHub Action to build and (optionally) submit your app.

The workflow file is located at:

.github/workflows/eas-build.yml

You can trigger it from the Actions tab in your GitHub repository.

The action supports the following parameters:

  • platform — select ios
  • profile — choose between production or preview build profiles
  • auto_submit — set to true if you want to automatically submit the build to TestFlight
  • use_self_hosted — set to true if you want to build the app locally (useful when EAS build limits are reached)

If auto_submit is disabled, the build output will be saved as an artifact that you can download from the GitHub Actions UI.

Expolaunch github action


10. Submit to TestFlight

After a successful build and submission:

  • The app will be uploaded to App Store Connect’s TestFlight section
  • You can then go to App Store ConnectMy Apps → your app → TestFlight tab
  • From there, you can add internal/external testers and submit the app for review

Expolaunch github action

🎉 Once your app is approved, it will be available on the App Store for users to download.


Resources