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, this template provides two GitHub Actions workflows powered by EAS Build and Submit:
- Cloud build (
eas-build-cloud.yml
) — the app is built on Expo’s servers (EAS Cloud). - Local build (
eas-build-local.yml
) — the app is built on a GitHub-hosted (or self-hosted) runner using the--local
flag, without relying on Expo’s servers.
Both workflows support the same inputs (platform
, profile
, auto_submit
) and use the same environment names (production
, preview
). You can choose whichever path fits your project best.
For small projects, the Cloud option is usually faster to set up. The Local option gives you full control and avoids Expo Cloud limits, but requires more setup on GitHub runners.
We ship to the App Store using the production profile by default. If you need preview or staging, follow the GitHub Environments guide to create additional environments and secrets. Some services (e.g., Supabase, RevenueCat, OneSignal) may require separate projects/keys per environment.
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
- GitHub Environments set up (at least
production
, optionallypreview
) — see GitHub Environments - 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).
3. Link the Project to Expo
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:
{
"cli": {
"version": ">=3.0.0"
},
****
"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"
5. Generate an Expo Access Token
Expo needs a personal access token to build apps from GitHub.
- Run this locally:
npx expo login
npx expo token:access
-
Go to your GitHub repo → Settings → Secrets → Actions → New repository secret
-
Add:
- Name:
EXPO_TOKEN
- Value: (paste the token)
This token will authenticate EAS builds from GitHub Actions.
We keep EXPO_TOKEN
as a Repository secret (global).
Environment-specific keys (Supabase, RevenueCat, OneSignal, etc.) live in GitHub Environments.
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:
- Access to an Apple Developer account
- A machine with Node.js and Expo CLI installed (
npx expo install eas-cli
)
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
- 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 (e.g., a .p12
certificate and .mobileprovision
profile exported from App Store Connect) via the Expo dashboard.
Once uploaded, you can view and manage these credentials in your Expo dashboard.
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.
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 hereEXPO_PUBLIC_SENTRY_DSN
: Copy from your Sentry project settings
Sentry CLI setup:
Expo CLI will automatically detect these variables during build and upload source maps.
More info: Expo + Sentry integration
8. Configure Environment Variables & Secrets
Where you store secrets depends on which workflow you use:
-
EAS Cloud (
.github/workflows/eas-build-cloud.yml
) Store runtime env and secrets in Expo (Project → Secrets). Follow the Cloud guide: GitHub Environments -
EAS Local on GitHub runner (
.github/workflows/eas-build-local.yml
) Store runtime env in GitHub Environments (e.g.,production
,preview
), and global tokens as Repository secrets. Follow the Local guide: Expo Environment Variables
9. Trigger the GitHub Action
Depending on your deployment path, run the appropriate workflow:
- EAS Cloud →
.github/workflows/eas-build-cloud.yml
(builds on Expo’s servers, can auto-submit). - EAS Local →
.github/workflows/eas-build-local.yml
(builds on a GitHub runner using--local
).
From the Actions tab in your repository, select the workflow and provide the inputs:
platform
:ios
profile
:production
(orpreview
)auto_submit
:true
to auto-submit to TestFlightuse_self_hosted
:true
if using your own runner (only for Local builds)
Pick only one workflow per release: either Cloud or Local.
Both workflows share the same environment names (production
, preview
), so you can switch anytime.
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 Connect → My Apps → your app → TestFlight tab
- From there, you can add internal/external testers and submit the app for review
🎉 Once your app is approved, it will be available on the App Store for users to download.