# Certificat push Apple: cheie .p8 sau .p12 cu Expo

> Pentru notificări push, Apple oferă o cheie .p8 fără expirare, pentru toate aplicațiile, sau un certificat .p12 anual. Cu Expo, EAS gestionează cheia.

Pagina originală: [Certificat push Apple: cheie .p8 sau .p12 cu Expo](https://devoria.fr/ro/blog/certificat-push-apple-cheie-p8-p12-expo)
Autor: [Mehdi Azizi](https://devoria.fr/ro/mehdi-azizi)
Publicare: 2026-11-04
Ultima revizuire a conținutului: 2026-11-04


Certificatul push de la Apple îi permite unui server să trimită notificări aplicației tale prin APNs, serviciul de notificări al Apple. Există în două forme: un certificat .p12, valabil un an și legat de o singură aplicație, sau o cheie .p8, care nu expiră și merge pentru toate aplicațiile din contul tău. **Cu Expo nu ai nevoie de certificat: EAS îți propune să creezi o cheie .p8 la primul build, iar serviciul push al Expo o folosește în locul tău.**

Ghidul despre [certificatul de dezvoltator și provisioning profile](https://devoria.fr/ro/blog/certificat-dezvoltator-ios-provisioning-profile-expo) pomenește cheia push în câteva rânduri. Aici mergem până la capăt: alegerea între cele două formate, mediile sandbox și production, reînnoirea și problemele care opresc notificările în TestFlight.

Îmi public aplicațiile cu Expo și EAS. Solys și TradaZen declară plugin-ul `expo-notifications` în configurație: el pregătește aplicația să primească notificări.

## De ce cere Apple un certificat sau o cheie

O notificare push pleacă de pe un server, al tău sau al Expo, care o predă către APNs, care o livrează pe iPhone. Deci APNs trebuie să verifice că serverul are dreptul să-i scrie aplicației tale. Apple propune două moduri de a dovedi asta.

- **Conexiunea pe bază de token, cu o cheie .p8.** [Potrivit Apple](https://developer.apple.com/documentation/usernotifications/establishing-a-token-based-connection-to-apns), e mai rapidă, poate fi folosită de pe mai multe servere, iar o singură cheie acoperă toate aplicațiile echipei tale sau o parte din ele. Serverul tău semnează cu ea un token, care trebuie refăcut cel puțin o dată pe oră.
- **Conexiunea pe bază de certificat, cu un fișier .p12.** [Apple precizează](https://developer.apple.com/documentation/usernotifications/establishing-a-certificate-based-connection-to-apns) că acest certificat e legat de o singură aplicație și e valabil un an. Mai multe aplicații, mai multe certificate.

[Pagina Apple despre expirări](https://developer.apple.com/support/expiration/) o spune clar: cheia de semnare a tokenurilor APNs nu expiră niciodată.

## Tabelul .p8 / .p12

| Criteriu         | Cheie .p8                   | Certificat .p12              |
| ---------------- | --------------------------- | ---------------------------- |
| Durată           | Fără expirare               | Un an                        |
| Acoperire        | Toate aplicațiile tale      | O singură aplicație          |
| Mediu            | Ales la creare              | Sandbox și production        |
| Reînnoire        | Niciuna, decât la revocare  | În fiecare an                |
| Descărcare       | O singură dată              | Export de pe Mac             |
| Număr            | Două per mediu              | Unul per aplicație           |
| Folosire cu Expo | Creată și gestionată de EAS | Absent din documentația Expo |

Trei precizări. Fișierul .p8 [se descarcă o singură dată](https://developer.apple.com/help/account/keys/create-a-private-key): Apple nu îl păstrează în contul tău. Fișierul .p12, în schimb, [se exportă din keychain-ul Mac-ului](https://developer.apple.com/help/account/capabilities/communicate-with-apns-using-a-tls-certificate) care a creat certificatul. Iar limita de două chei per mediu se aplică cheilor de echipă. Pentru cheile limitate la anumite aplicații, Apple permite până la 200 per mediu.

[Pagina Expo despre credențiale](https://docs.expo.dev/app-signing/app-credentials/) vorbește doar despre cheia push și numără maximum două per cont, fără să facă distincție între medii sau chei per aplicație. **Pentru o aplicație Expo, cheia .p8 e alegerea potrivită.**

## Sandbox și production: două medii

APNs are două servere: development, numit și sandbox, și production. [Apple](https://developer.apple.com/documentation/usernotifications/sending-notification-requests-to-apns) îl rezervă pe primul pentru teste și pe al doilea pentru aplicațiile publicate. Aplicația știe pe care să-l folosească datorită entitlement-ului `aps-environment`. [Potrivit Apple](https://developer.apple.com/documentation/bundleresources/entitlements/aps-environment), valoarea lui urmează profilul de semnare: `development` cu un profil de dezvoltare, `production` cu un profil de distribuție și pentru TestFlight.

**Deci un build TestFlight vorbește cu production, exact ca App Store.**

La Expo, două detalii. [Documentația expo-notifications](https://docs.expo.dev/versions/latest/sdk/notifications/) spune că entitlement-ul e mereu scris ca `development` în proiect, apoi trecut pe `production` în arhiva unui build de release. Iar la creare, tokenul Expo e legat de mediul aplicației, detectat automat: nu ai nimic de ales la trimitere.

Dacă creezi cheia singur, Apple îți cere mediul și acoperirea ei: toată echipa sau anumite aplicații. Documentația pentru dezvoltatori descrie acum chei de echipă limitate la sandbox sau la production, vechile chei valabile peste tot fiind în continuare acceptate. [Ajutorul pentru cont](https://developer.apple.com/help/account/capabilities/communicate-with-apns-using-authentication-tokens), în schimb, susține încă faptul că cheia merge pentru ambele medii. Apple se contrazice: ține minte mediul pe care îl alegi la creare. **O cheie rezervată pentru sandbox nu va merge nici pentru TestFlight, nici pentru App Store.**

## Cum gestionează Expo cheia push

Conform [ghidului de configurare Expo](https://docs.expo.dev/push-notifications/push-notifications-setup/), actualizat pe 28 iulie 2026, primul tău build de dezvoltare îți propune să configurezi notificările push și să generezi o cheie APNs. Răspunde da la ambele. Fără EAS Build, rulează `eas credentials`. Ai nevoie de un cont Apple Developer plătit.

Apoi:

- **EAS stochează cheia și o asociază aplicației tale.** Potrivit Expo, o cheie merge pentru câte aplicații vrei, iar dacă încarci una nouă, tokenurile Expo Push ale utilizatorilor tăi nu se schimbă.
- **Serverul tău nu apelează APNs.** Trimite către serviciul push al Expo, care transmite către APNs. [Expo îți cere să citești chitanțele](https://docs.expo.dev/push-notifications/sending-notifications/) la aproximativ 15 minute după trimitere: acolo apar erorile.
- **Plugin-ul adaugă entitlement-ul.** Declară `expo-notifications` în `plugins`:

```json
{
  "expo": {
    "plugins": ["expo-notifications"]
  }
}
```

Două capcane. [FAQ-ul Expo](https://docs.expo.dev/push-notifications/faq/) spune că Expo Go nu mai suportă notificările push începând cu SDK 53, în timp ce pagina expo-notifications se referă doar la Android. În ambele cazuri, Expo recomandă un build de dezvoltare: testează cu el. Iar dacă ștergi cheia cu `eas credentials`, o scoți de pe serverele Expo, nu din contul tău Apple. Ca să eliberezi un loc, revoc-o în portalul Apple. Ca orice secret, fișierul .p8 nu trebuie să ajungă niciodată în repository-ul tău: regula e aceeași ca pentru [cheile API ale unei aplicații Expo](https://devoria.fr/ro/blog/cheie-api-secreta-aplicatie-expo).

## Reînnoirea: ce expiră de fapt

**Cheia .p8 nu are nimic de reînnoit.** Se oprește doar dacă o revoci. Dacă bănuiești că a fost compromisă, [Apple recomandă](https://developer.apple.com/help/account/capabilities/communicate-with-apns-using-authentication-tokens) să creezi o cheie nouă, să treci pe ea și abia apoi să o revoci pe cea veche. Ca să înlocuiești cheia cu Expo, FAQ-ul dă pașii: `eas credentials`, iOS, profilul tău de build, apoi ștergerea cheii push și generarea uneia noi.

**Certificatul .p12 expiră în fiecare an.** Apple cere să-l actualizezi înainte de termen și să urmărești data în keychain. Odată expirat sau revocat, [nu mai poți trimite notificări](https://developer.apple.com/help/account/certificates/certificates-overview) aplicației tale. Apple nu descrie o reînnoire separată: creezi un certificat nou din identificatorul aplicației, îl instalezi pe server înainte de termen, apoi îl scoți pe cel vechi. **Cea mai bună reînnoire rămâne trecerea la cheie.**

> Administrezi iPhone-uri cu Intune sau alt instrument de gestionare a dispozitivelor? Nu e același certificat. Certificatul push pentru gestionarea dispozitivelor se creează pe Apple Push Certificates Portal și se reînnoiește anual. [Apple recomandă](https://support.apple.com/guide/deployment/dep2de55389a) să notezi contul Apple folosit: îți va trebui la reînnoire.

## Problemele tipice și cum le rezolvi

### Merge în development, nu în TestFlight

1. **Trimiți către tokenul greșit.** Build-ul TestFlight se înregistrează în production și primește un token nou. Un token din build-ul de dezvoltare nu merge: Apple răspunde `BadDeviceToken` când [tokenul nu corespunde mediului](https://developer.apple.com/documentation/usernotifications/handling-notification-responses-from-apns). Ia tokenul chiar din aplicația instalată prin TestFlight.
2. **Aplicația de production nu are credențiale push.** E diagnosticul din FAQ-ul Expo. Verifică pagina de credențiale a proiectului pe expo.dev sau `eas credentials`.
3. **Cheia ta e limitată la sandbox.** Înlocuiește-o cu o cheie valabilă în production.
4. **iPhone-ul nu primește token.** Dacă ai instalat build-ul TestFlight peste un build din Xcode, Expo sugerează să repornești dispozitivul.

### „No valid aps-environment entitlement string found”

Potrivit FAQ-ului Expo, eroarea asta semnalează că nicio cheie push nu e configurată pentru proiectul tău iOS. Verifică pagina de credențiale, apoi relansează un build: EAS îți propune atunci să generezi cheia. Verifică și că `expo-notifications` apare în `plugins`.

### ITMS-90078: Missing Push Notification Entitlement

Apple trimite acest e-mail după upload: aplicația ta pare să se înregistreze la APNs, dar semnătura ei nu conține entitlement-ul `aps-environment`. [Nota Expo despre SDK 51](https://github.com/expo/fyi/blob/main/apns-entitlement-sdk-51.md) explică asta. Începând cu acest SDK, entitlement-ul e adăugat doar dacă `expo-notifications` e instalat. Avertismentul vine din două verificări Apple. Prima compară capabilitățile identificatorului aplicației cu entitlement-urile aplicației. A doua caută în binar o metodă de înregistrare la notificări, pe care codul Expo o conține în toate aplicațiile.

**E un avertisment, nu o respingere**, precizează Expo. Dacă folosești notificări, adaugă plugin-ul și refă build-ul: [EAS sincronizează capabilitățile](https://docs.expo.dev/build-reference/ios-capabilities/) identificatorului aplicației la fiecare build. Altfel, scoate capabilitatea Push Notifications din identificator în portalul Apple. Avertismentul poate persista, fără consecințe.

### InvalidCredentials sau toate aplicațiile mute dintr-odată

`InvalidCredentials` într-o chitanță înseamnă că credențialele tale push nu mai sunt valide, adesea pentru că cheia a fost revocată. Toate aplicațiile care o foloseau tac în același timp. Soluția Expo: `eas credentials`, apoi o cheie nouă. Dacă chitanța menționează `InvalidProviderToken`, Expo recomandă să refaci build-ul regenerând cheia push și profilul.

## Înainte să activezi notificările

Ca să testezi notificările pe iPhone înainte de lansare, urmează [TestFlight pentru a-ți testa aplicația](https://devoria.fr/ro/blog/testflight-testare-aplicatie-iphone). Dacă trimiți notificări silențioase ca să trezești aplicația, recitește [guideline-ul 2.5.4 despre modurile de fundal](https://devoria.fr/ro/blog/guideline-2-5-4-mod-fundal-respins-apple). Tot lanțul, fără Mac, e în [publicarea unei aplicații iOS fără Mac](https://devoria.fr/ro/blog/publicare-aplicatie-ios-fara-mac-expo-eas), iar pașii lansării pe pagina [publicarea unei aplicații pe App Store](https://devoria.fr/ro/expertise/publicare-aplicatie-app-store).

Înainte de primul upload, fă [diagnosticul gratuit](https://devoria.fr/ro/diagnostic): îți spune ce blochează î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, [iOS & Android Kit](https://devoria.fr/ro/kits/ios) urmează parcursul în patru etape cu codul de pornire al aplicațiilor mele, în ritmul tău.

## Întrebări frecvente

### Expiră certificatul push Apple?

Certificatul .p12 expiră după un an, iar notificările se opresc dacă nu e înlocuit. Cheia .p8 nu expiră niciodată: se oprește doar dacă o revoci. Acesta e motivul principal să preferi cheia.

### Ai nevoie de un certificat push pentru fiecare aplicație?

Cu un certificat .p12, da: fiecare certificat e legat de o singură aplicație. O cheie .p8 merge pentru toate aplicațiile din contul tău. Deci cu Expo, o singură cheie îți poate acoperi tot catalogul.

### Cum reînnoiești un certificat push Apple?

Creează un certificat nou din identificatorul aplicației, cu o nouă cerere de semnare, instalează-l pe server, apoi scoate-l pe cel vechi. Fă asta înainte de termen. Cel mai simplu rămâne să treci la o cheie .p8, care nu se reînnoiește.

### Mi-am pierdut fișierul .p8, ce fac?

Apple îți permite să-l descarci o singură dată. Dacă EAS a creat cheia, Expo o păstrează și notificările continuă. Altfel, creează o cheie nouă, adaug-o cu `eas credentials`, apoi revoc-o pe cea veche în portalul Apple. Tokenurile Expo Push ale utilizatorilor tăi nu se schimbă.

### Trebuie refăcut build-ul după schimbarea cheii push?

În general, nu. Cheia servește serverului care trimite, nu aplicației instalate, iar Expo spune că o cheie nouă nu schimbă tokenurile. Excepție: dacă chitanțele semnalează `InvalidProviderToken`, Expo recomandă să refaci build-ul cu o cheie nouă și un profil nou.


## 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.
