# Apple push notification certificate: .p8 หรือ .p12 กับ Expo

> สำหรับ push notification นั้น Apple มีให้เลือกระหว่างคีย์ .p8 ที่ไม่มีวันหมดอายุและใช้ได้กับทุกแอป หรือใบรับรอง .p12 ที่ต้องต่ออายุทุกปี ถ้าใช้ Expo ทาง EAS จะจัดการคีย์ให้

หน้าต้นฉบับ: [Apple push notification certificate: .p8 หรือ .p12 กับ Expo](https://devoria.fr/th/blog/apple-push-notification-certificate-p8-p12-expo)
ผู้เขียน: [Mehdi Azizi](https://devoria.fr/th/mehdi-azizi)
เผยแพร่: 2026-11-04
แก้ไขเนื้อหาล่าสุด: 2026-11-04


ใบรับรอง push ของ Apple คือสิ่งที่อนุญาตให้เซิร์ฟเวอร์ส่งการแจ้งเตือนไปยังแอปของคุณผ่าน APNs ซึ่งเป็นบริการแจ้งเตือนของ Apple มีอยู่สองรูปแบบ แบบแรกคือใบรับรอง .p12 ที่ใช้ได้หนึ่งปีและผูกกับแอปเดียว แบบที่สองคือคีย์ .p8 ที่ไม่มีวันหมดอายุและใช้ได้กับทุกแอปในบัญชีของคุณ **ถ้าใช้ Expo คุณไม่ต้องใช้ใบรับรองเลย: ตอน build ครั้งแรก EAS จะเสนอให้สร้างคีย์ .p8 แล้วบริการ push ของ Expo ก็จะใช้คีย์นั้นแทนคุณ**

คู่มือเรื่อง[ใบรับรองนักพัฒนาและ provisioning profile](https://devoria.fr/th/blog/ios-certificate-provisioning-profile-expo) พูดถึงคีย์ push ไว้แค่ไม่กี่บรรทัด บทความนี้จะลงลึกให้ครบ ทั้งการเลือกระหว่างสองรูปแบบ สภาพแวดล้อม sandbox กับ production การต่ออายุ และปัญหาที่ทำให้การแจ้งเตือนใน TestFlight ไม่ทำงาน

ผมเผยแพร่แอปด้วย Expo และ EAS ทั้ง Solys และ TradaZen ประกาศปลั๊กอิน `expo-notifications` ไว้ในการตั้งค่า ปลั๊กอินตัวนี้แหละที่เตรียมแอปให้พร้อมรับการแจ้งเตือน

## ทำไม Apple ถึงขอใบรับรองหรือคีย์

push notification ถูกส่งออกจากเซิร์ฟเวอร์ (ของคุณเองหรือของ Expo) ซึ่งส่งต่อให้ APNs แล้ว APNs ก็ส่งไปถึง iPhone ดังนั้น APNs ต้องตรวจสอบว่าเซิร์ฟเวอร์นั้นมีสิทธิ์ส่งข้อความถึงแอปของคุณ Apple มีวิธีพิสูจน์ให้สองแบบ

- **การเชื่อมต่อแบบโทเคน ด้วยคีย์ .p8** [ตามที่ Apple บอก](https://developer.apple.com/documentation/usernotifications/establishing-a-token-based-connection-to-apns) วิธีนี้เร็วกว่า ใช้จากหลายเซิร์ฟเวอร์ได้ และคีย์เดียวครอบคลุมทุกแอปในทีมของคุณหรือบางส่วนก็ได้ เซิร์ฟเวอร์ของคุณจะใช้คีย์นี้เซ็นโทเคน ซึ่งต้องสร้างใหม่อย่างน้อยทุกชั่วโมง
- **การเชื่อมต่อแบบใบรับรอง ด้วยไฟล์ .p12** [Apple ระบุว่า](https://developer.apple.com/documentation/usernotifications/establishing-a-certificate-based-connection-to-apns) ใบรับรองนี้ผูกกับแอปเดียวและใช้ได้หนึ่งปี มีหลายแอปก็ต้องมีหลายใบ

[หน้าของ Apple เรื่องการหมดอายุ](https://developer.apple.com/support/expiration/) ย้ำไว้ว่า คีย์สำหรับเซ็นโทเคน APNs ไม่มีวันหมดอายุ

## ตาราง .p8 / .p12

| เกณฑ์          | คีย์ .p8                 | ใบรับรอง .p12          |
| -------------- | ------------------------ | ---------------------- |
| อายุ           | ไม่หมดอายุ               | หนึ่งปี                |
| ขอบเขต         | ทุกแอปของคุณ             | แอปเดียว               |
| สภาพแวดล้อม    | เลือกตอนสร้าง            | Sandbox และ production |
| การต่ออายุ     | ไม่ต้อง ยกเว้นถูกเพิกถอน | ทุกปี                  |
| การดาวน์โหลด   | ได้ครั้งเดียว            | export จาก Mac         |
| จำนวน          | สองอันต่อสภาพแวดล้อม     | หนึ่งใบต่อแอป          |
| การใช้กับ Expo | EAS สร้างและจัดการให้    | ไม่มีในเอกสาร Expo     |

ขอขยายความสามข้อ ไฟล์ .p8 [ดาวน์โหลดได้แค่ครั้งเดียว](https://developer.apple.com/help/account/keys/create-a-private-key) เพราะ Apple ไม่เก็บไว้ในบัญชีของคุณ ส่วน .p12 [export ได้จาก Keychain ของ Mac](https://developer.apple.com/help/account/capabilities/communicate-with-apns-using-a-tls-certificate) เครื่องที่สร้างใบรับรองนั้น และขีดจำกัดสองคีย์ต่อสภาพแวดล้อมใช้กับคีย์ระดับทีม สำหรับคีย์ที่จำกัดเฉพาะบางแอป Apple อนุญาตได้ถึง 200 อันต่อสภาพแวดล้อม

[หน้าของ Expo เรื่อง credentials](https://docs.expo.dev/app-signing/app-credentials/) พูดถึงแค่คีย์ push และระบุว่าสูงสุดสองอันต่อบัญชี โดยไม่แยกสภาพแวดล้อมหรือคีย์รายแอป **สำหรับแอป Expo คีย์ .p8 คือตัวเลือกที่ถูกต้อง**

## Sandbox และ production: สองสภาพแวดล้อม

APNs มีเซิร์ฟเวอร์สองชุด คือ development (หรือเรียกว่า sandbox) และ production [Apple](https://developer.apple.com/documentation/usernotifications/sending-notification-requests-to-apns) กำหนดให้ชุดแรกใช้สำหรับทดสอบ และชุดที่สองสำหรับแอปที่เผยแพร่แล้ว แอปรู้ว่าต้องใช้ชุดไหนจาก entitlement `aps-environment` [ตามที่ Apple บอก](https://developer.apple.com/documentation/bundleresources/entitlements/aps-environment) ค่าของมันจะตามโปรไฟล์ที่ใช้เซ็น คือ `development` เมื่อใช้โปรไฟล์ development และ `production` เมื่อใช้โปรไฟล์ distribution รวมถึง TestFlight

**ดังนั้น build ของ TestFlight จะคุยกับ production เหมือนกับ App Store ทุกอย่าง**

ฝั่ง Expo มีรายละเอียดสองข้อ [เอกสารของ expo-notifications](https://docs.expo.dev/versions/latest/sdk/notifications/) ระบุว่า entitlement จะถูกเขียนเป็น `development` ในโปรเจกต์เสมอ แล้วถูกเปลี่ยนเป็น `production` ใน archive ของ build แบบ release และตอนสร้าง โทเคนของ Expo จะผูกกับสภาพแวดล้อมของแอปซึ่งตรวจจับให้อัตโนมัติ คุณไม่ต้องเลือกอะไรตอนส่ง

ถ้าคุณสร้างคีย์เอง Apple จะถามสภาพแวดล้อมและขอบเขตของคีย์ ว่าใช้กับทั้งทีมหรือเฉพาะบางแอป เอกสารสำหรับนักพัฒนาของ Apple ตอนนี้อธิบายถึงคีย์ระดับทีมที่จำกัดเฉพาะ sandbox หรือ production โดยคีย์แบบเก่าที่ใช้ได้ทุกที่ยังรองรับอยู่ แต่[หน้าช่วยเหลือของบัญชี](https://developer.apple.com/help/account/capabilities/communicate-with-apns-using-authentication-tokens) ยังบอกว่าคีย์ใช้ได้ทั้งสองสภาพแวดล้อม Apple พูดขัดกันเอง ให้ยึดสภาพแวดล้อมที่คุณเลือกตอนสร้างไว้ **คีย์ที่จำกัดเฉพาะ sandbox จะใช้กับ TestFlight หรือ App Store ไม่ได้**

## Expo จัดการคีย์ push อย่างไร

ตาม[คู่มือการตั้งค่าของ Expo](https://docs.expo.dev/push-notifications/push-notifications-setup/) ที่อัปเดตเมื่อวันที่ 28 กรกฎาคม 2026 build แบบ development ครั้งแรกจะเสนอให้คุณตั้งค่า push notification และสร้างคีย์ APNs ให้ตอบตกลงทั้งสองข้อ ถ้าไม่ได้ใช้ EAS Build ให้รัน `eas credentials` คุณต้องมีบัญชี Apple Developer แบบเสียเงิน

จากนั้น:

- **EAS เก็บคีย์และผูกกับแอปของคุณ** ตามที่ Expo บอก คีย์เดียวใช้กับแอปได้ไม่จำกัด และการอัปโหลดคีย์ใหม่จะไม่เปลี่ยนโทเคน Expo Push ของผู้ใช้
- **เซิร์ฟเวอร์ของคุณไม่ได้เรียก APNs เอง** แต่ส่งไปที่บริการ push ของ Expo ซึ่งส่งต่อให้ APNs [Expo แนะนำให้อ่าน receipt](https://docs.expo.dev/push-notifications/sending-notifications/) ประมาณ 15 นาทีหลังส่ง เพราะข้อผิดพลาดจะแสดงที่นั่น
- **ปลั๊กอินจะใส่ entitlement ให้** ประกาศ `expo-notifications` ใน `plugins`:

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

มีกับดักสองข้อ [FAQ ของ Expo](https://docs.expo.dev/push-notifications/faq/) บอกว่า Expo Go ไม่รองรับ push notification อีกต่อไปตั้งแต่ SDK 53 ขณะที่หน้าของ expo-notifications พูดถึงแค่ Android ไม่ว่ากรณีไหน Expo ก็แนะนำให้ใช้ build แบบ development ให้ทดสอบด้วยตัวนั้น และการลบคีย์ด้วย `eas credentials` จะลบออกจากเซิร์ฟเวอร์ของ Expo เท่านั้น ไม่ได้ลบจากบัญชี Apple ของคุณ ถ้าอยากคืนโควตา ให้เพิกถอนคีย์ในพอร์ทัลของ Apple และเหมือนความลับทุกอย่าง ไฟล์ .p8 ต้องไม่หลุดเข้าไปใน repository ของคุณเด็ดขาด ใช้กฎเดียวกับ[คีย์ API ของแอป Expo](https://devoria.fr/th/blog/secret-api-key-expo-app)

## การต่ออายุ: อะไรที่หมดอายุจริง ๆ

**คีย์ .p8 ไม่ต้องต่ออายุอะไรเลย** มันจะหยุดทำงานก็ต่อเมื่อคุณเพิกถอนเท่านั้น ถ้าคิดว่าคีย์รั่วไหล [Apple แนะนำ](https://developer.apple.com/help/account/capabilities/communicate-with-apns-using-authentication-tokens) ให้สร้างคีย์ใหม่ ย้ายไปใช้คีย์ใหม่ก่อน แล้วค่อยเพิกถอนคีย์เก่า ถ้าจะเปลี่ยนคีย์กับ Expo ทาง FAQ บอกขั้นตอนไว้ว่า `eas credentials` เลือก iOS เลือกโปรไฟล์ build ของคุณ แล้วลบคีย์ push และสร้างใหม่

**ใบรับรอง .p12 หมดอายุทุกปี** Apple ให้อัปเดตก่อนครบกำหนดและคอยดูวันหมดอายุใน Keychain เมื่อหมดอายุหรือถูกเพิกถอน [คุณจะส่งการแจ้งเตือนไม่ได้อีก](https://developer.apple.com/help/account/certificates/certificates-overview) Apple ไม่ได้อธิบายขั้นตอนต่ออายุแยกไว้ คุณต้องสร้างใบรับรองใหม่จาก identifier ของแอป ติดตั้งบนเซิร์ฟเวอร์ก่อนครบกำหนด แล้วค่อยถอดใบเก่าออก **วิธีต่ออายุที่ดีที่สุดคือเปลี่ยนไปใช้คีย์**

> คุณจัดการ iPhone ด้วย Intune หรือเครื่องมือจัดการอุปกรณ์อื่นอยู่หรือเปล่า? นั่นไม่ใช่ใบรับรองตัวเดียวกัน ใบรับรอง push สำหรับจัดการอุปกรณ์สร้างบน Apple Push Certificates Portal และต้องต่ออายุทุกปี [Apple แนะนำ](https://support.apple.com/guide/deployment/dep2de55389a) ให้จดบัญชี Apple ที่ใช้ไว้ เพราะต้องใช้ตอนต่ออายุ

## ปัญหาที่พบบ่อยและวิธีแก้

### ใช้ได้ตอน development แต่ไม่ได้ใน TestFlight

1. **คุณส่งไปที่โทเคนผิดตัว** build ของ TestFlight ลงทะเบียนกับ production และได้โทเคนใหม่ โทเคนจาก build แบบ development ใช้ไม่ได้ Apple จะตอบกลับ `BadDeviceToken` เมื่อ[โทเคนไม่ตรงกับสภาพแวดล้อม](https://developer.apple.com/documentation/usernotifications/handling-notification-responses-from-apns) ให้ดึงโทเคนจากแอป TestFlight ตัวนั้นเอง
2. **แอป production ไม่มี credentials สำหรับ push** นี่คือการวินิจฉัยจาก FAQ ของ Expo ให้ตรวจหน้า credentials ของโปรเจกต์บน expo.dev หรือใช้ `eas credentials`
3. **คีย์ของคุณจำกัดเฉพาะ sandbox** ให้เปลี่ยนเป็นคีย์ที่ใช้กับ production ได้
4. **iPhone ไม่ได้รับโทเคน** ถ้าคุณติดตั้ง build ของ TestFlight ทับ build จาก Xcode ทาง Expo แนะนำให้รีสตาร์ทเครื่อง

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

ตาม FAQ ของ Expo ข้อผิดพลาดนี้หมายความว่ายังไม่มีการตั้งค่าคีย์ push ให้โปรเจกต์ iOS ของคุณ ตรวจหน้า credentials แล้ว build ใหม่ EAS จะเสนอให้สร้างคีย์ และตรวจด้วยว่ามี `expo-notifications` อยู่ใน `plugins` แล้ว

### ITMS-90078: Missing Push Notification Entitlement

Apple ส่งอีเมลนี้มาหลังจากคุณส่งแอป แอปของคุณดูเหมือนลงทะเบียนกับ APNs แต่ลายเซ็นไม่มี entitlement `aps-environment` [บันทึกของ Expo เรื่อง SDK 51](https://github.com/expo/fyi/blob/main/apns-entitlement-sdk-51.md) อธิบายไว้ ตั้งแต่ SDK นี้ entitlement จะถูกเพิ่มเฉพาะเมื่อติดตั้ง `expo-notifications` คำเตือนนี้มาจากการตรวจสองอย่างของ Apple อย่างแรกเทียบ capability ของ identifier แอปกับ entitlement ของแอป อย่างที่สองตรวจหาเมธอดลงทะเบียนการแจ้งเตือนในไบนารี ซึ่งโค้ดของ Expo มีอยู่ในทุกแอป

**นี่เป็นแค่คำเตือน ไม่ใช่การปฏิเสธ** ตามที่ Expo ระบุ ถ้าคุณใช้การแจ้งเตือน ให้เพิ่มปลั๊กอินแล้ว build ใหม่ [EAS จะซิงก์ capability](https://docs.expo.dev/build-reference/ios-capabilities/) ของ identifier แอปทุกครั้งที่ build ถ้าไม่ได้ใช้ ให้ถอด capability Push Notifications ออกจาก identifier ในพอร์ทัลของ Apple คำเตือนอาจยังขึ้นอยู่ แต่ไม่มีผลอะไร

### InvalidCredentials หรือทุกแอปเงียบพร้อมกัน

`InvalidCredentials` ใน receipt หมายความว่า credentials สำหรับ push ของคุณใช้ไม่ได้แล้ว ส่วนใหญ่เป็นเพราะคีย์ถูกเพิกถอน ทุกแอปที่ใช้คีย์นั้นจะเงียบพร้อมกัน วิธีแก้ของ Expo คือ `eas credentials` แล้วสร้างคีย์ใหม่ ถ้า receipt แจ้ง `InvalidProviderToken` ทาง Expo แนะนำให้ build ใหม่พร้อมสร้างคีย์ push และโปรไฟล์ใหม่

## ก่อนเปิดใช้การแจ้งเตือน

ถ้าอยากทดสอบการแจ้งเตือนบน iPhone ก่อนเปิดตัว ให้ทำตาม[การใช้ TestFlight ทดสอบแอป](https://devoria.fr/th/blog/testflight-test-iphone-app-before-app-store) ถ้าคุณส่งการแจ้งเตือนแบบเงียบเพื่อปลุกแอป ให้อ่าน[guideline 2.5.4 เรื่องโหมดเบื้องหลัง](https://devoria.fr/th/blog/guideline-2-5-4-background-mode-rejected) อีกครั้ง ขั้นตอนทั้งหมดแบบไม่ต้องใช้ Mac อยู่ใน[เผยแพร่แอป iOS โดยไม่ต้องมี Mac](https://devoria.fr/th/blog/publish-ios-app-without-mac-expo-eas) และขั้นตอนการเปิดตัวอยู่ในหน้า[เผยแพร่แอปบน App Store](https://devoria.fr/th/expertise/publish-app-on-app-store)

ก่อนส่งแอปครั้งแรก ลองทำ[การวินิจฉัยฟรี](https://devoria.fr/th/diagnostic) ดูครับ มันจะบอกว่าอะไรติดขัดในโปรเจกต์ของคุณ และส่งเช็กลิสต์กันโดน Apple ปฏิเสธของผมให้ ถ้าจะสร้างแอป เชื่อมระบบ subscription และเผยแพร่ [iOS & Android Kit](https://devoria.fr/th/kits/ios) จะพาคุณไปทีละขั้นในสี่ขั้นตอน พร้อมโค้ดเริ่มต้นจากแอปของผม ตามจังหวะของคุณเอง

## คำถามที่พบบ่อย

### ใบรับรอง push ของ Apple หมดอายุไหม?

ใบรับรอง .p12 หมดอายุหลังหนึ่งปี และการแจ้งเตือนจะหยุดถ้าไม่เปลี่ยนใบใหม่ ส่วนคีย์ .p8 ไม่มีวันหมดอายุ จะหยุดก็ต่อเมื่อคุณเพิกถอนเท่านั้น นี่คือเหตุผลหลักที่ควรเลือกคีย์

### ต้องมีใบรับรอง push หนึ่งใบต่อแอปไหม?

ถ้าใช้ใบรับรอง .p12 ใช่ เพราะแต่ละใบผูกกับแอปเดียว คีย์ .p8 ใช้ได้กับทุกแอปในบัญชีของคุณ ดังนั้นกับ Expo คีย์เดียวก็ครอบคลุมแอปทั้งหมดของคุณได้

### ต่ออายุใบรับรอง push ของ Apple อย่างไร?

สร้างใบรับรองใหม่จาก identifier ของแอป พร้อมคำขอเซ็นใบรับรองใหม่ ติดตั้งบนเซิร์ฟเวอร์ แล้วถอดใบเก่าออก ทำก่อนครบกำหนด แต่ที่ง่ายที่สุดคือเปลี่ยนไปใช้คีย์ .p8 ซึ่งไม่ต้องต่ออายุ

### ทำไฟล์ .p8 หาย ต้องทำอย่างไร?

Apple ให้ดาวน์โหลดได้แค่ครั้งเดียว ถ้า EAS เป็นคนสร้างคีย์ Expo จะเก็บไว้ให้และการแจ้งเตือนยังทำงานต่อ ถ้าไม่ใช่ ให้สร้างคีย์ใหม่ เพิ่มด้วย `eas credentials` แล้วเพิกถอนคีย์เก่าในพอร์ทัลของ Apple โทเคน Expo Push ของผู้ใช้จะไม่เปลี่ยน

### ต้อง build ใหม่หลังเปลี่ยนคีย์ push ไหม?

โดยทั่วไปไม่ต้อง คีย์ใช้กับเซิร์ฟเวอร์ที่ส่ง ไม่ใช่กับแอปที่ติดตั้งอยู่ และ Expo ระบุว่าคีย์ใหม่ไม่ทำให้โทเคนเปลี่ยน ข้อยกเว้นคือถ้า receipt แจ้ง `InvalidProviderToken` ทาง Expo แนะนำให้ build ใหม่พร้อมคีย์ใหม่และโปรไฟล์ใหม่


## โปรเจกต์ของคุณ

[Review Kit](https://devoria.fr/th/kits/app-review): เช็กลิสต์รีวิว App Store ของผม การถูก Apple ปฏิเสธที่ผมแก้ไขแล้ว เช็กลิสต์ของ Google Play และ skill ของ Claude Code อีกสามตัว ฿1,849

[iOS & Android Kit](https://devoria.fr/th/kits/ios): สร้างแอป iPhone และ Android ของคุณด้วย Claude Code: โค้ดเริ่มต้นจากแอปของผม เส้นทางจนถึงสโตร์ และชุดคิททั้งหมด ฿3,699

[แบบประเมิน: อะไรกั้นคุณไว้จากแอป iPhone ของคุณ](https://devoria.fr/th/diagnostic): 7 คำถาม 60 วินาที: รู้ว่าอะไรที่ขวางคุณจากการเผยแพร่แอป iPhone จริง ๆ พร้อมเส้นทาง 4 ขั้นตอนและชุดคิทที่เหมาะกับคุณ
