# iOS-certificaat en provisioning profile met Expo

> Het certificaat bewijst wie je app ondertekent, het provisioning profile zegt welke app op welke iPhones. Met Expo maakt en vernieuwt EAS ze allebei voor je.

Originele pagina: [iOS-certificaat en provisioning profile met Expo](https://devoria.fr/nl/blog/ios-certificaat-provisioning-profile-expo)
Auteur: [Mehdi Azizi](https://devoria.fr/nl/mehdi-azizi)
Publicatie: 2026-11-04
Laatste inhoudsrevisie: 2026-11-04


Een iOS-ontwikkelaarscertificaat bewijst wie je app heeft ondertekend. Het provisioning profile koppelt dat certificaat aan een specifieke app en bepaalt waar die mag draaien. **Met Expo hoef je ze bijna nooit met de hand te maken: EAS maakt ze aan, bewaart ze en vernieuwt ze als je een build start.**

Toch is het handig om te snappen wat elk bestand doet. Op de dag dat een build niet wil installeren of een upload vastloopt, scheelt die kennis je een hele dag. Deze gids loopt de vier onderdelen langs, hoe lang ze geldig zijn, de limieten van Apple en de typische fouten, met voor elke fout de oplossing.

Ik publiceer mijn iOS-apps met Expo en EAS, waaronder Solys en TradaZen. Het volledige traject staat in [een iOS-app publiceren zonder Mac](https://devoria.fr/nl/blog/ios-app-publiceren-zonder-mac-expo-eas). Hier kijken we onder de motorkap van de ondertekening.

## Waarom Apple een handtekening eist

Een iOS-app moet ondertekend zijn om op een iPhone te installeren of naar App Store Connect te gaan. De handtekening garandeert dat de app van een ontwikkelaar komt die Apple kent en dat niemand er sindsdien aan heeft gezeten.

Voor de App Store is er een geruststellend detail. Volgens [Apples technische notitie TN3161](https://developer.apple.com/documentation/technotes/tn3161-inside-code-signing-certificates) controleert de App Store bij de upload of je distributiecertificaat geldig is en ondertekent daarna de app opnieuw. Vanaf dan hangt de app niet meer af van de vervaldatum van je certificaat. **Je certificaten moeten dus geldig zijn op het moment van uploaden, niet gedurende het hele leven van de app.**

## De vier onderdelen die je moet kennen

[De documentatie van Expo over credentials](https://docs.expo.dev/app-signing/app-credentials/) noemt er drie voor iOS: het distributiecertificaat, de profielen en de sleutel voor pushmeldingen. Ik voeg de app-ID toe, want zonder die bestaat er geen enkel profiel.

### Het distributiecertificaat

Dit is je handtekening als ontwikkelaar. [Apples hulppagina over certificaten](https://developer.apple.com/help/account/certificates/certificates-overview) onderscheidt twee soorten:

- **Apple Development** gebruik je om je app tijdens de ontwikkeling op je eigen toestellen te draaien. Het hoort bij één persoon.
- **Apple Distribution** gebruik je om te distribueren naar aangewezen testtoestellen of om te uploaden naar App Store Connect. Het hoort bij het team, en alleen de accounthouder of een admin kan het aanmaken.

Het distributiecertificaat hoort bij geen enkele specifieke app: hetzelfde certificaat ondertekent al je apps. Er hoort een private key bij, en die is het die het ondertekenen mogelijk maakt. Volgens TN3161 is een Apple-certificaat meestal een jaar geldig vanaf het moment dat het is aangemaakt.

### De app-ID (App ID)

De App ID identificeert je app in een profiel. Hij neemt je bundle-ID over, bijvoorbeeld `com.exemple.monapp` (fictief voorbeeld). Volgens [Apples hulppagina](https://developer.apple.com/help/account/identifiers/register-an-app-id) bevat hij ook de lijst met toegestane capabilities: pushmeldingen, App Groups, Sign in with Apple…

Bij Expo is dat het veld `ios.bundleIdentifier` in je configuratie. **Kies hem één keer en voorgoed**: hij moet overal identiek zijn, in je configuratie en in App Store Connect. De App ID verloopt niet. En volgens [de Expo-docs over iOS-capabilities](https://docs.expo.dev/build-reference/ios-capabilities/) synchroniseert EAS de capabilities bij elke build met je configuratie.

### Het provisioning profile

Het profiel legt de verbinding. Het bevat een App ID, een certificaat en, afhankelijk van het type, een lijst met toegestane toestellen. Drie types zijn voor jou relevant:

- **Development**: je testapp op je geregistreerde toestellen.
- **Ad hoc**: een build die je kunt installeren op een vaste lijst toestellen, elk herkenbaar aan zijn UDID. Dit is de "interne distributie" van EAS.
- **App Store**: voor App Store Connect en TestFlight. Het bevat geen lijst met toestellen, legt [notitie TN3125](https://developer.apple.com/documentation/technotes/tn3125-inside-code-signing-provisioning-profiles) uit.

Elk profiel heeft een vervaldatum: meestal niet langer dan een jaar volgens Apple, 12 maanden volgens Expo.

### De sleutel voor pushmeldingen (APNs)

Met de APNs-sleutel mag jouw server, of die van Expo, meldingen naar je app sturen. Het is een .p8-bestand dat je maar één keer kunt downloaden: [Apple bewaart het niet](https://developer.apple.com/help/account/keys/create-a-private-key) in je account. Eén sleutel werkt voor al je apps, en [hij verloopt nooit](https://developer.apple.com/support/expiration/).

## De overzichtstabel

| Onderdeel              | Dient om                  | Geldigheid       | Wie beheert het met Expo |
| ---------------------- | ------------------------- | ---------------- | ------------------------ |
| Distributiecertificaat | Je builds ondertekenen    | Meestal een jaar | EAS, na inloggen         |
| App ID                 | Je app identificeren      | Verloopt niet    | Jij, daarna EAS          |
| App Store-profiel      | Naar Apple uploaden       | Tot 12 maanden   | EAS                      |
| Ad-hocprofiel          | Op je iPhones installeren | Tot 12 maanden   | EAS en je toestellen     |
| APNs-pushsleutel       | Meldingen versturen       | Verloopt niet    | EAS of jij               |
| Profiel gratis account | Testen via Xcode          | 7 dagen          | Xcode, niet EAS          |

"Jij, daarna EAS": jij kiest de bundle-ID, EAS regelt de capabilities. "EAS en je toestellen": jij registreert elke testiPhone, EAS maakt het profiel. De laatste regel gaat over het gratis Apple-account: volgens [Apples hulppagina over accounts](https://developer.apple.com/help/account/basics/about-your-developer-account) verlopen de profielen daarvan 7 dagen na het aanmaken.

## De limieten van Apple die je moet kennen

- **Distributiecertificaten**: heel weinig per account. Apples hulppagina spreekt van één per distributietype per team, de tabel van Expo van een limiet van 2. Onthoud de regel: **maak niet bij elke build of op elke computer een nieuw certificaat aan.**
- **APNs-sleutels**: maximaal 2 per account, volgens Expo.
- **Profielen**: geen limiet, volgens Expo.
- **Toestellen**: tot 100 per productfamilie per lidmaatschapsjaar, volgens [Apples hulppagina over toestellen](https://developer.apple.com/help/account/devices/devices-overview). Een toestel uitschakelen maakt geen plek vrij. De teller springt aan het begin van het volgende lidmaatschapsjaar terug naar 100, als je toestellen verwijdert.

## Wat EAS voor je doet

Volgens [de pagina van Expo over beheerde credentials](https://docs.expo.dev/app-signing/managed-credentials/) biedt je eerste iOS-build aan om te genereren wat ontbreekt. Je logt in op je Apple Developer-account, EAS maakt het distributiecertificaat, het profiel en de pushsleutel aan en bewaart ze op zijn servers. Volgende builds gebruiken ze opnieuw.

Drie nuttige punten:

- **Je Apple-wachtwoord blijft op je eigen computer.** [De beveiligingspagina van Expo](https://docs.expo.dev/app-signing/security/) vermeldt dat het niet naar hun servers gaat en dat de opgeslagen credentials versleuteld zijn.
- **`eas credentials` laat je alles zien**: certificaat, profielen, pushsleutel. Met dit commando kun je ze ook vervangen of verwijderen.
- **Verwijderen in EAS is niet verwijderen bij Apple.** Om een plek vrij te maken, moet je intrekken in het Apple-portaal.

Je kunt ook zelf de regie houden met lokale credentials: een bestand `credentials.json` verwijst naar je certificaat (.p12) en je profiel (.mobileprovision). Expo vraagt je die bestanden aan `.gitignore` toe te voegen. Het is dezelfde regel als voor [de API-sleutels van een Expo-app](https://devoria.fr/nl/blog/geheime-api-sleutel-expo-app-beschermen): een geheim komt nooit in de repository.

## Typische fouten en hoe je ze oplost

### Verlopen profiel

Een ad-hocbuild bevat zijn eigen profiel: als dat verloopt, gaat de app niet meer open op je testiPhones. In de App Store daarentegen bevestigt Expo dat het verlopen geen enkel effect heeft op de app in productie. **De oplossing: start een nieuwe build.** EAS genereert een nieuw profiel, of je doet het zelf met `eas credentials`. Installeer daarna de nieuwe build opnieuw op je toestellen.

Haal het niet door elkaar met TestFlight: een TestFlight-build verloopt na 90 dagen, wat je certificaat ook doet. Alle details staan in [TestFlight om je iPhone-app te testen](https://devoria.fr/nl/blog/testflight-iphone-app-testen-voor-indienen).

### Verlopen of ingetrokken certificaat

Apple is duidelijk: als je lidmaatschap geldig is, blijven je apps die al in de App Store staan ongemoeid. Je kunt alleen geen build meer uploaden die met dat certificaat is ondertekend. Een build die geüpload maar nog niet ingediend is, kan als Invalid Binary gemarkeerd worden als zijn certificaat is ingetrokken. En [profielen met een ingetrokken certificaat worden ongeldig](https://developer.apple.com/help/account/certificates/revoke-a-certificate).

**De oplossing: maak een nieuw certificaat aan via `eas credentials` of bij de volgende build**, en laat EAS de profielen opnieuw maken. En trek nooit uit reflex een certificaat in dat gewoon werkt.

### Toestel ontbreekt in het ad-hocprofiel

De installatielink werkt bij jou, maar niet op de iPhone van een tester. Oorzaak: [de Expo-docs over interne distributie](https://docs.expo.dev/build/internal-distribution/) leggen uit dat alleen toestellen die op het moment van de build in het profiel staan de app kunnen installeren.

De oplossing:

1. Registreer het toestel met `eas device:create`.
2. Start een nieuwe build in interactieve modus, ingelogd op je Apple-account, zodat EAS het profiel bijwerkt. Of onderteken de bestaande build opnieuw met `eas build:resign`, zonder alles opnieuw te compileren.
3. In continuous integration hergebruikt de niet-interactieve modus het profiel zonder de lijst bij te werken. Voeg de optie `--refresh-ad-hoc-provisioning-profile` toe.

Op een nieuw of net verlengd account kan Apple 24 tot 72 uur nodig hebben om een nieuw toestel te verwerken. De eerste build waar het in zit, kan dus mislukken: wacht even en probeer het opnieuw.

### Limiet voor certificaten bereikt

Apple weigert een nieuw distributiecertificaat aan te maken. Vaak slingeren er nog oude certificaten rond: aangemaakt vanuit Xcode op een andere Mac of door een andere buildservice. **Hergebruik het bestaande certificaat als je het .p12-bestand hebt. Zo niet, trek dan het certificaat dat je niet meer gebruikt in** via het Apple-portaal. Intrekken heeft geen effect op je apps die al live staan, maar maakt wel de profielen ongeldig waar het in zat.

### "Provisioning profile doesn't include signing certificate"

Deze melding van Xcode betekent dat het profiel niet het certificaat bevat waarvan de private key op jouw computer staat. Typische oorzaak: de automatische ondertekening van Xcode door elkaar gebruiken met de credentials van EAS. **Kies één bron van waarheid**: EAS-builds met beheerde credentials, of lokale credentials, maar niet allebei.

### Geen meldingen meer na het intrekken van een sleutel

Als je je APNs-sleutel intrekt, waarschuwt Expo dat alle apps die hem gebruiken geen meldingen meer ontvangen. Maak een nieuwe sleutel aan en upload die met `eas credentials`. De Expo Push-tokens van je gebruikers veranderen niet.

### Capability toegevoegd, profiel ongeldig

Een dienst zoals pushmeldingen of App Groups inschakelen [maakt het profiel ongeldig](https://developer.apple.com/help/account/provisioning-profiles/edit-download-or-delete-profiles): je moet het opnieuw genereren. Met EAS gebeurt de synchronisatie van capabilities bij elke build. Wordt het profiel nog steeds geweigerd, dan kun je met `eas credentials` een nieuw profiel genereren.

## Na de ondertekening

Een ondertekende build is maar één stap. De productpagina, de screenshots, de privacy en het indienen voor review staan allemaal in [een app publiceren in de App Store](https://devoria.fr/nl/expertise/app-publiceren-in-app-store). Heb je nog geen lidmaatschap, begin dan met [het Apple-ontwikkelaarsaccount](https://devoria.fr/nl/blog/apple-developer-account-kosten-gratis-of-betaald). En wil je weten waarom ik Expo aanraad aan beginners, lees dan [React Native en Expo voor een mobiele app](https://devoria.fr/nl/expertise/mobiele-app-react-native-expo).

## Als je je eerste publicatie voorbereidt

Doe vóór je eerste upload de [gratis diagnose](https://devoria.fr/nl/diagnostic): die vertelt je wat er echt vastzit in je project en stuurt je mijn checklist tegen afwijzingen door Apple.

Om de app te bouwen, abonnementen te koppelen en te publiceren zonder te vechten met de ondertekening, loopt de [iOS & Android Kit](https://devoria.fr/nl/kits/ios) het traject in vier stappen door, met de startcode van mijn apps, in je eigen tempo.

## Veelgestelde vragen

### Wat is een provisioning profile?

Het is het bestand dat je app toestemming geeft om te draaien of naar Apple te gaan. Het koppelt een app-ID, een certificaat en, afhankelijk van het type, een lijst met toestellen. Een App Store-profiel bevat geen toestellen, een ad-hocprofiel noemt er een paar.

### Is het iOS-ontwikkelaarscertificaat gratis?

Het heeft geen eigen prijs: het distributiecertificaat zit in het Apple Developer Program, voor 99 $ per jaar. Met een gratis Apple-account laat Xcode je testen op maximaal 3 toestellen, maar de profielen verlopen na 7 dagen en publiceren is onmogelijk.

### Hoe lang is een Apple-distributiecertificaat geldig?

Meestal een jaar vanaf het aanmaken, volgens Apple. Provisioning profiles zijn ook maximaal 12 maanden geldig. De sleutel voor pushmeldingen verloopt daarentegen nooit.

### Wat gebeurt er als mijn distributiecertificaat verloopt?

Niets voor je apps die al in de App Store staan, zolang je lidmaatschap geldig is. Je kunt alleen geen nieuwe build meer uploaden die met dat certificaat is ondertekend. Met EAS wordt bij de volgende build of met `eas credentials` een nieuw certificaat aangemaakt.

### Heb je een Mac nodig om een iOS-certificaat aan te maken?

Nee, niet als je EAS gebruikt. Je logt via de command line in op je Apple-account, en EAS genereert het certificaat en het profiel, op Windows net zo goed als op Linux. Zonder EAS loopt de klassieke methode via Xcode of de sleutelhangertoegang van een Mac.

### Hoeveel toestellen kan een ad-hocprofiel bevatten?

Je account kan tot 100 iPhones per lidmaatschapsjaar registreren, en evenveel voor elke andere toestelfamilie. Een uitgeschakeld toestel telt nog steeds mee. Wil je met meer mensen testen, gebruik dan TestFlight.


## Je project

[Review Kit](https://devoria.fr/nl/kits/app-review): Mijn App Store-reviewchecklist, mijn opgeloste afwijzingen door Apple, die voor Google Play en drie Claude Code-skills. € 49.

[iOS & Android Kit](https://devoria.fr/nl/kits/ios): Bouw je iPhone- en Android-app met Claude Code: de startcode van mijn apps, de route naar de stores en alle kits. € 99.

[Diagnose: wat staat er tussen jou en je iPhone-app](https://devoria.fr/nl/diagnostic): 7 vragen, 60 seconden: je weet wat je echt tegenhoudt om je iPhone-app te publiceren, je traject in 4 stappen en de kit die bij je past.
