# Certificat de dezvoltator iOS: provisioning profile și Expo

> Certificatul dovedește cine semnează aplicația, iar provisioning profile-ul spune ce aplicație și pe ce iPhone-uri. Cu Expo, EAS le creează și le reînnoiește.

Pagina originală: [Certificat de dezvoltator iOS: provisioning profile și Expo](https://devoria.fr/ro/blog/certificat-dezvoltator-ios-provisioning-profile-expo)
Autor: [Mehdi Azizi](https://devoria.fr/ro/mehdi-azizi)
Publicare: 2026-11-04
Ultima revizuire a conținutului: 2026-11-04


Un certificat de dezvoltator iOS dovedește cine a semnat aplicația ta. Provisioning profile-ul, sau profilul de provizionare, leagă acest certificat de o aplicație anume și spune unde are voie să ruleze. **Cu Expo, aproape niciodată nu trebuie să le faci de mână: EAS le creează, le stochează și le reînnoiește când pornești un build.**

Totuși, merită să înțelegi ce face fiecare fișier. În ziua în care un build refuză să se instaleze sau un upload se blochează, cunoștințele astea te scapă de o zi pierdută. Ghidul ăsta trece prin cele patru elemente, cât timp sunt valabile, limitele Apple și erorile tipice, cu soluția pentru fiecare.

Îmi public aplicațiile iOS cu Expo și EAS, printre ele Solys și TradaZen. Tot parcursul e în [publicarea unei aplicații iOS fără Mac](https://devoria.fr/ro/blog/publicare-aplicatie-ios-fara-mac-expo-eas). Aici deschidem capota semnăturii.

## De ce cere Apple o semnătură

O aplicație iOS trebuie semnată ca să se instaleze pe un iPhone sau să fie trimisă în App Store Connect. Semnătura garantează că aplicația vine de la un dezvoltator cunoscut de Apple și că nimeni n-a modificat-o de atunci.

Pentru App Store, un detaliu e liniștitor. Conform [notei tehnice TN3161 de la Apple](https://developer.apple.com/documentation/technotes/tn3161-inside-code-signing-certificates), App Store verifică dacă certificatul tău de distribuție e valid la upload, apoi re-semnează aplicația, care nu mai depinde de data de expirare a certificatului tău. **Deci certificatele tale trebuie să fie valide în momentul upload-ului, nu pe toată durata de viață a aplicației.**

## Cele patru elemente pe care trebuie să le cunoști

[Documentația Expo despre credențiale](https://docs.expo.dev/app-signing/app-credentials/) numără trei pentru iOS: certificatul de distribuție, profilurile și cheia pentru notificări push. Eu adaug și identificatorul aplicației, fără de care niciun profil nu există.

### Certificatul de distribuție

E semnătura ta de dezvoltator. [Ajutorul Apple despre certificate](https://developer.apple.com/help/account/certificates/certificates-overview) distinge două familii:

- **Apple Development** îți permite să rulezi aplicația pe dispozitivele tale în timpul dezvoltării. Aparține unei persoane.
- **Apple Distribution** servește la distribuirea pe dispozitive de test desemnate sau la trimiterea în App Store Connect. Aparține echipei și doar titularul contului sau un admin îl pot crea.

Certificatul de distribuție nu ține de nicio aplicație anume: același certificat le semnează pe toate. Vine cu o cheie privată, iar ea e cea care permite semnarea. Conform TN3161, un certificat Apple e valabil de regulă un an de la creare.

### Identificatorul aplicației (App ID)

App ID-ul identifică aplicația ta într-un profil. Preia bundle identifier-ul tău, de exemplu `com.exemple.monapp` (exemplu fictiv). Conform [ajutorului Apple](https://developer.apple.com/help/account/identifiers/register-an-app-id), conține și lista capabilităților permise: notificări push, App Groups, Sign in with Apple…

Cu Expo, e câmpul `ios.bundleIdentifier` din configurația ta. **Alege-l o dată pentru totdeauna**: trebuie să fie identic peste tot, în configurație și în App Store Connect. App ID-ul nu expiră. Și conform [documentației Expo despre capabilitățile iOS](https://docs.expo.dev/build-reference/ios-capabilities/), EAS îi sincronizează capabilitățile cu configurația ta la fiecare build.

### Profilul de provizionare

Profilul face legătura. Conține un App ID, un certificat și, în funcție de tip, o listă de dispozitive autorizate. Trei tipuri te privesc:

- **Development**: aplicația ta de test pe dispozitivele tale înregistrate.
- **Ad hoc**: un build care se poate instala pe o listă precisă de dispozitive, fiecare identificat prin UDID-ul lui. E „distribuția internă” din EAS.
- **App Store**: pentru App Store Connect și TestFlight. Nu conține nicio listă de dispozitive, explică [nota TN3125](https://developer.apple.com/documentation/technotes/tn3125-inside-code-signing-provisioning-profiles).

Fiecare profil are o dată de expirare: de regulă cel mult un an conform Apple, 12 luni conform Expo.

### Cheia pentru notificări push (APNs)

Cheia APNs autorizează serverul tău, sau pe cel al Expo, să trimită notificări aplicației tale. E un fișier .p8 care se descarcă o singură dată: [Apple nu îl păstrează](https://developer.apple.com/help/account/keys/create-a-private-key) în contul tău. Aceeași cheie merge pentru toate aplicațiile tale și [nu expiră niciodată](https://developer.apple.com/support/expiration/).

## Tabelul recapitulativ

| Element                   | La ce folosește                 | Durată          | Cine îl gestionează cu Expo |
| ------------------------- | ------------------------------- | --------------- | --------------------------- |
| Certificat de distribuție | Semnarea build-urilor           | De regulă un an | EAS, după conectare         |
| App ID                    | Identificarea aplicației        | Nu expiră       | Tu, apoi EAS                |
| Profil App Store          | Trimiterea la Apple             | Până la 12 luni | EAS                         |
| Profil ad hoc             | Instalarea pe iPhone-urile tale | Până la 12 luni | EAS și dispozitivele tale   |
| Cheie push APNs           | Trimiterea notificărilor        | Nu expiră       | EAS sau tu                  |
| Profil cont gratuit       | Testare prin Xcode              | 7 zile          | Xcode, nu EAS               |

„Tu, apoi EAS”: tu alegi bundle identifier-ul, EAS se ocupă de capabilități. „EAS și dispozitivele tale”: tu înregistrezi fiecare iPhone de test, EAS face profilul. Ultimul rând se referă la contul Apple gratuit: conform [ajutorului Apple despre conturi](https://developer.apple.com/help/account/basics/about-your-developer-account), profilurile lui expiră la 7 zile după creare.

## Limitele Apple pe care trebuie să le știi

- **Certificate de distribuție**: foarte puține pe cont. Ajutorul Apple vorbește de unul singur per tip de distribuție și per echipă, tabelul Expo de o limită de 2. Ține minte regula: **nu crea un certificat nou la fiecare build sau pe fiecare calculator.**
- **Chei APNs**: maximum 2 pe cont, conform Expo.
- **Profiluri**: fără limită, conform Expo.
- **Dispozitive**: până la 100 per familie de produse și per an de membership, conform [ajutorului Apple despre dispozitive](https://developer.apple.com/help/account/devices/devices-overview). Dezactivarea unui dispozitiv nu eliberează locul. Contorul revine la 100 la începutul următorului an de membership, dacă scoți dispozitivele.

## Ce face EAS pentru tine

Conform [paginii Expo despre credențialele gestionate](https://docs.expo.dev/app-signing/managed-credentials/), primul tău build iOS îți propune să genereze ce lipsește. Te conectezi la contul Apple Developer, EAS creează certificatul de distribuție, profilul și cheia push, apoi le stochează pe serverele lui. Build-urile următoare le refolosesc.

Trei lucruri utile:

- **Parola ta Apple rămâne pe calculatorul tău.** [Pagina de securitate Expo](https://docs.expo.dev/app-signing/security/) precizează că nu e trimisă pe serverele lor și că credențialele stocate sunt criptate.
- **`eas credentials` îți arată tot**: certificat, profiluri, cheie push. Comanda îți permite și să le înlocuiești sau să le ștergi.
- **Ștergerea în EAS nu șterge la Apple.** Ca să eliberezi un loc, trebuie să revoci în portalul Apple.

Poți păstra și controlul cu credențiale locale: un fișier `credentials.json` indică certificatul tău (.p12) și profilul (.mobileprovision). Expo cere să adaugi aceste fișiere în `.gitignore`. E aceeași regulă ca pentru [cheile API ale unei aplicații Expo](https://devoria.fr/ro/blog/cheie-api-secreta-aplicatie-expo): un secret nu ajunge niciodată în repository.

## Erorile tipice și cum le rezolvi

### Profil expirat

Un build ad hoc își include profilul: când acesta expiră, aplicația nu se mai deschide pe iPhone-urile tale de test. Pe App Store, în schimb, Expo confirmă că expirarea nu are niciun efect asupra aplicației din producție. **Soluția: pornește un build nou.** EAS generează un profil nou, sau îl faci tu cu `eas credentials`. Apoi reinstalează noul build pe dispozitive.

Nu confunda cu TestFlight: un build TestFlight expiră după 90 de zile, indiferent de certificat. Detaliile sunt în [TestFlight pentru testarea aplicației de iPhone](https://devoria.fr/ro/blog/testflight-testare-aplicatie-iphone).

### Certificat expirat sau revocat

Apple e clar: dacă membership-ul tău e valid, aplicațiile tale deja aflate pe App Store nu sunt afectate. În schimb, nu mai poți trimite build-uri semnate cu acel certificat. Un build trimis, dar încă nesupus la review, poate fi marcat Invalid Binary dacă certificatul lui a fost revocat. Și [profilurile care conțin un certificat revocat devin invalide](https://developer.apple.com/help/account/certificates/revoke-a-certificate).

**Soluția: creează un certificat nou din `eas credentials` sau la următorul build**, apoi lasă EAS să refacă profilurile. Și nu revoca niciodată din reflex un certificat care funcționează.

### Dispozitiv absent din profilul ad hoc

Linkul de instalare merge la tine, dar nu pe iPhone-ul unui tester. Cauza: [documentația Expo despre distribuția internă](https://docs.expo.dev/build/internal-distribution/) explică faptul că doar dispozitivele prezente în profil în momentul build-ului pot instala aplicația.

Soluția:

1. Înregistrează dispozitivul cu `eas device:create`.
2. Pornește un build nou în mod interactiv, conectat la contul Apple, ca EAS să actualizeze profilul. Sau re-semnează build-ul existent cu `eas build:resign`, fără să recompilezi totul.
3. În integrarea continuă, modul non-interactiv refolosește profilul fără să-i actualizeze lista. Adaugă opțiunea `--refresh-ad-hoc-provisioning-profile`.

Pe un cont nou sau abia reînnoit, Apple poate avea nevoie de 24 până la 72 de ore ca să proceseze un dispozitiv nou. Primul build care îl include poate deci eșua: așteaptă, apoi reîncearcă.

### Limita de certificate atinsă

Apple refuză să creeze un certificat de distribuție nou. Adesea, certificate vechi stau uitate: create din Xcode pe alt Mac sau de alt serviciu de build. **Refolosește certificatul existent dacă ai fișierul lui .p12. Altfel, revocă-l pe cel care nu mai e folosit** în portalul Apple. O revocare nu afectează aplicațiile tale deja publicate, dar invalidează profilurile care îl conțineau.

### „Provisioning profile doesn't include signing certificate”

Mesajul ăsta din Xcode înseamnă că profilul nu conține certificatul a cărui cheie privată e pe calculatorul tău. Cauza tipică: amesteci semnarea automată din Xcode cu credențialele EAS. **Alege o singură sursă de adevăr**: build-uri EAS cu credențiale gestionate sau credențiale locale, dar nu ambele.

### Notificări oprite după revocarea cheii

Dacă îți revoci cheia APNs, Expo avertizează că toate aplicațiile care o folosesc nu mai primesc notificări. Creează o cheie nouă și trimite-o cu `eas credentials`. Token-urile Expo Push ale utilizatorilor tăi nu se schimbă.

### Capabilitate adăugată, profil invalid

Activarea unui serviciu ca notificările push sau App Groups [face profilul invalid](https://developer.apple.com/help/account/provisioning-profiles/edit-download-or-delete-profiles): trebuie regenerat. Cu EAS, sincronizarea capabilităților se face la fiecare build. Dacă profilul e în continuare refuzat, `eas credentials` îți permite să generezi unul nou.

## Ce urmează după semnare

Un build semnat e doar o etapă. Fișa, capturile, confidențialitatea și trimiterea la review sunt adunate în [publicarea unei aplicații pe App Store](https://devoria.fr/ro/expertise/publicare-aplicatie-app-store). Dacă n-ai încă membership-ul, începe cu [contul de dezvoltator Apple](https://devoria.fr/ro/blog/cont-developer-apple-pret-gratuit-99-dolari). Și ca să înțelegi de ce le recomand Expo începătorilor, citește [React Native și Expo pentru o aplicație mobilă](https://devoria.fr/ro/expertise/aplicatie-mobila-react-native-expo).

## Dacă îți pregătești prima publicare

Înainte de primul upload, fă [diagnosticul gratuit](https://devoria.fr/ro/diagnostic): îți spune ce blochează cu adevărat în proiectul tău și îți trimite checklist-ul meu anti-respingere Apple.

Ca să construiești aplicația, să conectezi abonamentele și s-o publici fără să te lupți cu semnarea, [iOS & Android Kit](https://devoria.fr/ro/kits/ios) te duce prin parcursul în patru etape, cu codul de pornire al aplicațiilor mele, în ritmul tău.

## Întrebări frecvente

### Ce este un provisioning profile?

E fișierul care îi permite aplicației tale să ruleze sau să fie trimisă la Apple. Leagă un identificator de aplicație, un certificat și, în funcție de tip, o listă de dispozitive. Un profil App Store nu conține niciun dispozitiv, un profil ad hoc listează câteva.

### Certificatul de dezvoltator iOS e gratuit?

Nu are un preț separat: certificatul de distribuție e inclus în Apple Developer Program, la 99 $ pe an. Cu un cont Apple gratuit, Xcode te lasă să testezi pe cel mult 3 dispozitive, dar profilurile expiră după 7 zile și publicarea e imposibilă.

### Cât timp e valabil un certificat de distribuție Apple?

De regulă un an de la creare, conform Apple. Profilurile de provizionare durează și ele cel mult 12 luni. Cheia pentru notificări push, în schimb, nu expiră niciodată.

### Ce se întâmplă dacă îmi expiră certificatul de distribuție?

Nimic pentru aplicațiile tale deja pe App Store, cât timp membership-ul e valid. Doar că nu mai poți trimite build-uri noi semnate cu acel certificat. Cu EAS, un certificat nou se creează la următorul build sau cu `eas credentials`.

### Am nevoie de un Mac ca să creez un certificat iOS?

Nu, dacă folosești EAS. Te conectezi la contul Apple din linia de comandă, iar EAS generează certificatul și profilul, atât pe Windows, cât și pe Linux. Fără EAS, metoda clasică trece prin Xcode sau prin Keychain Access de pe un Mac.

### Câte dispozitive poate conține un profil ad hoc?

Contul tău poate înregistra până la 100 de iPhone-uri pe an de membership și tot atâtea pentru fiecare altă familie de dispozitive. Un dispozitiv dezactivat se numără în continuare. Ca să testezi cu mai mulți oameni, folosește TestFlight.


## Proiectul tău

[Review Kit](https://devoria.fr/ro/kits/app-review): Checklistul meu de review App Store, respingerile mele de la Apple rezolvate, checklistul pentru Google Play și trei skilluri Claude Code. 259 RON.

[iOS & Android Kit](https://devoria.fr/ro/kits/ios): Creează-ți aplicația de iPhone și Android cu Claude Code: codul de pornire al aplicațiilor mele, drumul până în store-uri și toate kiturile. 529 RON.

[Diagnostic: ce te desparte de aplicația ta de iPhone](https://devoria.fr/ro/diagnostic): 7 întrebări, 60 de secunde: afli ce te blochează de fapt să-ți publici aplicația de iPhone, traseul tău în 4 etape și kitul potrivit pentru tine.
