# Sertifikat push notification Apple: .p8 atau .p12 di Expo

> Untuk push notification, Apple menawarkan kunci .p8 tanpa kedaluwarsa untuk semua app, atau sertifikat .p12 tahunan. Di Expo, EAS yang mengelola kuncinya.

Halaman asli: [Sertifikat push notification Apple: .p8 atau .p12 di Expo](https://devoria.fr/id/blog/sertifikat-push-notification-apple-p8-p12-expo)
Penulis: [Mehdi Azizi](https://devoria.fr/id/mehdi-azizi)
Terbit: 2026-11-04
Revisi konten terakhir: 2026-11-04


Sertifikat push Apple mengizinkan sebuah server mengirim notifikasi ke app kamu lewat APNs, layanan notifikasi milik Apple. Bentuknya ada dua: sertifikat .p12, berlaku satu tahun dan terikat ke satu app saja, atau kunci .p8, yang tidak kedaluwarsa dan bisa dipakai semua app di akunmu. **Dengan Expo, kamu tidak butuh sertifikat: EAS menawarkan pembuatan kunci .p8 saat build pertama, dan layanan push Expo memakainya untukmu.**

Panduan tentang [sertifikat developer dan provisioning profile](https://devoria.fr/id/blog/sertifikat-developer-ios-provisioning-profile-expo) hanya membahas kunci push dalam beberapa baris. Di sini kita bahas tuntas: pilihan antara kedua format, environment sandbox dan production, perpanjangan, dan masalah yang membuat notifikasi mati di TestFlight.

Saya merilis app saya dengan Expo dan EAS. Solys dan TradaZen mendeklarasikan plugin `expo-notifications` di konfigurasinya: plugin inilah yang menyiapkan app untuk menerima notifikasi.

## Kenapa Apple meminta sertifikat atau kunci

Push notification berangkat dari server, entah server kamu atau milik Expo, yang menyerahkannya ke APNs, lalu APNs mengantarkannya ke iPhone. Jadi APNs harus memastikan server itu berhak mengirim ke app kamu. Apple menyediakan dua cara untuk membuktikannya.

- **Koneksi berbasis token, dengan kunci .p8.** [Menurut Apple](https://developer.apple.com/documentation/usernotifications/establishing-a-token-based-connection-to-apns), cara ini lebih cepat, bisa dipakai dari beberapa server, dan satu kunci bisa mencakup semua app di tim kamu atau sebagian. Server kamu memakai kunci ini untuk menandatangani token, yang harus dibuat ulang setidaknya setiap jam.
- **Koneksi berbasis sertifikat, dengan file .p12.** [Apple menjelaskan](https://developer.apple.com/documentation/usernotifications/establishing-a-certificate-based-connection-to-apns) bahwa sertifikat ini terikat ke satu app saja dan berlaku satu tahun. Banyak app, banyak sertifikat.

[Halaman Apple tentang masa berlaku](https://developer.apple.com/support/expiration/) mengingatkan: kunci penandatanganan token APNs tidak pernah kedaluwarsa.

## Tabel .p8 / .p12

| Kriteria          | Kunci .p8                  | Sertifikat .p12               |
| ----------------- | -------------------------- | ----------------------------- |
| Masa berlaku      | Tidak kedaluwarsa          | Satu tahun                    |
| Cakupan           | Semua app kamu             | Satu app saja                 |
| Environment       | Dipilih saat dibuat        | Sandbox dan production        |
| Perpanjangan      | Tidak ada, kecuali dicabut | Setiap tahun                  |
| Unduhan           | Hanya sekali               | Ekspor dari Mac               |
| Jumlah            | Dua per environment        | Satu per app                  |
| Pemakaian di Expo | Dibuat dan dikelola EAS    | Tidak ada di dokumentasi Expo |

Tiga catatan. File .p8 [hanya bisa diunduh sekali](https://developer.apple.com/help/account/keys/create-a-private-key): Apple tidak menyimpannya di akunmu. Sementara .p12 [diekspor dari Keychain di Mac](https://developer.apple.com/help/account/capabilities/communicate-with-apns-using-a-tls-certificate) yang membuat sertifikatnya. Dan batas dua kunci per environment berlaku untuk kunci tim. Untuk kunci yang dibatasi ke app tertentu, Apple mengizinkan sampai 200 per environment.

[Halaman Expo tentang kredensial](https://docs.expo.dev/app-signing/app-credentials/) hanya membahas kunci push, dan menyebut maksimal dua per akun, tanpa membedakan environment atau kunci per app. **Untuk app Expo, kunci .p8 adalah pilihan yang tepat.**

## Sandbox dan production: dua environment

APNs punya dua server: development, disebut juga sandbox, dan production. [Apple](https://developer.apple.com/documentation/usernotifications/sending-notification-requests-to-apns) memakai yang pertama untuk pengujian dan yang kedua untuk app yang sudah rilis. App tahu server mana yang dipakai lewat entitlement `aps-environment`. [Menurut Apple](https://developer.apple.com/documentation/bundleresources/entitlements/aps-environment), nilainya mengikuti profil signing: `development` dengan profil development, `production` dengan profil distribusi dan untuk TestFlight.

**Jadi build TestFlight berkomunikasi dengan production, persis seperti App Store.**

Di sisi Expo, ada dua detail. [Dokumentasi expo-notifications](https://docs.expo.dev/versions/latest/sdk/notifications/) menyebutkan bahwa entitlement selalu ditulis `development` di proyek, lalu diubah ke `production` di arsip build release. Lalu saat dibuat, token Expo dikaitkan ke environment app yang terdeteksi otomatis: kamu tidak perlu memilih apa pun saat mengirim.

Kalau kamu membuat kunci sendiri, Apple akan menanyakan environment dan cakupannya: seluruh tim atau app tertentu. Dokumentasi developernya sekarang menjelaskan kunci tim yang dibatasi ke sandbox atau production, sementara kunci lama yang berlaku di mana saja tetap diterima. Sedangkan [bantuan akun](https://developer.apple.com/help/account/capabilities/communicate-with-apns-using-authentication-tokens) masih menyatakan kunci berlaku untuk kedua environment. Apple saling bertentangan: pegang environment yang kamu pilih saat membuat kunci. **Kunci khusus sandbox tidak akan berfungsi untuk TestFlight maupun App Store.**

## Cara Expo mengelola kunci push

Menurut [panduan setup Expo](https://docs.expo.dev/push-notifications/push-notifications-setup/), yang diperbarui 28 Juli 2026, build development pertamamu akan menawarkan setup push notification dan pembuatan kunci APNs. Jawab ya untuk keduanya. Tanpa EAS Build, jalankan `eas credentials`. Kamu butuh akun Apple Developer berbayar.

Setelah itu:

- **EAS menyimpan kunci dan mengaitkannya ke app kamu.** Menurut Expo, satu kunci bisa dipakai untuk app sebanyak yang kamu mau, dan mengunggah kunci baru tidak mengubah token Expo Push pengguna kamu.
- **Server kamu tidak memanggil APNs.** Server mengirim ke layanan push Expo, yang meneruskannya ke APNs. [Expo memintamu membaca receipt](https://docs.expo.dev/push-notifications/sending-notifications/) sekitar 15 menit setelah pengiriman: di situlah error muncul.
- **Plugin memasang entitlement.** Deklarasikan `expo-notifications` di `plugins`:

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

Dua jebakan. [FAQ Expo](https://docs.expo.dev/push-notifications/faq/) menyatakan Expo Go tidak lagi mendukung push notification sejak SDK 53, sementara halaman expo-notifications hanya menyebut Android. Apa pun itu, Expo menyarankan build development: uji dengan itu. Lalu, menghapus kunci dengan `eas credentials` hanya menghapusnya dari server Expo, bukan dari akun Apple kamu. Untuk mengosongkan slot, cabut (revoke) kunci itu di portal Apple. Seperti semua rahasia, file .p8 tidak boleh berakhir di repo kamu: aturannya sama dengan [kunci API di app Expo](https://devoria.fr/id/blog/kunci-api-rahasia-aplikasi-expo).

## Perpanjangan: apa yang benar-benar kedaluwarsa

**Kunci .p8 tidak perlu diperpanjang.** Kunci hanya berhenti kalau kamu mencabutnya. Kalau kamu curiga kunci bocor, [Apple menyarankan](https://developer.apple.com/help/account/capabilities/communicate-with-apns-using-authentication-tokens) membuat kunci baru, beralih ke kunci itu, baru kemudian mencabut yang lama. Untuk mengganti kunci di Expo, FAQ-nya memberi langkahnya: `eas credentials`, iOS, profil build kamu, lalu hapus kunci push dan buat yang baru.

**Sertifikat .p12 kedaluwarsa setiap tahun.** Apple meminta kamu memperbaruinya sebelum jatuh tempo dan memantau tanggalnya di Keychain. Begitu kedaluwarsa atau dicabut, [kamu tidak bisa lagi mengirim notifikasi](https://developer.apple.com/help/account/certificates/certificates-overview) ke app kamu. Apple tidak menjelaskan proses perpanjangan tersendiri: kamu membuat sertifikat baru dari identifier app, memasangnya di server sebelum jatuh tempo, lalu menghapus yang lama. **Perpanjangan terbaik tetaplah beralih ke kunci.**

> Kamu mengelola iPhone dengan Intune atau tool manajemen perangkat lain? Itu sertifikat yang berbeda. Sertifikat push untuk manajemen perangkat dibuat di Apple Push Certificates Portal dan diperpanjang setiap tahun. [Apple menyarankan](https://support.apple.com/guide/deployment/dep2de55389a) mencatat akun Apple yang dipakai: akun itu dibutuhkan saat perpanjangan.

## Masalah umum dan cara memperbaikinya

### Jalan di development, tidak di TestFlight

1. **Kamu mengirim ke token yang salah.** Build TestFlight mendaftar di production dan mendapat token baru. Token dari build development tidak akan berfungsi: Apple membalas `BadDeviceToken` ketika [token tidak cocok dengan environment](https://developer.apple.com/documentation/usernotifications/handling-notification-responses-from-apns). Ambil token dari app TestFlight itu sendiri.
2. **App production tidak punya kredensial push.** Ini diagnosis dari FAQ Expo. Cek halaman kredensial proyek di expo.dev, atau `eas credentials`.
3. **Kunci kamu dibatasi ke sandbox.** Ganti dengan kunci yang berlaku di production.
4. **iPhone tidak mendapat token.** Kalau kamu memasang build TestFlight di atas build Xcode, Expo menyarankan untuk me-restart perangkat.

### "No valid aps-environment entitlement string found"

Menurut FAQ Expo, error ini menandakan tidak ada kunci push yang dikonfigurasi untuk proyek iOS kamu. Cek halaman kredensial, lalu jalankan build lagi: EAS akan menawarkan pembuatan kunci. Pastikan juga `expo-notifications` ada di `plugins`.

### ITMS-90078: Missing Push Notification Entitlement

Apple mengirim email ini setelah upload: app kamu tampaknya mendaftar ke APNs, tetapi signature-nya tidak berisi entitlement `aps-environment`. [Catatan Expo tentang SDK 51](https://github.com/expo/fyi/blob/main/apns-entitlement-sdk-51.md) menjelaskannya. Sejak SDK itu, entitlement hanya ditambahkan kalau `expo-notifications` terpasang. Peringatan ini berasal dari dua pemeriksaan Apple. Yang pertama membandingkan capability di identifier app dengan entitlement app. Yang kedua mendeteksi di binary sebuah method pendaftaran notifikasi, yang ada di kode Expo di semua app.

**Ini peringatan, bukan penolakan**, tegas Expo. Kalau kamu memakai notifikasi, tambahkan plugin dan build ulang: [EAS menyinkronkan capability](https://docs.expo.dev/build-reference/ios-capabilities/) identifier app di setiap build. Kalau tidak, hapus capability Push Notifications dari identifier kamu di portal Apple. Peringatannya bisa tetap muncul, tanpa dampak apa pun.

### InvalidCredentials atau semua app mendadak diam

`InvalidCredentials` di receipt berarti kredensial push kamu sudah tidak valid, sering kali karena kuncinya dicabut. Semua app yang memakainya berhenti menerima notifikasi bersamaan. Solusi dari Expo: `eas credentials`, lalu buat kunci baru. Kalau receipt menyebut `InvalidProviderToken`, Expo menyarankan build ulang sambil membuat ulang kunci push dan profilnya.

## Sebelum mengaktifkan notifikasi

Untuk menguji notifikasi di iPhone kamu sebelum rilis, ikuti [TestFlight untuk menguji app kamu](https://devoria.fr/id/blog/testflight-cara-tes-aplikasi-iphone). Kalau kamu mengirim notifikasi silent untuk membangunkan app, baca lagi [guideline 2.5.4 tentang mode background](https://devoria.fr/id/blog/guideline-2-5-4-mode-latar-belakang-ditolak-apple). Seluruh alurnya, tanpa Mac, ada di [merilis app iOS tanpa Mac](https://devoria.fr/id/blog/publish-aplikasi-ios-tanpa-mac-expo-eas), dan langkah-langkah rilisnya di halaman [merilis aplikasi di App Store](https://devoria.fr/id/expertise/publikasi-aplikasi-di-app-store).

Sebelum pengiriman pertamamu, coba [diagnostik gratis](https://devoria.fr/id/diagnostic): diagnostik ini memberi tahu apa yang menghambat proyekmu dan mengirimkan checklist anti-penolakan Apple milik saya. Untuk membangun app, memasang langganan, dan merilisnya, [iOS & Android Kit](https://devoria.fr/id/kits/ios) memandu alurnya dalam empat tahap dengan kode awal dari app-app saya, sesuai kecepatanmu.

## Pertanyaan umum

### Apakah sertifikat push Apple bisa kedaluwarsa?

Sertifikat .p12 kedaluwarsa setelah satu tahun, dan notifikasimu berhenti kalau tidak diganti. Kunci .p8 tidak pernah kedaluwarsa: kunci hanya berhenti kalau kamu mencabutnya. Inilah alasan utama untuk memilih kunci.

### Apakah perlu satu sertifikat push per app?

Dengan sertifikat .p12, ya: setiap sertifikat terikat ke satu app. Kunci .p8 bisa dipakai semua app di akunmu. Jadi di Expo, satu kunci bisa mencakup seluruh katalog app kamu.

### Bagaimana cara memperpanjang sertifikat push Apple?

Buat sertifikat baru dari identifier app kamu, dengan certificate signing request baru, pasang di server, lalu hapus yang lama. Lakukan sebelum jatuh tempo. Cara paling mudah tetaplah beralih ke kunci .p8, yang tidak perlu diperpanjang.

### File .p8 saya hilang, apa yang harus dilakukan?

Apple hanya mengizinkan unduhan sekali. Kalau kuncinya dibuat oleh EAS, Expo menyimpannya dan notifikasimu tetap berjalan. Kalau tidak, buat kunci baru, tambahkan dengan `eas credentials`, lalu cabut yang lama di portal Apple. Token Expo Push pengguna kamu tidak berubah.

### Apakah perlu build ulang setelah mengganti kunci push?

Biasanya tidak. Kunci dipakai oleh server pengirim, bukan oleh app yang terpasang, dan Expo menyatakan kunci baru tidak mengubah token. Pengecualian: kalau receipt melaporkan `InvalidProviderToken`, Expo menyarankan build ulang dengan kunci baru dan profil baru.


## Proyekmu

[Review Kit](https://devoria.fr/id/kits/app-review): Checklist review App Store saya, penolakan Apple yang sudah saya perbaiki, checklist Google Play, dan tiga skill Claude Code. Rp 999.000.

[iOS & Android Kit](https://devoria.fr/id/kits/ios): Bikin app iPhone dan Android kamu dengan Claude Code: kode awal dari app-app saya, langkah demi langkah sampai ke store, dan semua kit. Rp 1.999.000.

[Diagnosis: apa yang memisahkanmu dari app iPhone-mu](https://devoria.fr/id/diagnostic): 7 pertanyaan, 60 detik: kamu tahu apa yang benar-benar menghambatmu merilis app iPhone, jalurmu dalam 4 tahap, dan kit yang cocok untukmu.
