# iOS-udviklercertifikat: provisioning profile og Expo

> Certifikatet viser, hvem der signerer din app, profilen hvilken app og hvilke iPhones. Med Expo opretter og fornyer EAS begge.

Original side: [iOS-udviklercertifikat: provisioning profile og Expo](https://devoria.fr/da/blog/ios-udviklercertifikat-provisioning-profile-expo)
Forfatter: [Mehdi Azizi](https://devoria.fr/da/mehdi-azizi)
Udgivet: 2026-11-04
Indhold senest revideret: 2026-11-04


Et iOS-udviklercertifikat beviser, hvem der har signeret din app. Provisioning profilen knytter certifikatet til en bestemt app og fastlægger, hvor den må køre. **Med Expo skal du næsten aldrig lave dem i hånden: EAS opretter dem, gemmer dem og fornyer dem, når du starter et build.**

Det er stadig nyttigt at forstå, hvad hver fil gør. Den dag et build nægter at installere, eller en upload går i stå, er det den viden, der sparer dig en hel dag. Denne guide gennemgår de fire elementer, deres levetid, Apples grænser og de typiske fejl, med løsningen på hver af dem.

Jeg udgiver mine iOS-apps med Expo og EAS, blandt andet Solys og TradaZen. Hele forløbet står i [udgiv en iOS-app uden Mac](https://devoria.fr/da/blog/udgiv-ios-app-uden-mac-expo-eas). Her åbner vi motorhjelmen på signeringen.

## Hvorfor Apple kræver en signatur

En iOS-app skal være signeret for at kunne installeres på en iPhone eller sendes til App Store Connect. Signaturen garanterer, at appen kommer fra en udvikler, Apple kender, og at ingen har ændret den siden.

For App Store er der en beroligende detalje. Ifølge [Apples tekniske note TN3161](https://developer.apple.com/documentation/technotes/tn3161-inside-code-signing-certificates) tjekker App Store, at dit distributionscertifikat er gyldigt ved upload, og gensignerer derefter appen, som så ikke længere afhænger af dit certifikats udløbsdato. **Dine certifikater skal altså være gyldige, når du uploader, ikke i hele appens levetid.**

## De fire elementer, du skal kende

[Expos dokumentation om credentials](https://docs.expo.dev/app-signing/app-credentials/) nævner tre for iOS: distributionscertifikatet, profilerne og nøglen til push-notifikationer. Jeg tilføjer App ID'et, uden hvilket ingen profil findes.

### Distributionscertifikatet

Det er din signatur som udvikler. [Apples hjælp om certifikater](https://developer.apple.com/help/account/certificates/certificates-overview) skelner mellem to familier:

- **Apple Development** bruges til at køre din app på dine enheder under udviklingen. Det tilhører en person.
- **Apple Distribution** bruges til at distribuere til udvalgte testenheder eller til at uploade til App Store Connect. Det tilhører teamet, og kun kontoindehaveren eller en admin kan oprette det.

Distributionscertifikatet gælder ikke en bestemt app: det samme signerer alle dine apps. Det hører sammen med en privat nøgle, og det er den, der gør det muligt at signere. Ifølge TN3161 er et Apple-certifikat normalt gyldigt i et år fra oprettelsen.

### App ID'et

App ID'et identificerer din app i en profil. Det bygger på dit bundle identifier, for eksempel `com.example.myapp` (fiktivt eksempel). Ifølge [Apples hjælp](https://developer.apple.com/help/account/identifiers/register-an-app-id) indeholder det også listen over tilladte capabilities: push-notifikationer, App Groups, Sign in with Apple…

Med Expo er det feltet `ios.bundleIdentifier` i din konfiguration. **Vælg det én gang for alle**: det skal være identisk overalt, både i din konfiguration og i App Store Connect. App ID'et udløber ikke. Og ifølge [Expos dokumentation om iOS capabilities](https://docs.expo.dev/build-reference/ios-capabilities/) synkroniserer EAS dets capabilities med din konfiguration ved hvert build.

### Provisioning profilen

Profilen binder det hele sammen. Den indeholder et App ID, et certifikat og, afhængigt af typen, en liste over tilladte enheder. Tre typer er relevante for dig:

- **Development**: din testapp på dine registrerede enheder.
- **Ad hoc**: et build, der kan installeres på en bestemt liste af enheder, hver identificeret ved sit UDID. Det er EAS' "interne distribution".
- **App Store**: til App Store Connect og TestFlight. Den indeholder ingen enhedsliste, forklarer [note TN3125](https://developer.apple.com/documentation/technotes/tn3125-inside-code-signing-provisioning-profiles).

Hver profil har en udløbsdato: normalt højst et år ifølge Apple, 12 måneder ifølge Expo.

### Nøglen til push-notifikationer (APNs)

APNs-nøglen giver din server, eller Expos, lov til at sende notifikationer til din app. Det er en .p8-fil, som kun kan downloades én gang: [Apple gemmer den ikke](https://developer.apple.com/help/account/keys/create-a-private-key) på din konto. Den samme nøgle bruges til alle dine apps, og [den udløber aldrig](https://developer.apple.com/support/expiration/).

## Oversigtstabellen

| Element                 | Bruges til                    | Varighed          | Hvem håndterer det med Expo |
| ----------------------- | ----------------------------- | ----------------- | --------------------------- |
| Distributionscertifikat | At signere dine builds        | Normalt et år     | EAS, efter login            |
| App ID                  | At identificere din app       | Udløber ikke      | Dig, derefter EAS           |
| App Store-profil        | At uploade til Apple          | Op til 12 måneder | EAS                         |
| Ad hoc-profil           | At installere på dine iPhones | Op til 12 måneder | EAS og dine enheder         |
| APNs push-nøgle         | At sende notifikationer       | Udløber ikke      | EAS eller dig               |
| Profil på gratis konto  | At teste via Xcode            | 7 dage            | Xcode, ikke EAS             |

"Dig, derefter EAS": du vælger bundle identifier, EAS tager sig af capabilities. "EAS og dine enheder": du registrerer hver test-iPhone, EAS laver profilen. Den sidste linje gælder den gratis Apple-konto: ifølge [Apples hjælp om konti](https://developer.apple.com/help/account/basics/about-your-developer-account) udløber dens profiler 7 dage efter oprettelsen.

## Apples grænser, du skal kende

- **Distributionscertifikater**: meget få pr. konto. Apples hjælp taler om ét pr. distributionstype og pr. team, Expos tabel om en grænse på 2. Husk reglen: **opret ikke et nyt certifikat ved hvert build eller på hver computer.**
- **APNs-nøgler**: højst 2 pr. konto ifølge Expo.
- **Profiler**: ingen grænse ifølge Expo.
- **Enheder**: op til 100 pr. produktfamilie og pr. medlemsår, ifølge [Apples hjælp om enheder](https://developer.apple.com/help/account/devices/devices-overview). At deaktivere en enhed frigør ikke en plads. Tælleren nulstilles til 100 ved starten af næste medlemsår, hvis du fjerner enhederne.

## Hvad EAS gør for dig

Ifølge [Expos side om managed credentials](https://docs.expo.dev/app-signing/managed-credentials/) tilbyder dit første iOS-build at generere det, der mangler. Du logger ind på din Apple Developer-konto, EAS opretter distributionscertifikatet, profilen og push-nøglen og gemmer dem på sine servere. De næste builds genbruger dem.

Tre nyttige pointer:

- **Din Apple-adgangskode bliver på din maskine.** [Expos sikkerhedsside](https://docs.expo.dev/app-signing/security/) præciserer, at den ikke sendes til deres servere, og at de gemte credentials er krypterede.
- **`eas credentials` viser dig det hele**: certifikat, profiler, push-nøgle. Kommandoen lader dig også erstatte eller fjerne dem.
- **At slette i EAS sletter ikke hos Apple.** For at frigøre en plads skal du tilbagekalde i Apples portal.

Du kan også selv bevare kontrollen med lokale credentials: en `credentials.json`-fil peger på dit certifikat (.p12) og din profil (.mobileprovision). Expo beder dig føje disse filer til `.gitignore`. Det er samme regel som for [API-nøgler i en Expo-app](https://devoria.fr/da/blog/hemmelig-api-noegle-expo-app): en hemmelighed havner aldrig i repoet.

## Typiske fejl og hvordan du løser dem

### Udløbet profil

Et ad hoc-build har sin profil indbygget: når den udløber, åbner appen ikke længere på dine test-iPhones. På App Store bekræfter Expo derimod, at udløbet ikke har nogen effekt på appen i produktion. **Løsningen: kør et nyt build.** EAS genererer en ny profil, eller du gør det selv med `eas credentials`. Geninstaller derefter det nye build på dine enheder.

Bland det ikke sammen med TestFlight: et TestFlight-build udløber efter 90 dage, uanset dit certifikat. Detaljerne står i [TestFlight til at teste din iPhone-app](https://devoria.fr/da/blog/testflight-test-iphone-app-for-apple).

### Udløbet eller tilbagekaldt certifikat

Apple er klar: hvis dit medlemskab er gyldigt, berøres dine apps, der allerede er på App Store, ikke. Til gengæld kan du ikke længere uploade et build signeret med det certifikat. Et build, der er uploadet, men endnu ikke indsendt, kan blive markeret Invalid Binary, hvis dets certifikat er blevet tilbagekaldt. Og [profiler, der indeholder et tilbagekaldt certifikat, bliver ugyldige](https://developer.apple.com/help/account/certificates/revoke-a-certificate).

**Løsningen: opret et nyt certifikat via `eas credentials` eller ved næste build**, og lad så EAS lave profilerne igen. Og tilbagekald aldrig et fungerende certifikat af ren refleks.

### Enhed mangler i ad hoc-profilen

Installationslinket virker hos dig, men ikke på en testers iPhone. Årsag: [Expos dokumentation om intern distribution](https://docs.expo.dev/build/internal-distribution/) forklarer, at kun enheder, der er med i profilen på tidspunktet for buildet, kan installere appen.

Løsningen:

1. Registrer enheden med `eas device:create`.
2. Kør et nyt build i interaktiv tilstand, logget ind på din Apple-konto, så EAS opdaterer profilen. Eller gensigner det eksisterende build med `eas build:resign` uden at kompilere det hele igen.
3. I continuous integration genbruger den ikke-interaktive tilstand profilen uden at opdatere dens liste. Tilføj flaget `--refresh-ad-hoc-provisioning-profile`.

På en ny eller netop fornyet konto kan Apple være 24 til 72 timer om at behandle en ny enhed. Det første build, der inkluderer den, kan derfor fejle: vent, og prøv igen.

### Grænsen for certifikater er nået

Apple nægter at oprette et nyt distributionscertifikat. Ofte ligger der gamle certifikater: oprettet fra Xcode på en anden Mac eller af en anden build-tjeneste. **Genbrug det eksisterende certifikat, hvis du har dets .p12-fil. Ellers tilbagekald det, der ikke længere bruges**, i Apples portal. En tilbagekaldelse påvirker ikke dine apps, der allerede er online, men den gør de profiler, der indeholdt det, ugyldige.

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

Denne besked fra Xcode betyder, at profilen ikke indeholder det certifikat, hvis private nøgle ligger på din maskine. Typisk årsag: at blande Xcodes automatiske signering og EAS' credentials. **Vælg én eneste kilde til sandheden**: EAS-builds med managed credentials eller lokale credentials, men ikke begge dele.

### Notifikationer stoppet efter tilbagekaldelse af nøgle

Hvis du tilbagekalder din APNs-nøgle, advarer Expo om, at alle apps, der bruger den, ikke længere modtager notifikationer. Opret en ny nøgle, og upload den med `eas credentials`. Dine brugeres Expo Push-tokens ændrer sig ikke.

### Capability tilføjet, profil ugyldig

At aktivere en tjeneste som push-notifikationer eller App Groups [gør profilen ugyldig](https://developer.apple.com/help/account/provisioning-profiles/edit-download-or-delete-profiles): den skal genereres igen. Med EAS sker synkroniseringen af capabilities ved hvert build. Hvis profilen stadig afvises, kan du generere en ny med `eas credentials`.

## Det næste efter signeringen

Et signeret build er kun et skridt. Produktsiden, skærmbillederne, privatlivsoplysningerne og indsendelsen til review er samlet i [udgiv en app på App Store](https://devoria.fr/da/expertise/udgiv-app-paa-app-store). Hvis du endnu ikke har dit medlemskab, så start med [Apple-udviklerkontoen](https://devoria.fr/da/blog/apple-udviklerkonto-pris-gratis-eller-betalt). Og for at forstå, hvorfor jeg anbefaler Expo til begyndere, så læs [React Native og Expo til en mobilapp](https://devoria.fr/da/expertise/mobilapp-react-native-expo).

## Hvis du forbereder din første udgivelse

Før din første upload, så tag den [gratis diagnose](https://devoria.fr/da/diagnostic): den fortæller dig, hvad der reelt blokerer i dit projekt, og sender dig min tjekliste mod afvisninger fra Apple.

Til at bygge appen, koble abonnementerne på og udgive den uden at kæmpe med signeringen følger [iOS & Android Kit](https://devoria.fr/da/kits/ios) forløbet i fire trin med startkoden fra mine apps, i dit eget tempo.

## Ofte stillede spørgsmål

### Hvad er en provisioning profile?

Det er filen, der tillader din app at køre eller blive sendt til Apple. Den forbinder et App ID, et certifikat og, afhængigt af typen, en liste over enheder. En App Store-profil indeholder ingen enheder, en ad hoc-profil lister nogle få.

### Er iOS-udviklercertifikatet gratis?

Det har ingen separat pris: distributionscertifikatet er inkluderet i Apple Developer Program til 99 $ om året. Med en gratis Apple-konto lader Xcode dig teste på højst 3 enheder, men profilerne udløber efter 7 dage, og udgivelse er umulig.

### Hvor længe varer et Apple-distributionscertifikat?

Normalt et år fra oprettelsen ifølge Apple. Provisioning profiler varer også højst 12 måneder. Nøglen til push-notifikationer udløber derimod aldrig.

### Hvad sker der, hvis mit distributionscertifikat udløber?

Intet for dine apps, der allerede er på App Store, så længe dit medlemskab er gyldigt. Du kan bare ikke længere uploade et nyt build signeret med det certifikat. Med EAS oprettes et nyt certifikat ved næste build eller med `eas credentials`.

### Skal jeg have en Mac for at oprette et iOS-certifikat?

Nej, hvis du bruger EAS. Du logger ind på din Apple-konto fra kommandolinjen, og EAS genererer certifikatet og profilen, både på Windows og Linux. Uden EAS går den klassiske metode gennem Xcode eller nøgleringen (Keychain Access) på en Mac.

### Hvor mange enheder kan en ad hoc-profil indeholde?

Din konto kan registrere op til 100 iPhones pr. medlemsår, og lige så mange for hver anden enhedsfamilie. En deaktiveret enhed tæller stadig med. Vil du teste med flere personer, så brug TestFlight.


## Dit projekt

[Review Kit](https://devoria.fr/da/kits/app-review): Min tjekliste til App Store-review, mine afvisninger fra Apple og hvordan jeg rettede dem, tjeklisten til Google Play og tre Claude Code-skills. 369 kr..

[iOS & Android Kit](https://devoria.fr/da/kits/ios): Byg din iPhone- og Android-app med Claude Code: startkoden fra mine apps, vejen helt ud i butikkerne og alle kits. 739 kr..

[Diagnose: det, der skiller dig fra din iPhone-app](https://devoria.fr/da/diagnostic): 7 spørgsmål, 60 sekunder: du finder ud af, hvad der reelt holder dig tilbage fra at udgive din iPhone-app, får din vej i 4 trin og det kit, der passer til dig.
