Expo EAS Build og Submit er Expos hostede tjeneste, der bygger og udgiver iOS- og Android-apps til App Store og Google Play uden en lokal Xcode- eller Android Studio-opsætning. I 2026 er EAS blevet standarden for React Native-deployment, fordi det håndterer credentials, native afhængigheder og butiksindsendelse i én pipeline. Denne guide dækker eas.json-profiler, credentials, EAS Submit, EAS Update og de faldgruber, jeg selv er stødt på gennem seks produktions-apps.
EAS Build bygger native binærfiler i skyen, så du undgår at vedligeholde lokale iOS- og Android-toolchains.
eas.json definerer tre standardprofiler (development, preview og production), som styrer build-type, distribution og miljøvariabler.
EAS Submit sender automatisk .ipa- og .aab-filer til App Store Connect og Google Play Console, inklusive metadata og credentials.
Development builds erstatter Expo Go, når du bruger native moduler, som Expo Go ikke understøtter.
EAS Update leverer JavaScript-only-opdateringer over-the-air uden en ny butiks-udgivelse.
Gratis-planen giver 30 builds/måned; Production-planen ($99/måned) fjerner byggekø-ventetid og hæver samtidige builds.
Hvad er EAS Build, og hvorfor bruge det?
EAS Build er Expos cloud-baserede byggetjeneste, der producerer signerede native binærfiler (.ipa til iOS og .aab/.apk til Android) direkte fra din React Native- eller Expo-kildekode. I stedet for at holde en Mac med den rigtige Xcode-version, korrekte CocoaPods, Fastlane-scripts og fungerende signeringscertifikater, uploader du bare kildekoden, og EAS returnerer en byggeklar fil. Ærligt talt: jeg har brugt EAS på fem af mine seneste seks apps, og den tid, vi sparer alene på ikke at debugge lokale Android SDK-inkompatibiliteter, retfærdiggør prisen med god margin.
EAS Build understøtter både bare React Native-projekter og Expo-managed workflows. Fra 2026 er der ingen praktisk grund til at bruge classic expo build, som blev udfaset i 2023. EAS understøtter monorepos, custom native code, private npm-registre og alle nyere Xcode-/NDK-versioner. Din CI/CD-pipeline reduceres til eas build --platform all --profile production --non-interactive, som du kan trigge fra GitHub Actions eller GitLab CI. For teams uden en dedikeret DevOps-ressource er dette nok den største tidsbesparelse, du kan foretage lige nu.
For at forstå, hvordan EAS spiller sammen med resten af Expo-økosystemet, kan du kigge på vores guide til Expo Router og filbaseret navigation, som beskriver det routing-lag, EAS Build kompilerer.
Installation og opsætning af EAS CLI
Første skridt er at installere EAS CLI globalt og logge ind med din Expo-konto. CLI'en fungerer på macOS, Linux og Windows og kræver Node.js 20 eller nyere i 2026. Du kan finde den nyeste release-oversigt på EAS CLI GitHub-siden.
# Installer EAS CLI globalt
npm install -g eas-cli
# Bekræft version (15.x eller nyere pr. 2026)
eas --version
# Log ind med din Expo-konto
eas login
# Verificer, at du er logget ind
eas whoami
Gå derefter til dit React Native-projekt og kør eas build:configure. Kommandoen registrerer, om projektet bruger Expo-managed eller bare workflow, og genererer en eas.json-fil samt initielle iOS/Android-projekt-identifiers.
# Fra roden af dit projekt
cd my-react-native-app
# Initialiser EAS (genererer eas.json og linker projektet)
eas build:configure
# Vælg platforme: iOS, Android eller begge
# CLI'en spørger om Apple Team ID og Google Package name
Hvis dit projekt er nyt, skal du desuden køre npx expo install expo-dev-client, hvis du vil bruge development builds (mere om det nedenfor). Bemærk, at EAS Build som udgangspunkt læser miljøvariabler fra din shell KUN i --local-tilstand; til cloud-builds skal secrets defineres via eas env:create eller i eas.json.
eas.json build-profiler forklaret
eas.json er hjertet i din build-konfiguration. Den definerer navngivne profiler, som hver styrer distributionstype, resource class, environment-variabler og signeringsstrategi. Standardopsætningen genererer tre profiler: development, preview og production. I praksis har jeg altid mindst fire. Jeg tilføjer en staging-profil, der peger på et test-API, så vi kan smoke-teste før release.
Nøglefelterne at kende: distribution ("internal" for testflight/intern testing, "store" for butiksudgivelse), channel (hvilket EAS Update-kanal-navn buildet lytter på), autoIncrement (bumper automatisk buildNumber og versionCode) og resourceClass (m-medium er standard; m-large fordobler CPU og halverer build-tid til gengæld for højere pris).
Development builds vs Expo Go
Forskellen mellem et EAS development build og Expo Go er, at development builds er en custom-kompileret version af din app med alle dine native afhængigheder inkluderet, mens Expo Go er en generisk sandbox, der kun understøtter et forudbestemt sæt native moduler. I det øjeblik du installerer react-native-mmkv, @react-native-firebase/app eller andre moduler uden for Expo SDK, skal du bruge et development build. Ingen vej udenom.
Jeg anbefaler at bygge development builds tidligt, gerne som første handling efter eas build:configure. Kør én gang, distribuér .apk/.ipa'en til dit team via QR-kode, og herefter kan alle iterere hurtigt uden at genbygge, så længe I kun ændrer JavaScript. Kun ændringer til native afhængigheder eller app.json-plugins kræver et nyt build.
# Byg et development build til iOS-simulator (gratis, hurtigt)
eas build --profile development --platform ios --simulator
# Byg et development build til fysisk Android-enhed
eas build --profile development --platform android
# Kør Metro-serveren og scan QR-koden i dev-clienten
npx expo start --dev-client
EAS håndterer iOS-certifikater, provisioning profiles og Android-keystores automatisk, hvis du lader det. Første gang du kører eas build --platform ios, spørger CLI'en, om du vil lade Expo generere og gemme dine certificates. Sig ja, medmindre din organisation har en eksisterende Fastlane Match-opsætning, du skal integrere med.
For Android genererer EAS en upload-keystore, som gemmes i Expos secure vault. Du kan altid downloade den med eas credentials og lægge en backup i din password manager. Jeg har set teams miste adgang til deres Play Store-listing, fordi keystore-filen forsvandt. Google Play Signing gør det muligt at nulstille, men det er en ret ubehagelig proces, hvis din upload-keystore er væk.
# Se og administrer credentials interaktivt
eas credentials
# Gem en secret (læses som proces-env under build)
eas env:create --name STRIPE_SECRET_KEY --value sk_live_xxx \
--environment production --visibility secret
# Liste alle secrets for et miljø
eas env:list --environment production
EAS Submit: App Store og Google Play
EAS Submit uploader den byggede .ipa eller .aab til Apple App Store Connect eller Google Play Console. Sæt op én gang, og indsendelse bliver en enkelt kommando. For iOS skal du bruge en App Store Connect API-nøgle (foretrukket over dit Apple-ID password); for Android skal du oprette en Google Service Account med tilstrækkelige rettigheder.
# Indsend det seneste production build til begge stores
eas submit --platform all --profile production --latest
# Eller indsend et specifikt build-ID
eas submit --platform ios --id abc123-def456
# Kombiner build + submit i én kommando
eas build --platform all --profile production --auto-submit
Til Apple skal du generere en App Store Connect API-nøgle på App Store Connect Access-siden og gemme .p8-filen sikkert. Til Google skal du oprette en service account i Google Cloud Console og give den "Release manager"-rollen i Play Console. Læg JSON-nøglen i projektroden (og tilføj den til .gitignore) eller referér den via en secret.
EAS Update: OTA-opdateringer
EAS Update leverer JavaScript- og asset-opdateringer over-the-air, uden at brugerne skal downloade en ny version fra butikken. Det er den moderne erstatning for CodePush og fungerer med både managed og bare workflow. Det virker naturligvis kun for JavaScript-ændringer. Enhver ændring til native kode kræver stadig et nyt EAS Build og en ny butiksindsendelse.
# Installer expo-updates i projektet
npx expo install expo-updates
# Konfigurer projektet til updates (bind til preview-kanal)
eas update:configure
# Publicer en opdatering til production-kanalen
eas update --branch production --message "Fix crash on Android 15"
# Se aktive branches og deres seneste opdatering
eas branch:list
Nøgleforståelsen: EAS Updates arbejder med channels og branches. En channel er defineret i eas.json på build-tidspunktet og er indbygget i binærfilen. Branches kan pege på hvilken som helst channel og opdateres dynamisk. Det betyder, du kan promovere en preview-opdatering til production ved at pege production-channel'en på samme branch, hvilket er nyttigt til A/B-tests eller gradvise udrulninger.
Pricing, kvoter og build-tider
EAS Build-pricing (pr. 2026) er struktureret sådan: Gratis-planen giver 30 builds/måned, med maks. 1 samtidig build og standard-priority-kø, som typisk betyder 10-40 minutters ventetid. Production-planen ($99/måned) hæver til 2 samtidige builds og priority-kø. Enterprise-planer forhandles individuelt. Se altid Expos officielle prisside for aktuelle tal, da priserne bliver justeret nogle gange om året.
Feature
Free
Production ($99/mo)
Enterprise
Medium builds/måned
30
Ubegrænset*
Ubegrænset
Samtidige builds
1
2
Op til 30
Byggekø-prioritet
Standard
Priority
Priority
Large resource class
Betalt pr. build
Inkluderet med rate
Ubegrænset
EAS Update MAU
1.000
50.000
Custom
SLA og support
Community
E-mail
Dedikeret
Typiske build-tider på m-medium (2 vCPU, 4 GB RAM): 8-15 minutter for iOS, 5-10 minutter for Android. På m-large halveres dette omtrent til gengæld for ca. dobbelt pris pr. build. For et team, der bygger flere gange dagligt, betaler Production-planen sig hurtigt hjem på ventetid alene.
Almindelige fejl og fejlfinding
De fire fejl, jeg oftest ser på tværs af projekter: 1) "Invalid Info.plist", som skyldes næsten altid en fejlagtig ios.bundleIdentifier eller manglende usage description for permissions i app.json. 2) "Duplicate build number", der løses ved appVersionSource: "remote". 3) "Missing google-services.json", hvor filen skal committes eller uploades som secret file. 4) Kolde builds tager 20+ minutter, normalt fordi CocoaPods cache er tom; der er ikke rigtig noget at gøre ved cold start, men efterfølgende builds er meget hurtigere.
For at fejlfinde skal du bruge eas build:list til at finde build-ID'et og derefter åbne fejlloggen på expo.dev/accounts/<user>/projects/<app>/builds/<id>. Loggen er opdelt i faser (setup, install, prebuild, xcodebuild/gradle, upload), så du hurtigt kan lokalisere, hvor fejlen sker. Til lokal reproduktion kan du køre eas build --local, som bygger i Docker på din maskine. Det er ret nyttigt til at debugge uden at brænde cloud-kvote.
For performance-relaterede problemer i selve appen efter deployment henviser jeg til vores React Native performance-guide, som dækker Hermes-profilering og bridge-optimering.
Ofte stillede spørgsmål
Hvad er EAS Build i Expo?
EAS Build er Expos cloud-tjeneste, der kompilerer React Native-projekter til signerede iOS .ipa- og Android .aab-filer uden en lokal Xcode- eller Android Studio-installation. Den håndterer credentials, native afhængigheder og butiksklare artefakter i én pipeline.
Kan jeg bruge EAS Build uden Expo?
Ja. EAS Build understøtter bare React Native-projekter fuldt ud, så du behøver ikke bruge Expo SDK eller managed workflow. Kør eas build:configure i dit eksisterende React Native-projekt, og EAS registrerer og bygger native iOS/Android-koden, som den er.
Hvor meget koster EAS Build?
Gratis-planen giver 30 medium builds/måned med standardkø. Production-planen koster $99/måned og giver ubegrænsede builds, priority-kø og 50.000 EAS Update MAU. Enterprise-priser forhandles individuelt.
Hvad er forskellen mellem EAS Build og Expo Go?
Expo Go er en færdig sandbox-app med et fast sæt native moduler. EAS Build genererer et custom development build, der inkluderer nøjagtigt dine egne native afhængigheder. Så snart du bruger et modul uden for Expo SDK, skal du bruge et development build.
Hvordan opsætter jeg EAS Submit til App Store?
Generér en App Store Connect API-nøgle på Apple Developer-portalen, tilføj Apple Team ID, ASC App ID og nøglereference til eas.json's submit-sektion, og kør eas submit --platform ios --profile production --latest. EAS uploader binærfilen og starter reviewprocessen automatisk.
Hvad er eas.json build-profiler?
Profiler er navngivne konfigurationssæt i eas.json, der styrer distributionstype (internal/store), resource class, environment-variabler og update-channel. Standardprofilerne er development, preview og production, men du kan tilføje egne som staging eller enterprise.
Lær hvordan du bruger TanStack Query v5 i React Native: opsætning, useQuery, mutations, offline-cache med MMKV, samt integration med NetInfo og AppState.
Alt du behøver at vide om React Natives nye arkitektur (Fabric, TurboModules, JSI, Codegen) i 2026: hvad hver del gør, hvordan du aktiverer den i Expo SDK 52+, og migrationsstien for eksisterende apps.
Zustand vs Redux Toolkit i React Native 2026: praktisk sammenligning af bundle-størrelse, performance, DX og kodeeksempler, så du kan vælge det rigtige bibliotek til din app.