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).
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"
},
"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"
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.
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
- 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.
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 Secrets in GitHub
To use GitHub Actions with EAS, configure the following secrets in your GitHub repository:
EXPO_TOKEN
: Personal access token from ExpoEXPO_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
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
— selectios
profile
— choose betweenproduction
orpreview
build profilesauto_submit
— set totrue
if you want to automatically submit the build to TestFlightuse_self_hosted
— set totrue
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.
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.