# EAS Submit iOS: udgiv en Expo-app på App Store

> EAS Submit sender dit iOS-build til App Store Connect og TestFlight. Indsendelsen til review sker stadig i App Store Connect. Her er eas.json og typiske fejl.

Original side: [EAS Submit iOS: udgiv en Expo-app på App Store](https://devoria.fr/da/blog/eas-submit-ios-udgiv-expo-app-app-store)
Forfatter: [Mehdi Azizi](https://devoria.fr/da/mehdi-azizi)
Udgivet: 2026-10-25
Indhold senest revideret: 2026-10-25


`eas submit --platform ios` sender dit iOS-build til App Store Connect, hvor det dukker op i TestFlight, når Apple har behandlet det. **Kommandoen indsender ikke din app til Apples review: valget af build og indsendelsen til review skal du stadig selv klare i App Store Connect.** Vil du automatisere det, skal den bruge nummeret på din app-side (`ascAppId`) og en App Store Connect API-nøgle.

Jeg udgiver mine iOS-apps, blandt andet Solys, TradaZen og Nolera, med Expo, EAS Build og EAS Submit. Denne guide følger [Expos dokumentation om iOS-indsendelse](https://docs.expo.dev/submit/ios/), gennemlæst den 25. oktober 2026. Har du ikke en Mac, finder du hele forløbet i [udgiv en iOS-app uden Mac](https://devoria.fr/da/blog/udgiv-ios-app-uden-mac-expo-eas). Her fokuserer vi på selve indsendelsen.

## Det skal du have klar før første kommando

Expo nævner tre forudsætninger:

- **En betalt Apple Developer-konto.** Pris og tilmelding finder du i [Apple-udviklerkonto](https://devoria.fr/da/blog/apple-udviklerkonto-pris-gratis-eller-betalt).
- **En bundle identifier** i `ios.bundleIdentifier`. Ifølge [referencen for Expo-konfigurationen](https://docs.expo.dev/versions/latest/config/app/) finder du selv på den, men den skal være unik på App Store.
- **EAS CLI installeret**, og derefter `eas login` med din Expo-konto.

Du skal også have et signeret produktionsbuild. EAS Build laver det med det certifikat og den profil, som den administrerer for dig, som forklaret i iOS-certifikat og provisioning profile.

### App-siden i App Store Connect: dig eller EAS?

EAS Submit sender en binærfil til en app, der skal findes i App Store Connect.

**Du kan oprette den selv.** [Apples hjælp](https://developer.apple.com/help/app-store-connect/create-an-app-record/add-a-new-app) beskriver vinduet New App: platform, navn, primært sprog, bundle identifier, SKU og brugeradgang. Det kræver rollen Account Holder, Admin eller App Manager.

**EAS kan også oprette den ved første indsendelse.** Ifølge [Expos side om TestFlight](https://docs.expo.dev/submit/testflight/) opretter `eas submit` app-siden, når du sender dit første build. Ifølge [referencen for eas.json](https://docs.expo.dev/eas/json/) springes det trin over, hvis du udfylder `ascAppId`. Navnet kommer fra `appName` eller, hvis det mangler, fra `name` i din konfiguration. Det primære sprog kommer fra `language`, som som standard er `en-US`. **Hvis din app først udkommer på fransk, så udfyld `language` før den første indsendelse.**

Kopiér derefter app-sidens nummer ind i `ascAppId`. Expo forklarer, hvor du finder det: åbn din app i App Store Connect og gå til App Information. Det er feltet Apple ID under General Information. **Det er et tal, ikke din bundle identifier.**

## Hvorfor en API-nøgle frem for dit Apple-id

EAS Submit forbinder sig til Apple med dit Apple-id eller med en App Store Connect API-nøgle.

Apple-id'et støder på to-faktor-godkendelsen, som [Apple kræver](https://developer.apple.com/support/authentication/) af alle App Store Connect-brugere: der skal en person til at bekræfte login. En app-specifik adgangskode, angivet i `EXPO_APPLE_APP_SPECIFIC_PASSWORD`, undgår det trin, men [Expo vurderer den som mindre sikker](https://github.com/expo/fyi/blob/main/apple-app-specific-password.md) end API-nøglen, som er Expos standard og anbefalede metode. **Nøglen lader dig logge ind helt uden interaktion, og dermed kan du automatisere indsendelsen.**

Der er to måder at få den på:

- **Lad EAS administrere den.** Kør `eas credentials --platform ios`, vælg profilen `production`, log ind på din Apple-konto, og vælg "App Store Connect: Manage your API Key".
- **Brug din egen nøgle.** I App Store Connect: Users and Access, fanen Integrations, App Store Connect API, Team Keys og så Generate API Key. Det kræver en Admin-konto, og [Expos guide](https://github.com/expo/fyi/blob/main/creating-asc-api-key.md) giver nøglen rollen Admin.

I det andet tilfælde skal du notere Key ID, som vises i listen over aktive nøgler, og Issuer ID, [øverst på siden Integrations](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests). Og pas især på `.p8`-filen: [du kan kun downloade den én gang](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api), og Apple gemmer ingen kopi.

> Ifølge Apple kan en Admin-nøgle oprette og slette brugere på din konto. Apple beder dig om aldrig at lægge nøglen i et kode-repository.

## Den minimale eas.json-fil til at kopiere

Alle værdier er fiktive: erstat dem med dine egne.

```json
{
  "cli": {
    "appVersionSource": "remote"
  },
  "build": {
    "production": {
      "autoIncrement": true
    }
  },
  "submit": {
    "production": {
      "ios": {
        "ascAppId": "1234567890",
        "appleTeamId": "ABCDE12345",
        "ascApiKeyPath": "./keys/AuthKey_XXXXXXXXXX.p8",
        "ascApiKeyIssuerId": "your-issuer-id",
        "ascApiKeyId": "XXXXXXXXXX"
      }
    }
  }
}
```

- **`appVersionSource` og `autoIncrement`**: EAS' servere holder styr på build-nummeret og tæller det op ved hvert produktionsbuild. [Expo anbefaler denne remote-tilstand](https://docs.expo.dev/build-reference/app-versions/) siden EAS CLI 12.
- **`ascAppId`**: nummeret på din app-side. Uden det fejler den ikke-interaktive tilstand.
- **`appleTeamId`**: id'et for dit Apple Developer-team.
- **`ascApiKeyPath`, `ascApiKeyIssuerId`, `ascApiKeyId`**: din API-nøgle. Alle tre felter accepterer miljøvariabler. Tilføj mappen `keys` til din `.gitignore`.

Feltet `appleId` bruges kun, hvis du logger ind med dit Apple-id. Hvis EAS allerede administrerer din nøgle, så fjern også de tre `ascApiKey`-felter. I mine tre apps, gennemgået den 25. oktober, indeholder produktionsprofilen til indsendelse kun `ascAppId`, plus `appleTeamId` i Solys: ingen nøgle i filen.

## Kør buildet og derefter indsendelsen

```bash
eas build --platform ios --profile production
eas submit --platform ios
```

Uden andre options beder `eas submit` dig vælge, hvilket build der skal sendes, og ved første kørsel spørger den om dit Apple-id. Indsendelsesprofilen `production` bruges som standard, hvis den findes. [Referencen for EAS CLI](https://docs.expo.dev/eas/cli/) viser de options, der springer valget over:

| Option           | Hvad den gør                  |
| ---------------- | ----------------------------- |
| `--latest`       | Sender det seneste iOS-build  |
| `--id`           | Sender et bestemt EAS-build   |
| `--path`         | Sender en lokal .ipa-fil      |
| `--url`          | Sender et online-arkiv        |
| `--groups`       | Tilføjer til en intern gruppe |
| `--what-to-test` | Udfylder "What to test"       |

Vil du køre det hele i ét hug, så tilføj `--auto-submit` til build-kommandoen. Ifølge [Expos side om automatisk indsendelse](https://docs.expo.dev/build/automate-submissions/) sendes det færdige build videre til EAS Submit med den indsendelsesprofil, der hedder det samme som build-profilen. Vil du vælge en anden: `--auto-submit-with-profile=navn`. **Buildet går til TestFlight, ikke til review.**

I continuous integration tilføjer du `--non-interactive` og et `EXPO_TOKEN`. Kommandoen kan så ikke spørge dig om noget: den skal have `ascAppId` i profilen og en API-nøgle, enten den EAS har knyttet til appen, eller din egen i de tre `ascApiKey`-felter.

## Hvad der sker efter indsendelsen

**1. Apple behandler buildet.** Det skal igennem den behandling, før det dukker op i App Store Connect, og [Apple sender dig en e-mail](https://developer.apple.com/help/app-store-connect/manage-builds/upload-builds), når det er færdigt. Expo nævner typisk 10 til 15 minutter, før du kan se det i TestFlight.

**2. Eksportoverholdelse.** Statussen Missing Compliance betyder, at din erklæring om kryptering mangler. App Store Connect stiller de spørgsmål ved hver ny version, medmindre Info.plist allerede svarer på dem. Med Expo hedder nøglen `ios.config.usesNonExemptEncryption`:

```json
{
  "expo": {
    "ios": {
      "config": {
        "usesNonExemptEncryption": false
      }
    }
  }
}
```

Ifølge [Apple](https://developer.apple.com/documentation/security/complying-with-encryption-export-regulations) passer `false`, hvis din app, inklusive biblioteker, ikke bruger nogen kryptering eller kun undtaget kryptering. Systemets kryptering, som HTTPS via URLSession, er det som regel. **Erklær kun `false`, hvis det er sandt for din app: erklæringen forpligter dig.** Som alle nøgler i Info.plist kræver den et nyt build.

**3. TestFlight.** Ved statussen Ready to Submit kan buildet [ifølge Apple](https://developer.apple.com/help/app-store-connect/reference/app-build-statuses) gå til interne testere, gennemgå beta-review for eksterne testere eller sendes til App Store-review. Feltet `groups` i profilen tilføjer det til dine interne grupper. Resten finder du i [TestFlight til at teste din app](https://devoria.fr/da/blog/testflight-test-iphone-app-for-apple).

## Indsendelse er ikke det samme som at sende til review

[Expo skriver det selv](https://docs.expo.dev/submit/introduction/): et TestFlight-build bliver ikke automatisk udgivet på App Store. EAS Submit udfylder hverken din app-side eller dine screenshots. Der er fire trin tilbage i App Store Connect, beskrevet i [Apples hjælp om indsendelse til review](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/submit-an-app):

1. **Udfyld de obligatoriske metadata** for versionen.
2. **Vælg buildet** i versionens Build-sektion.
3. **Klik på "Add for Review".** Versionen får status Ready for Review, men intet er sendt til review endnu.
4. **Klik på "Submit for Review".** Statussen skifter til In Review, når reviewet går i gang.

## Hyppige fejl og hvordan du retter dem

| Vist fejl              | Årsag                       | Løsning                   |
| ---------------------- | --------------------------- | ------------------------- |
| ITMS-90189             | Build-nummer allerede brugt | `autoIncrement`           |
| ITMS-90062 eller 90186 | Version allerede lukket     | Hæv `version`             |
| "Set ascAppId"         | `ascAppId` mangler i CI     | Tilføj `ascAppId`         |
| "API Keys cannot"      | Ingen nøgle tilknyttet      | `eas credentials`         |
| ITMS-90683             | Purpose string mangler      | `ios.infoPlist`           |
| ITMS-91053             | Ufuldstændigt manifest      | `ios.privacyManifests`    |
| ITMS-90725             | For gammelt iOS SDK         | Opgrader Expo SDK         |
| Missing Compliance     | Kryptering ikke erklæret    | `usesNonExemptEncryption` |

Ifølge Expo er et build-nummer, der allerede er brugt, en almindelig årsag til afvisning ved indsendelse: alt om det står i build-nummer og version. Tre af fejlene har deres egen guide: [ITMS-90683 med Expo](https://devoria.fr/da/blog/itms-90683-missing-purpose-string-expo), [ITMS-91053 med Expo](https://devoria.fr/da/blog/itms-91053-missing-api-declaration-expo) og ITMS-90725.

De to beskeder i anførselstegn kommer fra EAS og rettes i EAS-konfigurationen. Missing Compliance kan også løses ved at besvare spørgsmålene i App Store Connect. **For alle de andre linjer rammer rettelsen selve binærfilen: lav et nyt build, og send det igen.** En remote-opdatering ændrer hverken Info.plist, manifestet eller numrene.

## Send din første app afsted uden at famle

Kommandoen er kun ét trin. [iOS Kit](https://devoria.fr/da/kits/ios) tager udgangspunkt i startkoden fra mine apps, abonnementer inklusive, og følger fire trin helt frem til App Store, i dit eget tempo.

Hvis du forbereder din første udgivelse, så [tag den gratis diagnose](https://devoria.fr/da/diagnostic): den fortæller dig, hvad der reelt holder dig tilbage, og sender dig min tjekliste mod afvisninger fra Apple. For app-side, screenshots og godkendelse gennemgår siden [udgiv en app på App Store](https://devoria.fr/da/expertise/udgiv-app-paa-app-store) hvert trin.

## Ofte stillede spørgsmål

### Hvordan udgiver jeg en Expo-app på App Store?

Kør et produktionsbuild med EAS Build, og send det derefter med `eas submit --platform ios`. Når Apple har behandlet det, dukker det op i TestFlight. I App Store Connect udfylder du så app-siden, vælger buildet i versionen og klikker på "Add for Review" og "Submit for Review".

### Sender EAS Submit min app til review hos Apple?

Nej. EAS Submit sender binærfilen til App Store Connect, og buildet lander i TestFlight. Indsendelsen til review sker manuelt i App Store Connect, når app-siden er udfyldt og buildet valgt.

### Hvor finder jeg min apps ascAppId?

Åbn din app i App Store Connect, og gå til App Information. Det er feltet Apple ID under General Information. Det er et tal, som ikke må forveksles med din bundle identifier.

### Skal jeg bruge et Apple-id for at bruge eas submit?

Ved første kørsel spørger kommandoen om det. Derefter kan den, med `ascAppId` i profilen og en App Store Connect API-nøgle, køre uden interaktion, også i continuous integration. API-nøglen er Expos standard og anbefalede metode.

### Hvor lang tid går der, før buildet kan ses i TestFlight?

Expo nævner typisk 10 til 15 minutters behandling hos Apple, som sender dig en e-mail, når det er færdigt. Hvis buildet bliver stående med statussen Missing Compliance, så besvar spørgsmålene om kryptering, og erklær det derefter i din konfiguration til de næste builds.


## Dit projekt

[Apple Review Kit](https://devoria.fr/da/kits/review-apple): Den App Store-review-tjekliste, jeg bruger, mine rettede afvisninger fra Apple, noter til testeren og to Claude Code-skills, der gennemgår din app. 29 €.

[iOS Kit](https://devoria.fr/da/kits/ios): Lav din iPhone-app med Claude Code: Starter Code fra mine apps, skills der tjekker arbejdet, og Apple Review Kit, App Store Screenshots Kit og ASO Kit. 129,99 €.
