# EAS Submit iOS: Expo-app publiceren in de App Store

> EAS Submit stuurt je iOS-build naar App Store Connect, waar hij in TestFlight belandt. De indiening voor review doe je zelf in App Store Connect.

Originele pagina: [EAS Submit iOS: Expo-app publiceren in de App Store](https://devoria.fr/nl/blog/eas-submit-ios-expo-app-publiceren-app-store)
Auteur: [Mehdi Azizi](https://devoria.fr/nl/mehdi-azizi)
Publicatie: 2026-10-25
Laatste inhoudsrevisie: 2026-10-25


`eas submit --platform ios` stuurt je iOS-build naar App Store Connect, waar hij na de verwerking door Apple in TestFlight verschijnt. **Het commando dient je app niet in voor de review van Apple: de build kiezen en hem voor review indienen doe je nog steeds zelf in App Store Connect.** Om het te automatiseren heeft het commando het nummer van je app-record (`ascAppId`) en een App Store Connect API-sleutel nodig.

Ik publiceer mijn iOS-apps, waaronder Solys, TradaZen en Nolera, met Expo, EAS Build en EAS Submit. Deze gids volgt de [documentatie van Expo over iOS-uploads](https://docs.expo.dev/submit/ios/), nagelezen op 25 oktober 2026. Geen Mac? Het volledige traject staat in [een iOS-app publiceren zonder Mac](https://devoria.fr/nl/blog/ios-app-publiceren-zonder-mac-expo-eas). Hier focussen we op het uploaden.

## Wat je nodig hebt vóór het eerste commando

Expo noemt drie voorwaarden:

- **Een betaald Apple Developer-account.** De prijs en de inschrijving vind je in [Apple-developeraccount](https://devoria.fr/nl/blog/apple-developer-account-kosten-gratis-of-betaald).
- **Een bundle identifier** in `ios.bundleIdentifier`. Volgens [de referentie van de Expo-configuratie](https://docs.expo.dev/versions/latest/config/app/) verzin je die zelf, maar hij moet uniek zijn in de App Store.
- **EAS CLI geïnstalleerd**, en daarna `eas login` met je Expo-account.

Je hebt ook een gesigneerde productiebuild nodig. EAS Build maakt die met het certificaat en het profiel dat hij voor je beheert, zoals uitgelegd in iOS-certificaat en provisioning profile.

### Het App Store Connect-record: jij of EAS?

EAS Submit stuurt een binary naar een app die in App Store Connect moet bestaan.

**Je kunt hem zelf aanmaken.** [De hulp van Apple](https://developer.apple.com/help/app-store-connect/create-an-app-record/add-a-new-app) beschrijft het venster New App: platform, naam, primaire taal, bundle identifier, SKU en gebruikerstoegang. Je hebt de rol Account Holder, Admin of App Manager nodig.

**EAS kan hem ook bij de eerste upload aanmaken.** Volgens [de pagina van Expo over TestFlight](https://docs.expo.dev/submit/testflight/) maakt `eas submit` het record aan als je je eerste build verstuurt. Volgens [de referentie van eas.json](https://docs.expo.dev/eas/json/) sla je die stap over als je `ascAppId` invult. De naam komt uit `appName`, of anders uit de `name` van je configuratie. De primaire taal komt uit `language`, standaard `en-US`. **Komt je app eerst in het Frans uit, vul `language` dan in vóór die eerste upload.**

Kopieer daarna het nummer van het record naar `ascAppId`. Expo zegt waar je het vindt: open je app in App Store Connect en ga naar App Information. Het is het veld Apple ID, onder General Information. **Het is een getal, niet je bundle identifier.**

## Waarom een API-sleutel in plaats van je Apple ID

EAS Submit maakt verbinding met Apple via je Apple ID of via een App Store Connect API-sleutel.

Met de Apple ID loop je tegen tweestapsverificatie aan, die [Apple verplicht](https://developer.apple.com/support/authentication/) voor alle gebruikers van App Store Connect: er moet een persoon de login bevestigen. Het app-specifieke wachtwoord, meegegeven in `EXPO_APPLE_APP_SPECIFIC_PASSWORD`, omzeilt die stap, maar [Expo vindt het minder veilig](https://github.com/expo/fyi/blob/main/apple-app-specific-password.md) dan de API-sleutel, de standaard en aanbevolen methode. **Met de sleutel log je in zonder enige interactie, en kun je het uploaden dus automatiseren.**

Twee manieren om er een te krijgen:

- **Laat EAS hem beheren.** Draai `eas credentials --platform ios`, kies het profiel `production`, log in op je Apple-account en kies "App Store Connect: Manage your API Key".
- **Gebruik je eigen sleutel.** In App Store Connect: Users and Access, tabblad Integrations, App Store Connect API, Team Keys, dan Generate API Key. Je hebt een Admin-account nodig, en [de gids van Expo](https://github.com/expo/fyi/blob/main/creating-asc-api-key.md) geeft de sleutel de rol Admin.

In het tweede geval noteer je de Key ID, zichtbaar in de lijst met actieve sleutels, en de Issuer ID, [bovenaan de pagina Integrations](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests). Bewaar vooral het `.p8`-bestand goed: [je kunt het maar één keer downloaden](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api), en Apple houdt geen kopie.

> Een Admin-sleutel kan volgens Apple gebruikers van je account aanmaken en verwijderen. Apple vraagt je de sleutel nooit in een coderepository op te slaan.

## Het minimale eas.json-bestand om te kopiëren

Alle waarden zijn nep: vervang ze door je eigen waarden.

```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` en `autoIncrement`**: de servers van EAS bewaren het buildnummer en verhogen het bij elke productiebuild. [Expo raadt deze remote modus aan](https://docs.expo.dev/build-reference/app-versions/) sinds EAS CLI 12.
- **`ascAppId`**: het nummer van je record. Zonder dit veld faalt de niet-interactieve modus.
- **`appleTeamId`**: de ID van je Apple Developer-team.
- **`ascApiKeyPath`, `ascApiKeyIssuerId`, `ascApiKeyId`**: je API-sleutel. Alle drie de velden accepteren omgevingsvariabelen. Zet de map `keys` in je `.gitignore`.

Het veld `appleId` heb je alleen nodig als je inlogt met je Apple ID. Beheert EAS je sleutel al, haal dan ook de drie `ascApiKey`-velden weg. In mijn drie apps, nagelezen op 25 oktober, bevat het productie-uploadprofiel alleen `ascAppId`, plus `appleTeamId` bij Solys: geen sleutel in het bestand.

## De build starten, en dan de upload

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

Zonder extra opties laat `eas submit` je kiezen welke build je verstuurt en vraagt het bij de eerste keer om je Apple ID. Het uploadprofiel `production` wordt standaard gebruikt als het bestaat. De [referentie van EAS CLI](https://docs.expo.dev/eas/cli/) somt de opties op waarmee je die keuze overslaat:

| Optie            | Wat het doet                       |
| ---------------- | ---------------------------------- |
| `--latest`       | Verstuurt de laatste iOS-build     |
| `--id`           | Verstuurt een specifieke EAS-build |
| `--path`         | Verstuurt een lokaal .ipa-bestand  |
| `--url`          | Verstuurt een online archief       |
| `--groups`       | Voegt toe aan een interne groep    |
| `--what-to-test` | Vult "What to test" in             |

Wil je alles achter elkaar laten lopen, voeg dan `--auto-submit` toe aan het buildcommando. Volgens [de pagina van Expo over automatisch uploaden](https://docs.expo.dev/build/automate-submissions/) gaat de afgeronde build naar EAS Submit met het uploadprofiel dat dezelfde naam heeft als het buildprofiel. Wil je een ander: `--auto-submit-with-profile=naam`. **De build gaat naar TestFlight, niet naar de review.**

In continuous integration voeg je `--non-interactive` en een `EXPO_TOKEN`-token toe. Het commando kan je dan niets vragen: het heeft `ascAppId` in het profiel nodig en een API-sleutel, die EAS aan de app heeft gekoppeld of je eigen in de drie `ascApiKey`-velden.

## Wat er na de upload gebeurt

**1. Apple verwerkt de build.** Hij moet door die verwerking voordat hij in App Store Connect verschijnt, en [Apple stuurt je een e-mail](https://developer.apple.com/help/app-store-connect/manage-builds/upload-builds) als het klaar is. Expo spreekt meestal van 10 tot 15 minuten voordat je hem in TestFlight ziet.

**2. Exportcompliance.** De status Missing Compliance betekent dat je verklaring over encryptie ontbreekt. App Store Connect stelt die vragen bij elke nieuwe versie, tenzij de Info.plist ze al beantwoordt. Bij Expo heet de sleutel `ios.config.usesNonExemptEncryption`:

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

Volgens [Apple](https://developer.apple.com/documentation/security/complying-with-encryption-export-regulations) is `false` juist als je app, inclusief libraries, geen encryptie gebruikt of alleen vrijgestelde encryptie. Encryptie van het systeem, zoals HTTPS via URLSession, is dat meestal. **Verklaar alleen `false` als dat echt klopt voor je app: je bent aan die verklaring gebonden.** Zoals elke Info.plist-sleutel vraagt deze om een nieuwe build.

**3. TestFlight.** Bij de status Ready to Submit kan de build [volgens Apple](https://developer.apple.com/help/app-store-connect/reference/app-build-statuses) naar interne testers, door de bètareview voor externe testers, of in review voor de App Store. Het veld `groups` in het profiel voegt hem toe aan je interne groepen. De rest staat in [TestFlight om je app te testen](https://devoria.fr/nl/blog/testflight-iphone-app-testen-voor-indienen).

## Uploaden is niet indienen voor review

[Expo schrijft het zelf](https://docs.expo.dev/submit/introduction/): een TestFlight-build wordt niet automatisch in de App Store gepubliceerd. EAS Submit vult je productpagina niet in, en je screenshots ook niet. Er blijven vier handelingen over in App Store Connect, beschreven in [de hulp van Apple over indienen voor review](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/submit-an-app):

1. **Vul de verplichte metadata** van de versie in.
2. **Kies de build** in de sectie Build van de versie.
3. **Klik op "Add for Review".** De versie krijgt de status Ready for Review, maar er is nog niets naar de review gegaan.
4. **Klik op "Submit for Review".** De status wordt In Review zodra de review begint.

## Veelvoorkomende fouten en hoe je ze oplost

| Getoonde fout       | Oorzaak                    | Oplossing                 |
| ------------------- | -------------------------- | ------------------------- |
| ITMS-90189          | Buildnummer al in gebruik  | `autoIncrement`           |
| ITMS-90062 of 90186 | Versie al gesloten         | `version` verhogen        |
| "Set ascAppId"      | `ascAppId` ontbreekt in CI | `ascAppId` toevoegen      |
| "API Keys cannot"   | Geen sleutel gekoppeld     | `eas credentials`         |
| ITMS-90683          | Purpose string ontbreekt   | `ios.infoPlist`           |
| ITMS-91053          | Onvolledig privacymanifest | `ios.privacyManifests`    |
| ITMS-90725          | iOS SDK te oud             | Expo SDK verhogen         |
| Missing Compliance  | Encryptie niet verklaard   | `usesNonExemptEncryption` |

Volgens Expo is een al gebruikt buildnummer een veelvoorkomende reden dat een upload wordt geweigerd: alles staat in buildnummer en versie. Drie fouten hebben hun eigen gids: [ITMS-90683 met Expo](https://devoria.fr/nl/blog/itms-90683-missing-purpose-string-expo), [ITMS-91053 met Expo](https://devoria.fr/nl/blog/itms-91053-missing-api-declaration-expo) en ITMS-90725.

De twee berichten tussen aanhalingstekens komen van EAS en los je op in de configuratie van EAS. Missing Compliance kun je ook oplossen door de vragen in App Store Connect te beantwoorden. **Bij alle andere regels raakt de oplossing de binary: maak een nieuwe build en upload hem opnieuw.** Een update op afstand verandert de Info.plist, het manifest en de nummers niet.

## Je eerste app uploaden zonder te zoeken

Het commando is maar één stap. De [iOS Kit](https://devoria.fr/nl/kits/ios) start vanaf de startcode van mijn apps, abonnementen inbegrepen, en volgt vier stappen tot in de App Store, in je eigen tempo.

Bereid je je eerste release voor? [Doe je gratis diagnose](https://devoria.fr/nl/diagnostic): die vertelt je wat je echt tegenhoudt en stuurt je mijn checklist tegen afwijzingen door Apple. Voor de productpagina, de screenshots en de goedkeuring behandelt de pagina [een app publiceren in de App Store](https://devoria.fr/nl/expertise/app-publiceren-in-app-store) elke stap.

## Veelgestelde vragen

### Hoe publiceer je een Expo-app in de App Store?

Start een productiebuild met EAS Build en upload hem met `eas submit --platform ios`. Na de verwerking door Apple verschijnt hij in TestFlight. Vul daarna in App Store Connect je productpagina in, kies die build in de versie en klik op "Add for Review" en "Submit for Review".

### Dient EAS Submit mijn app in voor review bij Apple?

Nee. EAS Submit stuurt de binary naar App Store Connect, en de build komt in TestFlight terecht. Het indienen voor review doe je handmatig in App Store Connect, als je productpagina is ingevuld en de build is gekozen.

### Waar vind ik de ascAppId van mijn app?

Open je app in App Store Connect en ga naar App Information. Het is het veld Apple ID, onder General Information. Het is een getal, niet te verwarren met je bundle identifier.

### Heb je een Apple ID nodig om eas submit te gebruiken?

Bij de eerste keer vraagt het commando erom. Daarna kan het, met `ascAppId` in het profiel en een App Store Connect API-sleutel, zonder interactie draaien, zelfs in continuous integration. De API-sleutel is de standaard en door Expo aanbevolen methode.

### Hoelang duurt het voordat je de build in TestFlight ziet?

Expo spreekt meestal van 10 tot 15 minuten verwerking bij Apple, dat je een e-mail stuurt als het klaar is. Blijft de build op de status Missing Compliance staan, beantwoord dan de vragen over encryptie en verklaar het daarna in je configuratie voor de volgende builds.


## Je project

[Apple Review Kit](https://devoria.fr/nl/kits/review-apple): De App Store-reviewchecklist die ik gebruik, mijn opgeloste afwijzingen, de notities voor de tester en twee Claude Code-skills die je app nalezen. 29 €.

[iOS Kit](https://devoria.fr/nl/kits/ios): Maak je iPhone-app met Claude Code: de Starter Code van mijn apps, skills die zijn werk controleren, en de Apple Review Kit, App Store Screenshots Kit en ASO Kit. 129,99 €.
