# Certyfikat push Apple: .p8 czy .p12 w Expo

> Do powiadomień push Apple oferuje klucz .p8 bez daty ważności, dla wszystkich twoich aplikacji, albo roczny certyfikat .p12. W Expo kluczem zarządza EAS.

Oryginalna strona: [Certyfikat push Apple: .p8 czy .p12 w Expo](https://devoria.fr/pl/blog/certyfikat-push-apple-p8-p12-expo)
Autor: [Mehdi Azizi](https://devoria.fr/pl/mehdi-azizi)
Publikacja: 2026-11-04
Ostatnia aktualizacja treści: 2026-11-04


Certyfikat push Apple pozwala serwerowi wysyłać powiadomienia do twojej aplikacji przez APNs, usługę powiadomień Apple. Ma dwie formy: certyfikat .p12, ważny rok i powiązany z jedną aplikacją, albo klucz .p8, który nie wygasa i działa dla wszystkich aplikacji na twoim koncie. **W Expo certyfikat nie jest ci potrzebny: EAS proponuje utworzenie klucza .p8 przy pierwszym buildzie, a usługa push Expo używa go za ciebie.**

Poradnik o [certyfikacie deweloperskim i provisioning profile](https://devoria.fr/pl/blog/certyfikat-dewelopera-ios-provisioning-profile-expo) wspomina o kluczu push w kilku zdaniach. Tutaj idziemy do końca: wybór między dwoma formatami, środowiska sandbox i production, odnawianie oraz awarie, które wyłączają powiadomienia w TestFlight.

Publikuję swoje aplikacje z Expo i EAS. Solys i TradaZen deklarują w konfiguracji plugin `expo-notifications`: to on przygotowuje aplikację do odbierania powiadomień.

## Dlaczego Apple wymaga certyfikatu albo klucza

Powiadomienie push wychodzi z serwera, twojego albo Expo, który przekazuje je do APNs, a APNs dostarcza je na iPhone'a. APNs musi więc sprawdzić, czy ten serwer ma prawo pisać do twojej aplikacji. Apple daje dwa sposoby, żeby to udowodnić.

- **Połączenie tokenowe, z kluczem .p8.** [Według Apple](https://developer.apple.com/documentation/usernotifications/establishing-a-token-based-connection-to-apns) jest szybsze, działa z wielu serwerów, a jeden klucz obejmuje wszystkie aplikacje twojego zespołu albo ich część. Twój serwer podpisuje nim token, który trzeba odnawiać co najmniej raz na godzinę.
- **Połączenie certyfikatowe, z plikiem .p12.** [Apple zaznacza](https://developer.apple.com/documentation/usernotifications/establishing-a-certificate-based-connection-to-apns), że ten certyfikat jest powiązany z jedną aplikacją i ważny rok. Kilka aplikacji, kilka certyfikatów.

[Strona Apple o wygasaniu](https://developer.apple.com/support/expiration/) przypomina: klucz podpisujący tokeny APNs nigdy nie wygasa.

## Tabela .p8 / .p12

| Kryterium     | Klucz .p8                       | Certyfikat .p12          |
| ------------- | ------------------------------- | ------------------------ |
| Ważność       | Nie wygasa                      | Rok                      |
| Zakres        | Wszystkie twoje aplikacje       | Jedna aplikacja          |
| Środowisko    | Wybierane przy tworzeniu        | Sandbox i production     |
| Odnawianie    | Brak, chyba że go unieważnisz   | Co roku                  |
| Pobieranie    | Tylko raz                       | Eksport z Maca           |
| Liczba        | Dwa na środowisko               | Jeden na aplikację       |
| Użycie z Expo | Tworzony i zarządzany przez EAS | Brak w dokumentacji Expo |

Trzy uwagi. Plik .p8 [można pobrać tylko raz](https://developer.apple.com/help/account/keys/create-a-private-key): Apple nie przechowuje go na twoim koncie. Plik .p12 natomiast [eksportujesz z pęku kluczy Maca](https://developer.apple.com/help/account/capabilities/communicate-with-apns-using-a-tls-certificate), na którym utworzono certyfikat. A limit dwóch kluczy na środowisko dotyczy kluczy zespołowych. Dla kluczy ograniczonych do wybranych aplikacji Apple pozwala na maksymalnie 200 na środowisko.

[Strona Expo o danych uwierzytelniających](https://docs.expo.dev/app-signing/app-credentials/) mówi tylko o kluczu push i podaje maksymalnie dwa na konto, bez rozróżniania środowisk ani kluczy per aplikacja. **Dla aplikacji Expo klucz .p8 to właściwy wybór.**

## Sandbox i production: dwa środowiska

APNs ma dwa serwery: development, nazywany też sandbox, oraz production. [Apple](https://developer.apple.com/documentation/usernotifications/sending-notification-requests-to-apns) przeznacza pierwszy do testów, a drugi do opublikowanych aplikacji. Aplikacja wie, którego użyć, dzięki entitlementowi `aps-environment`. [Według Apple](https://developer.apple.com/documentation/bundleresources/entitlements/aps-environment) jego wartość zależy od profilu podpisu: `development` z profilem deweloperskim, `production` z profilem dystrybucyjnym i dla TestFlight.

**Build TestFlight rozmawia więc z production, dokładnie jak App Store.**

Po stronie Expo dwa szczegóły. [Dokumentacja expo-notifications](https://docs.expo.dev/versions/latest/sdk/notifications/) mówi, że entitlement jest zawsze zapisany w projekcie jako `development`, a w archiwum buildu release zmieniany na `production`. Poza tym token Expo jest przy tworzeniu przypisywany do środowiska aplikacji, wykrywanego automatycznie: przy wysyłce nic nie musisz wybierać.

Jeśli tworzysz klucz samodzielnie, Apple pyta o jego środowisko i zakres: cały zespół albo wybrane aplikacje. Dokumentacja dla deweloperów opisuje teraz klucze zespołowe ograniczone do sandbox albo production, przy czym starsze klucze działające wszędzie nadal są akceptowane. [Pomoc konta](https://developer.apple.com/help/account/capabilities/communicate-with-apns-using-authentication-tokens) twierdzi z kolei nadal, że klucz działa w obu środowiskach. Apple sobie przeczy: kieruj się środowiskiem wybranym przy tworzeniu. **Klucz zarezerwowany dla sandbox nie zadziała ani w TestFlight, ani w App Store.**

## Jak Expo zarządza kluczem push

Według [poradnika konfiguracji Expo](https://docs.expo.dev/push-notifications/push-notifications-setup/), zaktualizowanego 28 lipca 2026, pierwszy build deweloperski zaproponuje ci konfigurację powiadomień push i wygenerowanie klucza APNs. Odpowiedz „tak” na oba pytania. Bez EAS Build uruchom `eas credentials`. Potrzebujesz płatnego konta Apple Developer.

Dalej:

- **EAS przechowuje klucz i wiąże go z twoją aplikacją.** Według Expo jeden klucz obsłuży dowolną liczbę aplikacji, a wgranie nowego nie zmienia tokenów Expo Push twoich użytkowników.
- **Twój serwer nie łączy się z APNs.** Wysyła do usługi push Expo, która przekazuje dalej do APNs. [Expo prosi o odczytywanie potwierdzeń (receipts)](https://docs.expo.dev/push-notifications/sending-notifications/) mniej więcej 15 minut po wysyłce: tam pojawiają się błędy.
- **Plugin dodaje entitlement.** Zadeklaruj `expo-notifications` w `plugins`:

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

Dwie pułapki. [FAQ Expo](https://docs.expo.dev/push-notifications/faq/) mówi, że Expo Go nie obsługuje już powiadomień push od SDK 53, a strona expo-notifications dotyczy tylko Androida. W obu przypadkach Expo zaleca build deweloperski: testuj na nim. Ponadto usunięcie klucza przez `eas credentials` usuwa go z serwerów Expo, ale nie z twojego konta Apple. Żeby zwolnić miejsce, unieważnij go w portalu Apple. Jak każdy sekret, plik .p8 nigdy nie może trafić do twojego repozytorium: zasada jest ta sama co przy [kluczach API w aplikacji Expo](https://devoria.fr/pl/blog/klucz-api-aplikacja-expo-co-chronic).

## Odnawianie: co naprawdę wygasa

**Klucza .p8 nie trzeba odnawiać.** Przestaje działać tylko wtedy, gdy go unieważnisz. Jeśli podejrzewasz, że wyciekł, [Apple zaleca](https://developer.apple.com/help/account/capabilities/communicate-with-apns-using-authentication-tokens) utworzenie nowego klucza, przełączenie się na niego i dopiero potem unieważnienie starego. Żeby wymienić klucz w Expo, FAQ podaje procedurę: `eas credentials`, iOS, twój profil buildu, potem usunięcie klucza push i wygenerowanie nowego.

**Certyfikat .p12 wygasa co roku.** Apple każe go zaktualizować przed terminem i pilnować daty w pęku kluczy. Po wygaśnięciu albo unieważnieniu [nie możesz już wysyłać powiadomień](https://developer.apple.com/help/account/certificates/certificates-overview) do swojej aplikacji. Apple nie opisuje osobnego odnawiania: tworzysz nowy certyfikat z identyfikatora aplikacji, instalujesz go na serwerze przed terminem, a potem usuwasz stary. **Najlepszym odnowieniem jest przejście na klucz.**

> Zarządzasz iPhone'ami przez Intune albo inne narzędzie do zarządzania flotą? To nie ten sam certyfikat. Certyfikat push do zarządzania urządzeniami tworzy się w Apple Push Certificates Portal i odnawia co roku. [Apple zaleca](https://support.apple.com/guide/deployment/dep2de55389a) zapisanie, którego konta Apple użyłeś: będzie potrzebne przy odnawianiu.

## Typowe awarie i ich naprawa

### Działa w development, nie działa w TestFlight

1. **Wysyłasz na zły token.** Build TestFlight rejestruje się w production i dostaje nowy token. Token z buildu deweloperskiego nie zadziała: Apple odpowiada `BadDeviceToken`, gdy [token nie pasuje do środowiska](https://developer.apple.com/documentation/usernotifications/handling-notification-responses-from-apns). Pobierz token z samej aplikacji z TestFlight.
2. **Aplikacja produkcyjna nie ma danych uwierzytelniających push.** To diagnoza z FAQ Expo. Sprawdź stronę credentials projektu na expo.dev albo `eas credentials`.
3. **Twój klucz jest ograniczony do sandbox.** Zastąp go kluczem ważnym w production.
4. **iPhone nie dostaje tokena.** Jeśli zainstalowałeś build TestFlight na build z Xcode, Expo sugeruje ponowne uruchomienie urządzenia.

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

Według FAQ Expo ten błąd oznacza, że dla twojego projektu iOS nie skonfigurowano klucza push. Sprawdź stronę credentials, a potem uruchom build ponownie: EAS zaproponuje wtedy wygenerowanie klucza. Sprawdź też, czy `expo-notifications` na pewno jest w `plugins`.

### ITMS-90078: Missing Push Notification Entitlement

Apple wysyła tego maila po przesłaniu buildu: twoja aplikacja wygląda, jakby rejestrowała się w APNs, ale jej podpis nie zawiera entitlementu `aps-environment`. [Notatka Expo o SDK 51](https://github.com/expo/fyi/blob/main/apns-entitlement-sdk-51.md) to wyjaśnia. Od tego SDK entitlement jest dodawany tylko wtedy, gdy zainstalowano `expo-notifications`. Ostrzeżenie wynika z dwóch kontroli Apple. Pierwsza porównuje capabilities identyfikatora aplikacji z entitlementami aplikacji. Druga wykrywa w binarce metodę rejestracji powiadomień, którą kod Expo zawiera w każdej aplikacji.

**To ostrzeżenie, a nie odrzucenie**, zaznacza Expo. Jeśli używasz powiadomień, dodaj plugin i zrób nowy build: [EAS synchronizuje capabilities](https://docs.expo.dev/build-reference/ios-capabilities/) identyfikatora aplikacji przy każdym buildzie. Jeśli nie, usuń capability Push Notifications ze swojego identyfikatora w portalu Apple. Ostrzeżenie może się dalej pojawiać, bez żadnych konsekwencji.

### InvalidCredentials albo wszystkie aplikacje nagle milkną

`InvalidCredentials` w potwierdzeniu oznacza, że twoje dane uwierzytelniające push nie są już ważne, często dlatego, że klucz unieważniono. Wszystkie aplikacje, które go używały, milkną jednocześnie. Naprawa według Expo: `eas credentials`, a potem nowy klucz. Jeśli potwierdzenie wspomina `InvalidProviderToken`, Expo zaleca nowy build z ponownie wygenerowanym kluczem push i profilem.

## Zanim włączysz powiadomienia

Żeby przetestować powiadomienia na swoim iPhonie przed premierą, skorzystaj z poradnika [TestFlight do testowania aplikacji](https://devoria.fr/pl/blog/testflight-testowanie-aplikacji-iphone). Jeśli wysyłasz ciche powiadomienia, żeby wybudzać aplikację, przeczytaj jeszcze raz [o guideline 2.5.4 dotyczącej trybów działania w tle](https://devoria.fr/pl/blog/guideline-2-5-4-tryb-dzialania-w-tle-odrzucenie). Cały proces bez Maca znajdziesz w [publikowaniu aplikacji iOS bez Maca](https://devoria.fr/pl/blog/publikacja-aplikacji-ios-bez-maca-expo-eas), a kroki premiery na stronie [publikowanie aplikacji w App Store](https://devoria.fr/pl/expertise/publikacja-aplikacji-w-app-store).

Przed pierwszą wysyłką zrób [darmową diagnozę](https://devoria.fr/pl/diagnostic): powie ci, co blokuje twój projekt, i wyśle ci moją checklistę przeciw odrzuceniom przez Apple. Żeby zbudować aplikację, podłączyć subskrypcje i ją opublikować, [iOS & Android Kit](https://devoria.fr/pl/kits/ios) prowadzi cię przez cztery etapy z kodem startowym moich aplikacji, we własnym tempie.

## Najczęściej zadawane pytania

### Czy certyfikat push Apple wygasa?

Certyfikat .p12 wygasa po roku, a jeśli go nie wymienisz, twoje powiadomienia przestaną działać. Klucz .p8 nigdy nie wygasa: przestaje działać tylko wtedy, gdy go unieważnisz. To główny powód, żeby wybrać klucz.

### Czy potrzebny jest osobny certyfikat push dla każdej aplikacji?

Z certyfikatem .p12 tak: każdy certyfikat jest powiązany z jedną aplikacją. Klucz .p8 działa dla wszystkich aplikacji na twoim koncie. W Expo jeden klucz może więc obsłużyć cały twój katalog.

### Jak odnowić certyfikat push Apple?

Utwórz nowy certyfikat z identyfikatora aplikacji, z nowym żądaniem podpisania certyfikatu, zainstaluj go na serwerze, a potem usuń stary. Zrób to przed terminem. Najprościej jednak przejść na klucz .p8, którego nie trzeba odnawiać.

### Zgubiłem plik .p8, co zrobić?

Apple pozwala pobrać go tylko raz. Jeśli klucz utworzył EAS, Expo go przechowuje i twoje powiadomienia działają dalej. Jeśli nie, utwórz nowy klucz, dodaj go przez `eas credentials`, a potem unieważnij stary w portalu Apple. Tokeny Expo Push twoich użytkowników się nie zmieniają.

### Czy po zmianie klucza push trzeba zrobić nowy build?

Zwykle nie. Klucz służy serwerowi, który wysyła, a nie zainstalowanej aplikacji, a Expo podaje, że nowy klucz nie zmienia tokenów. Wyjątek: jeśli potwierdzenia zgłaszają `InvalidProviderToken`, Expo zaleca nowy build z nowym kluczem i nowym profilem.


## Twój projekt

[Review Kit](https://devoria.fr/pl/kits/app-review): Moja checklista do App Store Review, poprawione odrzucenia od Apple, checklista do Google Play i trzy skille Claude Code. 219 zł.

[iOS & Android Kit](https://devoria.fr/pl/kits/ios): Stwórz swoją aplikację na iPhone'a i Androida z Claude Code: kod startowy moich aplikacji, droga aż do sklepów i wszystkie kity. 439 zł.

[Diagnoza: co dzieli cię od twojej aplikacji na iPhone'a](https://devoria.fr/pl/diagnostic): 7 pytań, 60 sekund: wiesz, co naprawdę blokuje publikację twojej aplikacji na iPhone'a, masz plan w 4 krokach i kit dopasowany do ciebie.
