# ใบรับรองนักพัฒนา iOS และ Provisioning Profile กับ Expo

> ใบรับรองบอกว่าใครเป็นคนเซ็นแอป ส่วน provisioning profile บอกว่าเป็นแอปไหนและรันบน iPhone เครื่องไหนได้ ถ้าใช้ Expo ทาง EAS จะสร้างและต่ออายุให้คุณทั้งคู่

หน้าต้นฉบับ: [ใบรับรองนักพัฒนา iOS และ Provisioning Profile กับ Expo](https://devoria.fr/th/blog/ios-certificate-provisioning-profile-expo)
ผู้เขียน: [Mehdi Azizi](https://devoria.fr/th/mehdi-azizi)
เผยแพร่: 2026-11-04
แก้ไขเนื้อหาล่าสุด: 2026-11-04


ใบรับรองนักพัฒนา iOS (certificate) เป็นหลักฐานว่าใครเป็นคนเซ็นแอปของคุณ ส่วน provisioning profile จะผูกใบรับรองนั้นเข้ากับแอปตัวใดตัวหนึ่ง และกำหนดว่าแอปรันที่ไหนได้บ้าง **ถ้าใช้ Expo คุณแทบไม่ต้องสร้างเองเลย เพราะ EAS จะสร้าง เก็บ และต่ออายุให้ทุกครั้งที่คุณสั่ง build**

แต่การเข้าใจว่าแต่ละไฟล์ทำหน้าที่อะไรก็ยังมีประโยชน์ วันไหนที่ build ติดตั้งไม่ได้หรือส่งแอปไม่ผ่าน ความรู้ตรงนี้จะช่วยให้คุณไม่ต้องเสียเวลาไปทั้งวัน คู่มือนี้จะพาไล่ดูองค์ประกอบทั้งสี่อย่าง อายุการใช้งาน ข้อจำกัดของ Apple และข้อผิดพลาดที่เจอบ่อย พร้อมวิธีแก้ของแต่ละข้อ

ผมเผยแพร่แอป iOS ของผมด้วย Expo และ EAS รวมถึง Solys และ TradaZen ขั้นตอนทั้งหมดอยู่ใน [เผยแพร่แอป iOS โดยไม่ต้องมี Mac](https://devoria.fr/th/blog/publish-ios-app-without-mac-expo-eas) ส่วนบทความนี้เราจะเปิดฝากระโปรงดูเรื่องการเซ็นแอปกัน

## ทำไม Apple ถึงบังคับให้เซ็นแอป

แอป iOS ต้องถูกเซ็นก่อน ถึงจะติดตั้งลง iPhone หรือส่งไปที่ App Store Connect ได้ การเซ็นรับประกันว่าแอปมาจากนักพัฒนาที่ Apple รู้จัก และไม่มีใครแก้ไขแอปหลังจากนั้น

สำหรับ App Store มีรายละเอียดหนึ่งที่ช่วยให้สบายใจ ตาม [Technical Note TN3161 ของ Apple](https://developer.apple.com/documentation/technotes/tn3161-inside-code-signing-certificates) App Store จะตรวจว่าใบรับรองสำหรับเผยแพร่ (distribution certificate) ของคุณยังใช้ได้ตอนที่ส่ง จากนั้นจะเซ็นแอปใหม่ ทำให้แอปไม่ขึ้นกับวันหมดอายุของใบรับรองคุณอีกต่อไป **ดังนั้นใบรับรองของคุณต้องใช้ได้ตอนส่งแอป ไม่ใช่ตลอดอายุของแอป**

## องค์ประกอบสี่อย่างที่ต้องรู้

[เอกสารของ Expo เรื่อง credentials](https://docs.expo.dev/app-signing/app-credentials/) นับไว้สามอย่างสำหรับ iOS ได้แก่ distribution certificate, profile และคีย์สำหรับ push notification ผมขอเพิ่ม App ID เข้าไปด้วย เพราะถ้าไม่มีมันก็ไม่มี profile

### ใบรับรองสำหรับเผยแพร่ (distribution certificate)

นี่คือลายเซ็นนักพัฒนาของคุณ [หน้าช่วยเหลือของ Apple เรื่องใบรับรอง](https://developer.apple.com/help/account/certificates/certificates-overview) แบ่งไว้สองกลุ่ม:

- **Apple Development** ใช้รันแอปบนเครื่องของคุณระหว่างพัฒนา เป็นของบุคคลคนเดียว
- **Apple Distribution** ใช้เผยแพร่ไปยังอุปกรณ์ทดสอบที่กำหนดไว้ หรือส่งไปที่ App Store Connect เป็นของทีม และมีแค่เจ้าของบัญชีหรือแอดมินเท่านั้นที่สร้างได้

ใบรับรองสำหรับเผยแพร่ไม่ได้ผูกกับแอปตัวไหนเป็นพิเศษ ใบเดียวเซ็นได้ทุกแอปของคุณ มันมาคู่กับ private key และคีย์นี้แหละที่ใช้เซ็นจริง ๆ ตาม TN3161 ใบรับรองของ Apple โดยทั่วไปมีอายุหนึ่งปีนับจากวันที่สร้าง

### App ID

App ID ใช้ระบุแอปของคุณใน profile โดยอิงจาก bundle identifier เช่น `com.example.myapp` (ตัวอย่างสมมติ) ตาม [หน้าช่วยเหลือของ Apple](https://developer.apple.com/help/account/identifiers/register-an-app-id) มันยังเก็บรายการ capability ที่อนุญาตไว้ด้วย เช่น push notification, App Groups, Sign in with Apple…

ใน Expo ค่านี้คือฟิลด์ `ios.bundleIdentifier` ในคอนฟิกของคุณ **เลือกครั้งเดียวแล้วอย่าเปลี่ยน** มันต้องตรงกันทุกที่ ทั้งในคอนฟิกและใน App Store Connect App ID ไม่มีวันหมดอายุ และตาม [เอกสาร Expo เรื่อง iOS capabilities](https://docs.expo.dev/build-reference/ios-capabilities/) EAS จะซิงก์ capability ให้ตรงกับคอนฟิกของคุณทุกครั้งที่ build

### Provisioning profile

Profile คือตัวเชื่อม มันประกอบด้วย App ID, ใบรับรอง และรายการอุปกรณ์ที่อนุญาต (ขึ้นอยู่กับประเภท) มีสามประเภทที่เกี่ยวกับคุณ:

- **Development**: แอปทดสอบบนอุปกรณ์ที่คุณลงทะเบียนไว้
- **Ad hoc**: build ที่ติดตั้งได้บนรายการอุปกรณ์ที่กำหนด แต่ละเครื่องระบุด้วย UDID นี่คือ "internal distribution" ของ EAS
- **App Store**: สำหรับ App Store Connect และ TestFlight ไม่มีรายการอุปกรณ์ใด ๆ ตามที่ [Technical Note TN3125](https://developer.apple.com/documentation/technotes/tn3125-inside-code-signing-provisioning-profiles) อธิบายไว้

ทุก profile มีวันหมดอายุ โดยทั่วไปไม่เกินหนึ่งปีตามที่ Apple บอก และ 12 เดือนตามที่ Expo บอก

### คีย์ push notification (APNs)

คีย์ APNs อนุญาตให้เซิร์ฟเวอร์ของคุณหรือของ Expo ส่งการแจ้งเตือนไปยังแอปได้ เป็นไฟล์ .p8 ที่ดาวน์โหลดได้ครั้งเดียว เพราะ [Apple ไม่เก็บไว้ให้](https://developer.apple.com/help/account/keys/create-a-private-key) ในบัญชีคุณ คีย์เดียวใช้ได้กับทุกแอป และ [ไม่มีวันหมดอายุ](https://developer.apple.com/support/expiration/)

## ตารางสรุป

| องค์ประกอบ               | ใช้ทำอะไร               | อายุ             | ใครดูแลเมื่อใช้ Expo |
| ------------------------ | ----------------------- | ---------------- | -------------------- |
| Distribution certificate | เซ็น build ของคุณ       | โดยทั่วไปหนึ่งปี | EAS หลังจากล็อกอิน   |
| App ID                   | ระบุตัวแอป              | ไม่หมดอายุ       | คุณ แล้วต่อด้วย EAS  |
| Profile แบบ App Store    | ส่งแอปให้ Apple         | สูงสุด 12 เดือน  | EAS                  |
| Profile แบบ ad hoc       | ติดตั้งบน iPhone ของคุณ | สูงสุด 12 เดือน  | EAS และอุปกรณ์ของคุณ |
| คีย์ push APNs           | ส่งการแจ้งเตือน         | ไม่หมดอายุ       | EAS หรือคุณ          |
| Profile ของบัญชีฟรี      | ทดสอบผ่าน Xcode         | 7 วัน            | Xcode ไม่ใช่ EAS     |

"คุณ แล้วต่อด้วย EAS" หมายถึงคุณเป็นคนเลือก bundle identifier แล้ว EAS ดูแลเรื่อง capability ส่วน "EAS และอุปกรณ์ของคุณ" หมายถึงคุณลงทะเบียน iPhone ทดสอบแต่ละเครื่อง แล้ว EAS สร้าง profile ให้ แถวสุดท้ายเป็นเรื่องบัญชี Apple แบบฟรี ตาม [หน้าช่วยเหลือของ Apple เรื่องบัญชี](https://developer.apple.com/help/account/basics/about-your-developer-account) profile ของบัญชีนี้จะหมดอายุ 7 วันหลังสร้าง

## ข้อจำกัดของ Apple ที่ควรรู้

- **Distribution certificate**: มีได้น้อยมากต่อบัญชี หน้าช่วยเหลือของ Apple บอกว่าได้หนึ่งใบต่อประเภทการเผยแพร่ต่อทีม ส่วนตารางของ Expo บอกว่าจำกัดที่ 2 ใบ จำกฎนี้ไว้: **อย่าสร้างใบรับรองใหม่ทุกครั้งที่ build หรือบนทุกเครื่องคอมพิวเตอร์**
- **คีย์ APNs**: สูงสุด 2 คีย์ต่อบัญชี ตามที่ Expo บอก
- **Profile**: ไม่จำกัด ตามที่ Expo บอก
- **อุปกรณ์**: สูงสุด 100 เครื่องต่อกลุ่มผลิตภัณฑ์ต่อปีสมาชิก ตาม [หน้าช่วยเหลือของ Apple เรื่องอุปกรณ์](https://developer.apple.com/help/account/devices/devices-overview) การปิดใช้งานอุปกรณ์ไม่ได้คืนโควตา ตัวนับจะกลับเป็น 100 เมื่อเริ่มปีสมาชิกถัดไป ถ้าคุณลบอุปกรณ์ออก

## สิ่งที่ EAS ทำให้คุณ

ตาม [หน้าของ Expo เรื่อง managed credentials](https://docs.expo.dev/app-signing/managed-credentials/) build iOS ครั้งแรกจะเสนอให้สร้างสิ่งที่ยังขาด คุณล็อกอินบัญชี Apple Developer แล้ว EAS จะสร้าง distribution certificate, profile และคีย์ push จากนั้นเก็บไว้บนเซิร์ฟเวอร์ของมัน build ครั้งต่อ ๆ ไปก็ใช้ของเดิมซ้ำ

สามข้อที่ควรรู้:

- **รหัสผ่าน Apple ของคุณอยู่บนเครื่องคุณเท่านั้น** [หน้าความปลอดภัยของ Expo](https://docs.expo.dev/app-signing/security/) ระบุว่ารหัสผ่านไม่ถูกส่งไปที่เซิร์ฟเวอร์ และ credentials ที่เก็บไว้ถูกเข้ารหัส
- **`eas credentials` แสดงทุกอย่างให้ดู** ทั้งใบรับรอง, profile และคีย์ push คำสั่งนี้ยังใช้แทนที่หรือลบออกได้ด้วย
- **ลบใน EAS ไม่ได้ลบที่ Apple** ถ้าอยากคืนโควตา ต้องไปเพิกถอน (revoke) ในพอร์ทัลของ Apple

คุณยังเลือกจัดการเองได้ด้วย local credentials: ไฟล์ `credentials.json` จะชี้ไปที่ใบรับรอง (.p12) และ profile (.mobileprovision) ของคุณ Expo แนะนำให้ใส่ไฟล์เหล่านี้ไว้ใน `.gitignore` เป็นกฎเดียวกับ [API key ของแอป Expo](https://devoria.fr/th/blog/secret-api-key-expo-app): ความลับไม่ควรหลุดเข้าไปใน repository เด็ดขาด

## ข้อผิดพลาดที่เจอบ่อยและวิธีแก้

### Profile หมดอายุ

Build แบบ ad hoc ฝัง profile ไว้ข้างใน พอ profile หมดอายุ แอปก็เปิดไม่ได้บน iPhone ทดสอบของคุณ แต่บน App Store นั้น Expo ยืนยันว่าการหมดอายุไม่มีผลกับแอปที่เผยแพร่แล้ว **วิธีแก้: สั่ง build ใหม่** EAS จะสร้าง profile ใหม่ให้ หรือคุณทำเองด้วย `eas credentials` ก็ได้ จากนั้นติดตั้ง build ใหม่ลงอุปกรณ์ของคุณ

อย่าสับสนกับ TestFlight: build บน TestFlight หมดอายุหลัง 90 วัน ไม่ว่าใบรับรองของคุณจะเป็นยังไง รายละเอียดอยู่ใน [TestFlight สำหรับทดสอบแอป iPhone](https://devoria.fr/th/blog/testflight-test-iphone-app-before-app-store)

### ใบรับรองหมดอายุหรือถูกเพิกถอน

Apple บอกชัดเจนว่า ถ้าสมาชิกภาพของคุณยังใช้ได้ แอปที่อยู่บน App Store แล้วจะไม่ได้รับผลกระทบ แต่คุณจะส่ง build ที่เซ็นด้วยใบรับรองนั้นไม่ได้อีก build ที่ส่งไปแล้วแต่ยังไม่ได้ส่งรีวิวอาจถูกระบุเป็น Invalid Binary ถ้าใบรับรองของมันถูกเพิกถอน และ [profile ที่มีใบรับรองที่ถูกเพิกถอนจะใช้ไม่ได้](https://developer.apple.com/help/account/certificates/revoke-a-certificate)

**วิธีแก้: สร้างใบรับรองใหม่จาก `eas credentials` หรือตอน build ครั้งถัดไป** แล้วปล่อยให้ EAS สร้าง profile ใหม่ และอย่าเพิกถอนใบรับรองที่ยังใช้งานได้ดีโดยไม่คิด

### อุปกรณ์ไม่อยู่ใน profile แบบ ad hoc

ลิงก์ติดตั้งใช้ได้บนเครื่องคุณ แต่ใช้ไม่ได้บน iPhone ของผู้ทดสอบ สาเหตุคือ [เอกสาร Expo เรื่อง internal distribution](https://docs.expo.dev/build/internal-distribution/) อธิบายว่าเฉพาะอุปกรณ์ที่อยู่ใน profile ตอน build เท่านั้นที่ติดตั้งแอปได้

วิธีแก้:

1. ลงทะเบียนอุปกรณ์ด้วย `eas device:create`
2. สั่ง build ใหม่ในโหมด interactive โดยล็อกอินบัญชี Apple ไว้ เพื่อให้ EAS อัปเดต profile หรือเซ็น build เดิมใหม่ด้วย `eas build:resign` โดยไม่ต้องคอมไพล์ใหม่ทั้งหมด
3. ใน CI โหมด non-interactive จะใช้ profile เดิมโดยไม่อัปเดตรายการอุปกรณ์ ให้เพิ่มออปชัน `--refresh-ad-hoc-provisioning-profile`

สำหรับบัญชีใหม่หรือบัญชีที่เพิ่งต่ออายุ Apple อาจใช้เวลา 24 ถึง 72 ชั่วโมงในการประมวลผลอุปกรณ์ใหม่ build แรกที่รวมอุปกรณ์นั้นจึงอาจล้มเหลว ให้รอสักพักแล้วลองใหม่

### ใบรับรองเต็มโควตา

Apple ไม่ยอมให้สร้าง distribution certificate ใหม่ ส่วนใหญ่เป็นเพราะมีใบรับรองเก่าค้างอยู่ ที่สร้างจาก Xcode บน Mac เครื่องอื่นหรือจากบริการ build อื่น **ใช้ใบรับรองเดิมซ้ำถ้าคุณมีไฟล์ .p12 ของมัน ถ้าไม่มี ให้เพิกถอนใบที่ไม่ได้ใช้แล้ว** ในพอร์ทัลของ Apple การเพิกถอนไม่กระทบแอปที่ออนไลน์อยู่แล้ว แต่จะทำให้ profile ที่มีใบรับรองนั้นใช้ไม่ได้

### "Provisioning profile doesn't include signing certificate"

ข้อความนี้จาก Xcode หมายความว่า profile ไม่มีใบรับรองที่ private key อยู่บนเครื่องคุณ สาเหตุที่พบบ่อยคือใช้ automatic signing ของ Xcode ปนกับ credentials ของ EAS **เลือกแหล่งข้อมูลที่ถูกต้องเพียงแหล่งเดียว** คือ build ด้วย EAS แบบ managed credentials หรือใช้ local credentials แต่อย่าใช้ทั้งสองอย่าง

### การแจ้งเตือนหยุดทำงานหลังเพิกถอนคีย์

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

### เพิ่ม capability แล้ว profile ใช้ไม่ได้

การเปิดบริการอย่าง push notification หรือ App Groups [ทำให้ profile ใช้ไม่ได้](https://developer.apple.com/help/account/provisioning-profiles/edit-download-or-delete-profiles) ต้องสร้างใหม่ ถ้าใช้ EAS การซิงก์ capability จะเกิดขึ้นทุกครั้งที่ build ถ้า profile ยังถูกปฏิเสธอยู่ ใช้ `eas credentials` สร้างอันใหม่ได้

## ขั้นต่อไปหลังเซ็นแอป

Build ที่เซ็นแล้วเป็นแค่ขั้นหนึ่ง หน้าแอป ภาพหน้าจอ ความเป็นส่วนตัว และการส่งรีวิว รวมอยู่ใน [เผยแพร่แอปบน App Store](https://devoria.fr/th/expertise/publish-app-on-app-store) ถ้าคุณยังไม่ได้สมัครสมาชิก เริ่มจาก [บัญชีนักพัฒนา Apple](https://devoria.fr/th/blog/apple-developer-account-price-free-or-99) และถ้าอยากรู้ว่าทำไมผมแนะนำ Expo ให้มือใหม่ อ่าน [React Native และ Expo สำหรับแอปมือถือ](https://devoria.fr/th/expertise/react-native-expo-mobile-app)

## ถ้าคุณกำลังเตรียมเผยแพร่แอปแรก

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

ถ้าอยากสร้างแอป เชื่อมระบบสมัครสมาชิก และเผยแพร่โดยไม่ต้องปวดหัวกับการเซ็นแอป [iOS & Android Kit](https://devoria.fr/th/kits/ios) จะพาคุณไปทีละสี่ขั้นตอน พร้อม Starter Code จากแอปของผม ตามจังหวะของคุณเอง

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

### Provisioning profile คืออะไร?

คือไฟล์ที่อนุญาตให้แอปของคุณรันได้หรือส่งไปที่ Apple ได้ มันเชื่อม App ID, ใบรับรอง และรายการอุปกรณ์ (ขึ้นอยู่กับประเภท) เข้าด้วยกัน profile แบบ App Store ไม่มีอุปกรณ์เลย ส่วน profile แบบ ad hoc จะระบุอุปกรณ์ไว้จำนวนหนึ่ง

### ใบรับรองนักพัฒนา iOS ฟรีไหม?

ไม่มีราคาแยกต่างหาก distribution certificate รวมอยู่ใน Apple Developer Program ราคา 99 ดอลลาร์ต่อปี ถ้าใช้บัญชี Apple ฟรี Xcode จะให้ทดสอบได้สูงสุด 3 อุปกรณ์ แต่ profile จะหมดอายุใน 7 วันและเผยแพร่แอปไม่ได้

### Distribution certificate ของ Apple ใช้ได้นานแค่ไหน?

โดยทั่วไปหนึ่งปีนับจากวันที่สร้าง ตามที่ Apple บอก provisioning profile ก็มีอายุสูงสุด 12 เดือนเช่นกัน ส่วนคีย์ push notification ไม่มีวันหมดอายุ

### ถ้า distribution certificate หมดอายุจะเกิดอะไรขึ้น?

แอปที่อยู่บน App Store แล้วไม่เป็นอะไร ตราบใดที่สมาชิกภาพของคุณยังใช้ได้ คุณแค่ส่ง build ใหม่ที่เซ็นด้วยใบรับรองนั้นไม่ได้อีก ถ้าใช้ EAS ใบรับรองใหม่จะถูกสร้างตอน build ครั้งถัดไป หรือผ่าน `eas credentials`

### ต้องมี Mac เพื่อสร้างใบรับรอง iOS ไหม?

ไม่ต้อง ถ้าคุณใช้ EAS คุณล็อกอินบัญชี Apple จาก command line แล้ว EAS จะสร้างใบรับรองและ profile ให้ ใช้ได้ทั้งบน Windows และ Linux ถ้าไม่ใช้ EAS วิธีปกติคือใช้ Xcode หรือ Keychain Access บน Mac

### Profile แบบ ad hoc มีอุปกรณ์ได้กี่เครื่อง?

บัญชีของคุณลงทะเบียน iPhone ได้สูงสุด 100 เครื่องต่อปีสมาชิก และได้เท่ากันสำหรับอุปกรณ์กลุ่มอื่นแต่ละกลุ่ม อุปกรณ์ที่ปิดใช้งานแล้วยังนับรวมอยู่ ถ้าอยากทดสอบกับคนจำนวนมากขึ้น ให้ใช้ TestFlight


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

[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 ขั้นตอนและชุดคิทที่เหมาะกับคุณ
