Apple push notification certificate: .p8 หรือ .p12 กับ Expo
โดย Mehdi Azizi
เผยแพร่เมื่อ , 8 นาที
สำหรับ push notification นั้น Apple มีให้เลือกระหว่างคีย์ .p8 ที่ไม่มีวันหมดอายุและใช้ได้กับทุกแอป หรือใบรับรอง .p12 ที่ต้องต่ออายุทุกปี ถ้าใช้ Expo ทาง EAS จะจัดการคีย์ให้
ใบรับรอง push ของ Apple คือสิ่งที่อนุญาตให้เซิร์ฟเวอร์ส่งการแจ้งเตือนไปยังแอปของคุณผ่าน APNs ซึ่งเป็นบริการแจ้งเตือนของ Apple มีอยู่สองรูปแบบ แบบแรกคือใบรับรอง .p12 ที่ใช้ได้หนึ่งปีและผูกกับแอปเดียว แบบที่สองคือคีย์ .p8 ที่ไม่มีวันหมดอายุและใช้ได้กับทุกแอปในบัญชีของคุณ ถ้าใช้ Expo คุณไม่ต้องใช้ใบรับรองเลย: ตอน build ครั้งแรก EAS จะเสนอให้สร้างคีย์ .p8 แล้วบริการ push ของ Expo ก็จะใช้คีย์นั้นแทนคุณ
คู่มือเรื่องใบรับรองนักพัฒนาและ provisioning profile พูดถึงคีย์ push ไว้แค่ไม่กี่บรรทัด บทความนี้จะลงลึกให้ครบ ทั้งการเลือกระหว่างสองรูปแบบ สภาพแวดล้อม sandbox กับ production การต่ออายุ และปัญหาที่ทำให้การแจ้งเตือนใน TestFlight ไม่ทำงาน
ผมเผยแพร่แอปด้วย Expo และ EAS ทั้ง Solys และ TradaZen ประกาศปลั๊กอิน expo-notifications ไว้ในการตั้งค่า ปลั๊กอินตัวนี้แหละที่เตรียมแอปให้พร้อมรับการแจ้งเตือน
ทำไม Apple ถึงขอใบรับรองหรือคีย์
push notification ถูกส่งออกจากเซิร์ฟเวอร์ (ของคุณเองหรือของ Expo) ซึ่งส่งต่อให้ APNs แล้ว APNs ก็ส่งไปถึง iPhone ดังนั้น APNs ต้องตรวจสอบว่าเซิร์ฟเวอร์นั้นมีสิทธิ์ส่งข้อความถึงแอปของคุณ Apple มีวิธีพิสูจน์ให้สองแบบ
- การเชื่อมต่อแบบโทเคน ด้วยคีย์ .p8 ตามที่ Apple บอก วิธีนี้เร็วกว่า ใช้จากหลายเซิร์ฟเวอร์ได้ และคีย์เดียวครอบคลุมทุกแอปในทีมของคุณหรือบางส่วนก็ได้ เซิร์ฟเวอร์ของคุณจะใช้คีย์นี้เซ็นโทเคน ซึ่งต้องสร้างใหม่อย่างน้อยทุกชั่วโมง
- การเชื่อมต่อแบบใบรับรอง ด้วยไฟล์ .p12 Apple ระบุว่า ใบรับรองนี้ผูกกับแอปเดียวและใช้ได้หนึ่งปี มีหลายแอปก็ต้องมีหลายใบ
หน้าของ Apple เรื่องการหมดอายุ ย้ำไว้ว่า คีย์สำหรับเซ็นโทเคน APNs ไม่มีวันหมดอายุ
ตาราง .p8 / .p12
| เกณฑ์ | คีย์ .p8 | ใบรับรอง .p12 |
|---|---|---|
| อายุ | ไม่หมดอายุ | หนึ่งปี |
| ขอบเขต | ทุกแอปของคุณ | แอปเดียว |
| สภาพแวดล้อม | เลือกตอนสร้าง | Sandbox และ production |
| การต่ออายุ | ไม่ต้อง ยกเว้นถูกเพิกถอน | ทุกปี |
| การดาวน์โหลด | ได้ครั้งเดียว | export จาก Mac |
| จำนวน | สองอันต่อสภาพแวดล้อม | หนึ่งใบต่อแอป |
| การใช้กับ Expo | EAS สร้างและจัดการให้ | ไม่มีในเอกสาร Expo |
ขอขยายความสามข้อ ไฟล์ .p8 ดาวน์โหลดได้แค่ครั้งเดียว เพราะ Apple ไม่เก็บไว้ในบัญชีของคุณ ส่วน .p12 export ได้จาก Keychain ของ Mac เครื่องที่สร้างใบรับรองนั้น และขีดจำกัดสองคีย์ต่อสภาพแวดล้อมใช้กับคีย์ระดับทีม สำหรับคีย์ที่จำกัดเฉพาะบางแอป Apple อนุญาตได้ถึง 200 อันต่อสภาพแวดล้อม
หน้าของ Expo เรื่อง credentials พูดถึงแค่คีย์ push และระบุว่าสูงสุดสองอันต่อบัญชี โดยไม่แยกสภาพแวดล้อมหรือคีย์รายแอป สำหรับแอป Expo คีย์ .p8 คือตัวเลือกที่ถูกต้อง
Sandbox และ production: สองสภาพแวดล้อม
APNs มีเซิร์ฟเวอร์สองชุด คือ development (หรือเรียกว่า sandbox) และ production Apple กำหนดให้ชุดแรกใช้สำหรับทดสอบ และชุดที่สองสำหรับแอปที่เผยแพร่แล้ว แอปรู้ว่าต้องใช้ชุดไหนจาก entitlement aps-environment ตามที่ Apple บอก ค่าของมันจะตามโปรไฟล์ที่ใช้เซ็น คือ development เมื่อใช้โปรไฟล์ development และ production เมื่อใช้โปรไฟล์ distribution รวมถึง TestFlight
ดังนั้น build ของ TestFlight จะคุยกับ production เหมือนกับ App Store ทุกอย่าง
ฝั่ง Expo มีรายละเอียดสองข้อ เอกสารของ expo-notifications ระบุว่า entitlement จะถูกเขียนเป็น development ในโปรเจกต์เสมอ แล้วถูกเปลี่ยนเป็น production ใน archive ของ build แบบ release และตอนสร้าง โทเคนของ Expo จะผูกกับสภาพแวดล้อมของแอปซึ่งตรวจจับให้อัตโนมัติ คุณไม่ต้องเลือกอะไรตอนส่ง
ถ้าคุณสร้างคีย์เอง Apple จะถามสภาพแวดล้อมและขอบเขตของคีย์ ว่าใช้กับทั้งทีมหรือเฉพาะบางแอป เอกสารสำหรับนักพัฒนาของ Apple ตอนนี้อธิบายถึงคีย์ระดับทีมที่จำกัดเฉพาะ sandbox หรือ production โดยคีย์แบบเก่าที่ใช้ได้ทุกที่ยังรองรับอยู่ แต่หน้าช่วยเหลือของบัญชี ยังบอกว่าคีย์ใช้ได้ทั้งสองสภาพแวดล้อม Apple พูดขัดกันเอง ให้ยึดสภาพแวดล้อมที่คุณเลือกตอนสร้างไว้ คีย์ที่จำกัดเฉพาะ sandbox จะใช้กับ TestFlight หรือ App Store ไม่ได้
Expo จัดการคีย์ push อย่างไร
ตามคู่มือการตั้งค่าของ Expo ที่อัปเดตเมื่อวันที่ 28 กรกฎาคม 2026 build แบบ development ครั้งแรกจะเสนอให้คุณตั้งค่า push notification และสร้างคีย์ APNs ให้ตอบตกลงทั้งสองข้อ ถ้าไม่ได้ใช้ EAS Build ให้รัน eas credentials คุณต้องมีบัญชี Apple Developer แบบเสียเงิน
จากนั้น:
- EAS เก็บคีย์และผูกกับแอปของคุณ ตามที่ Expo บอก คีย์เดียวใช้กับแอปได้ไม่จำกัด และการอัปโหลดคีย์ใหม่จะไม่เปลี่ยนโทเคน Expo Push ของผู้ใช้
- เซิร์ฟเวอร์ของคุณไม่ได้เรียก APNs เอง แต่ส่งไปที่บริการ push ของ Expo ซึ่งส่งต่อให้ APNs Expo แนะนำให้อ่าน receipt ประมาณ 15 นาทีหลังส่ง เพราะข้อผิดพลาดจะแสดงที่นั่น
- ปลั๊กอินจะใส่ entitlement ให้ ประกาศ
expo-notificationsในplugins:
{
"expo": {
"plugins": ["expo-notifications"]
}
}
มีกับดักสองข้อ FAQ ของ Expo บอกว่า Expo Go ไม่รองรับ push notification อีกต่อไปตั้งแต่ SDK 53 ขณะที่หน้าของ expo-notifications พูดถึงแค่ Android ไม่ว่ากรณีไหน Expo ก็แนะนำให้ใช้ build แบบ development ให้ทดสอบด้วยตัวนั้น และการลบคีย์ด้วย eas credentials จะลบออกจากเซิร์ฟเวอร์ของ Expo เท่านั้น ไม่ได้ลบจากบัญชี Apple ของคุณ ถ้าอยากคืนโควตา ให้เพิกถอนคีย์ในพอร์ทัลของ Apple และเหมือนความลับทุกอย่าง ไฟล์ .p8 ต้องไม่หลุดเข้าไปใน repository ของคุณเด็ดขาด ใช้กฎเดียวกับคีย์ API ของแอป Expo
การต่ออายุ: อะไรที่หมดอายุจริง ๆ
คีย์ .p8 ไม่ต้องต่ออายุอะไรเลย มันจะหยุดทำงานก็ต่อเมื่อคุณเพิกถอนเท่านั้น ถ้าคิดว่าคีย์รั่วไหล Apple แนะนำ ให้สร้างคีย์ใหม่ ย้ายไปใช้คีย์ใหม่ก่อน แล้วค่อยเพิกถอนคีย์เก่า ถ้าจะเปลี่ยนคีย์กับ Expo ทาง FAQ บอกขั้นตอนไว้ว่า eas credentials เลือก iOS เลือกโปรไฟล์ build ของคุณ แล้วลบคีย์ push และสร้างใหม่
ใบรับรอง .p12 หมดอายุทุกปี Apple ให้อัปเดตก่อนครบกำหนดและคอยดูวันหมดอายุใน Keychain เมื่อหมดอายุหรือถูกเพิกถอน คุณจะส่งการแจ้งเตือนไม่ได้อีก Apple ไม่ได้อธิบายขั้นตอนต่ออายุแยกไว้ คุณต้องสร้างใบรับรองใหม่จาก identifier ของแอป ติดตั้งบนเซิร์ฟเวอร์ก่อนครบกำหนด แล้วค่อยถอดใบเก่าออก วิธีต่ออายุที่ดีที่สุดคือเปลี่ยนไปใช้คีย์
คุณจัดการ iPhone ด้วย Intune หรือเครื่องมือจัดการอุปกรณ์อื่นอยู่หรือเปล่า? นั่นไม่ใช่ใบรับรองตัวเดียวกัน ใบรับรอง push สำหรับจัดการอุปกรณ์สร้างบน Apple Push Certificates Portal และต้องต่ออายุทุกปี Apple แนะนำ ให้จดบัญชี Apple ที่ใช้ไว้ เพราะต้องใช้ตอนต่ออายุ
ปัญหาที่พบบ่อยและวิธีแก้
ใช้ได้ตอน development แต่ไม่ได้ใน TestFlight
- คุณส่งไปที่โทเคนผิดตัว build ของ TestFlight ลงทะเบียนกับ production และได้โทเคนใหม่ โทเคนจาก build แบบ development ใช้ไม่ได้ Apple จะตอบกลับ
BadDeviceTokenเมื่อโทเคนไม่ตรงกับสภาพแวดล้อม ให้ดึงโทเคนจากแอป TestFlight ตัวนั้นเอง - แอป production ไม่มี credentials สำหรับ push นี่คือการวินิจฉัยจาก FAQ ของ Expo ให้ตรวจหน้า credentials ของโปรเจกต์บน expo.dev หรือใช้
eas credentials - คีย์ของคุณจำกัดเฉพาะ sandbox ให้เปลี่ยนเป็นคีย์ที่ใช้กับ production ได้
- 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 อธิบายไว้ ตั้งแต่ SDK นี้ entitlement จะถูกเพิ่มเฉพาะเมื่อติดตั้ง expo-notifications คำเตือนนี้มาจากการตรวจสองอย่างของ Apple อย่างแรกเทียบ capability ของ identifier แอปกับ entitlement ของแอป อย่างที่สองตรวจหาเมธอดลงทะเบียนการแจ้งเตือนในไบนารี ซึ่งโค้ดของ Expo มีอยู่ในทุกแอป
นี่เป็นแค่คำเตือน ไม่ใช่การปฏิเสธ ตามที่ Expo ระบุ ถ้าคุณใช้การแจ้งเตือน ให้เพิ่มปลั๊กอินแล้ว build ใหม่ EAS จะซิงก์ capability ของ identifier แอปทุกครั้งที่ build ถ้าไม่ได้ใช้ ให้ถอด capability Push Notifications ออกจาก identifier ในพอร์ทัลของ Apple คำเตือนอาจยังขึ้นอยู่ แต่ไม่มีผลอะไร
InvalidCredentials หรือทุกแอปเงียบพร้อมกัน
InvalidCredentials ใน receipt หมายความว่า credentials สำหรับ push ของคุณใช้ไม่ได้แล้ว ส่วนใหญ่เป็นเพราะคีย์ถูกเพิกถอน ทุกแอปที่ใช้คีย์นั้นจะเงียบพร้อมกัน วิธีแก้ของ Expo คือ eas credentials แล้วสร้างคีย์ใหม่ ถ้า receipt แจ้ง InvalidProviderToken ทาง Expo แนะนำให้ build ใหม่พร้อมสร้างคีย์ push และโปรไฟล์ใหม่
ก่อนเปิดใช้การแจ้งเตือน
ถ้าอยากทดสอบการแจ้งเตือนบน iPhone ก่อนเปิดตัว ให้ทำตามการใช้ TestFlight ทดสอบแอป ถ้าคุณส่งการแจ้งเตือนแบบเงียบเพื่อปลุกแอป ให้อ่านguideline 2.5.4 เรื่องโหมดเบื้องหลัง อีกครั้ง ขั้นตอนทั้งหมดแบบไม่ต้องใช้ Mac อยู่ในเผยแพร่แอป iOS โดยไม่ต้องมี Mac และขั้นตอนการเปิดตัวอยู่ในหน้าเผยแพร่แอปบน App Store
ก่อนส่งแอปครั้งแรก ลองทำการวินิจฉัยฟรี ดูครับ มันจะบอกว่าอะไรติดขัดในโปรเจกต์ของคุณ และส่งเช็กลิสต์กันโดน Apple ปฏิเสธของผมให้ ถ้าจะสร้างแอป เชื่อมระบบ subscription และเผยแพร่ iOS & Android Kit จะพาคุณไปทีละขั้นในสี่ขั้นตอน พร้อมโค้ดเริ่มต้นจากแอปของผม ตามจังหวะของคุณเอง
คำถามที่พบบ่อย
ใบรับรอง 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 ใหม่พร้อมคีย์ใหม่และโปรไฟล์ใหม่

