# build number App Store Connect: เวอร์ชันและเลขบิลด์

> เวอร์ชันคือเลขที่ลูกค้าเห็น ส่วน build number ใช้ระบุการส่งแต่ละครั้ง คู่นี้ต้องไม่ซ้ำกัน ถ้าใช้ Expo ทาง EAS จะเพิ่มเลขบิลด์ให้คุณเอง

หน้าต้นฉบับ: [build number App Store Connect: เวอร์ชันและเลขบิลด์](https://devoria.fr/th/blog/app-store-connect-build-number-version)
ผู้เขียน: [Mehdi Azizi](https://devoria.fr/th/mehdi-azizi)
เผยแพร่: 2026-11-04
แก้ไขเนื้อหาล่าสุด: 2026-11-04


build number ของ App Store Connect คือเลขบิลด์ ซึ่งก็คือคีย์ `CFBundleVersion` ที่ใช้ระบุการส่งแต่ละครั้ง ส่วนเวอร์ชัน `CFBundleShortVersionString` คือเลขที่ลูกค้าของคุณเห็นบน App Store **Apple กำหนดให้คู่ของเวอร์ชันกับเลขบิลด์ต้องไม่ซ้ำกัน เลขบิลด์หนึ่งเลขใช้ได้ครั้งเดียวต่อเวอร์ชันเดียวกัน**

ถ้าใช้ Expo คุณกำหนดเวอร์ชันเอง และให้ EAS เพิ่มเลขบิลด์ให้ทุกครั้งที่บิลด์ production ได้ คู่มือนี้อธิบายเลขทั้งสองตัว กฎของ Apple ข้อผิดพลาด ITMS-90062 และ ITMS-90189 และสิ่งที่ต้องเช็กเมื่อบิลด์ของคุณไม่ขึ้น

ผมเผยแพร่แอป iOS ด้วย Expo และ EAS รวมถึง Solys, TradaZen และ Nolera การตั้งค่าที่แสดงด้านล่างมาจากไฟล์ `eas.json` ของแอปเหล่านี้

## เวอร์ชันกับเลขบิลด์ต่างกันอย่างไร?

มีสองคีย์ใน Info.plist ที่ใช้ระบุแอปของคุณ [เอกสารของ Apple เรื่อง CFBundleShortVersionString](https://developer.apple.com/documentation/bundleresources/information-property-list/cfbundleshortversionstring) อธิบายว่าเป็นเวอร์ชันที่ผู้ใช้เห็น ประกอบด้วยจำนวนเต็มสามตัวคั่นด้วยจุด เช่น 10.14.1 ส่วน[เอกสารเรื่อง CFBundleVersion](https://developer.apple.com/documentation/bundleresources/information-property-list/cfbundleversion) พูดถึงเวอร์ชันของบิลด์ ประกอบด้วยจำนวนเต็มหนึ่งถึงสามตัว มีได้แค่ตัวเลขและจุด

| องค์ประกอบ | คีย์ iOS                   | ใครเห็น      | ฟิลด์ใน Expo      |
| ---------- | -------------------------- | ------------ | ----------------- |
| เวอร์ชัน   | CFBundleShortVersionString | ลูกค้าของคุณ | `version`         |
| เลขบิลด์   | CFBundleVersion            | คุณและ Apple | `ios.buildNumber` |

ตัวอย่างสมมติ: สำหรับเวอร์ชัน 1.4.0 คุณส่งบิลด์ 12, 13 และ 14 ระหว่างทดสอบ แล้วเลือกหนึ่งบิลด์ไปรีวิว [ความช่วยเหลือของ App Store Connect](https://developer.apple.com/help/app-store-connect/manage-builds/upload-builds) สรุปไว้ว่า เวอร์ชันผูกบิลด์เข้ากับหน้าแอป ส่วนเลขบิลด์ใช้ระบุบิลด์นั้นทั่วทั้งระบบ

## กฎการเพิ่มเลขของ Apple

1. **คู่เลขต้องไม่ซ้ำกัน** ตาม[เอกสารของ Xcode Cloud](https://developer.apple.com/documentation/xcode/setting-the-next-build-number-for-xcode-cloud-builds) App Store Connect กำหนดให้คู่ของเวอร์ชันและเลขบิลด์ต้องไม่ซ้ำ แอป iPhone จึงเริ่มเลขบิลด์ใหม่ที่ 1 สำหรับเวอร์ชันใหม่ได้ แต่แอป Mac ทำไม่ได้ เลขต้องเพิ่มขึ้นเสมอ
2. **เวอร์ชันที่อนุมัติแล้วจะถูกปิด** เมื่อ Apple อนุมัติเวอร์ชัน 1.4.0 แล้ว คุณจะเพิ่มบิลด์เข้าไปในเวอร์ชันนั้นไม่ได้อีก เวอร์ชันถัดไปต้องมีเลขสูงกว่า
3. **เลขแต่ละตัวเปรียบเทียบแบบจำนวนเต็ม** 1.10 มาหลัง 1.9 เพราะ 10 มากกว่า 9 ถ้าส่งเวอร์ชัน 1.9 หลังจาก 1.20 ได้รับอนุมัติแล้ว จะถูกปฏิเสธ

คำแนะนำของผม: **ใช้เลขบิลด์เป็นจำนวนเต็มที่เพิ่มขึ้นตลอด ไม่ต้องรีเซ็ตกลับเป็น 1** บน iPhone รีเซ็ตเป็น 1 ได้ แต่เลขที่ไม่ซ้ำตลอดอายุแอปช่วยไม่ให้สับสนระหว่างสองบิลด์ใน TestFlight นี่คือสิ่งที่ผมเห็นในแอปของผมที่ใช้โหมด remote ตัวนับเดินต่อจากเวอร์ชันหนึ่งไปอีกเวอร์ชัน

## จัดการเวอร์ชันและบิลด์ด้วย Expo และ EAS

[หน้าเรื่องเวอร์ชันของ Expo](https://docs.expo.dev/build-reference/app-versions/) ซึ่งอัปเดตเมื่อ 25 กันยายน 2026 แยกหน้าที่ไว้ชัดเจน เวอร์ชัน (`version` ใน app.json) เป็นหน้าที่ของคุณ คุณเปลี่ยนเมื่อเตรียมรีลีสใหม่ ส่วนเลขบิลด์ (`ios.buildNumber`) ฝากให้ EAS จัดการได้ Expo ยังระบุด้วยว่าการลืมเพิ่มเลขนี้เป็นสาเหตุที่พบบ่อยที่ทำให้การส่งถูกปฏิเสธ

ทุกอย่างตั้งค่าใน eas.json:

```json
{
  "cli": {
    "appVersionSource": "remote"
  },
  "build": {
    "production": {
      "autoIncrement": true
    }
  }
}
```

- **`"remote"`**: เซิร์ฟเวอร์ของ EAS เก็บเลขบิลด์ไว้ นี่คือพฤติกรรมที่แนะนำตั้งแต่ EAS CLI 12 ตัวนับเริ่มจากค่าในคอนฟิกของคุณ หรือจาก 1 จากนั้น `ios.buildNumber` จะถูกเพิกเฉย
- **`"local"`**: คอนฟิกของคุณเป็นตัวหลัก เมื่อใช้ `autoIncrement` ทาง EAS จะแก้ `ios.buildNumber` ในไฟล์ของคุณ และคุณต้อง commit การเปลี่ยนแปลงนั้นทุกครั้งที่บิลด์
- **`autoIncrement`**: [เอกสารอ้างอิงของ eas.json](https://docs.expo.dev/eas/json/) รับค่า `true` หรือ `"buildNumber"` สำหรับบิลด์ และ `"version"` เพื่อเพิ่มตัวเลขหลักสุดท้ายของเวอร์ชัน ในโหมด remote Expo ระบุว่าไม่รองรับ `"version"`

ของผม TradaZen และ Nolera ใช้ `remote` ส่วน Solys ยังใช้ `local` เลขบิลด์อยู่ใน app.json และทุกครั้งที่บิลด์ production เลขในไฟล์จะเพิ่มขึ้น **ทั้งสองแบบใช้ได้ แต่โหมด remote ตัดความเสี่ยงที่จะลืม commit ออกไป**

มีสองคำสั่งที่ช่วยเสริม `eas build:version:set` ใช้ตั้งค่าเริ่มต้นของตัวนับ remote: ใส่เลขล่าสุดที่ส่งให้ Apple ไปแล้ว `eas build:version:sync` คัดลอกค่าจาก remote กลับมาที่โปรเจกต์ของคุณ มีประโยชน์ถ้าวันหนึ่งคุณคอมไพล์ด้วย Xcode ถ้าใช้ EAS Update โหมด remote จะใช้กับนโยบาย `nativeVersion` ไม่ได้ Expo แนะนำให้ใช้ `appVersion`

## ITMS-90062: เวอร์ชันนี้ได้รับอนุมัติไปแล้ว

ข้อความจะหน้าตาประมาณนี้ (เลขสมมติ):

```text
ERROR ITMS-90062: This bundle is invalid. The value for key
CFBundleShortVersionString [1.4.0] in the Info.plist file must
contain a higher version than that of the previously approved
version [1.4.0].
```

Apple อนุมัติเวอร์ชัน 1.4.0 ไปแล้ว คุณจึงเพิ่มบิลด์เข้าไปไม่ได้อีก **เพิ่มเวอร์ชันใน app.json เช่นเป็น 1.4.1 แล้วบิลด์ใหม่** แค่เปลี่ยนเลขบิลด์อย่างเดียวไม่พอ

ถ้า error ยังกลับมาทั้งที่ `version` อัปเดตแล้ว ให้หาฟิลด์ `ios.version` ตาม[เอกสารอ้างอิงคอนฟิกของ Expo](https://docs.expo.dev/versions/latest/config/app/) ฟิลด์นี้มีลำดับความสำคัญเหนือ `version` สำหรับ iOS วิธีแก้เดียวกันใช้กับ error ที่ใกล้เคียงกันอย่าง ITMS-90186 "Invalid Pre-Release Train" ซึ่งแจ้งว่าเวอร์ชันนั้นปิดรับบิลด์ใหม่แล้ว

## ITMS-90189: Redundant Binary Upload

กรณีนี้ปัญหาอยู่ที่เลขบิลด์:

```text
ERROR ITMS-90189: Redundant Binary Upload. You've already uploaded
a build with build number '12' for version number '1.4.0'.
```

คู่ 1.4.0 (12) มีอยู่ที่ Apple แล้ว ถ้าใช้ Expo สาเหตุที่เจอบ่อยมีสี่ข้อ:

- **โปรไฟล์ที่ใช้ไม่มี `autoIncrement`** ถ้าคุณสร้างโปรไฟล์แยกสำหรับ TestFlight เหมือนของ Nolera ให้ใส่ตัวเลือกนี้กลับเข้าไป
- **ตัวนับ remote ตามไม่ทัน** คุณเปลี่ยนมาใช้ `remote` หลังจากส่งด้วยมือมาก่อน: รัน `eas build:version:set` พร้อมเลขล่าสุดที่ Apple รู้จัก
- **ลืม commit ในโหมด local** บิลด์ถัดไปจึงเริ่มจากเลขเดิม
- **คุณส่งไบนารีเดิมซ้ำ** เมื่อใช้ `eas submit` ให้เลือกบิลด์ใหม่ ไม่ใช่บิลด์เก่า

**วิธีแก้เหมือนกันเสมอ: บิลด์ใหม่ที่มีเลขสูงกว่า**

## "No builds available": บิลด์ของคุณไม่ขึ้น

บิลด์ส่งไปแล้ว แต่หน้าแอปของคุณไม่มีให้เลือก ให้เช็กตามลำดับนี้

1. **ยังอยู่ระหว่างประมวลผล** Apple ประมวลผลทุกบิลด์ก่อนแสดง และส่งอีเมลแจ้งเมื่อเสร็จ [Expo](https://docs.expo.dev/submit/ios/) บอกว่าปกติใช้เวลา 10 ถึง 15 นาที [ตามที่ Apple ระบุ](https://developer.apple.com/help/app-store-connect/manage-builds/view-builds-and-metadata) ถ้าประมวลผลนานเกิน 24 ชั่วโมง ต้องเปิดเรื่องผ่าน Feedback Assistant
2. **รอการแจ้งเรื่องการเข้ารหัสจากคุณ** นี่คือสถานะ Missing Compliance ซึ่งอธิบายไว้ด้านล่าง
3. **เวอร์ชันไม่ตรงกัน** บิลด์ 1.4.1 จะไม่ไปอยู่ใต้หน้าแอปที่เตรียมไว้เป็น 1.5.0 ใน App Store Connect ให้ปรับทั้งสองให้ตรงกัน
4. **มีเวอร์ชันออกไปในระหว่างนั้น** ตาม[ความช่วยเหลือเรื่องการเลือกบิลด์](https://developer.apple.com/help/app-store-connect/manage-builds/choose-a-build-to-submit) รายการจะแสดงเฉพาะบิลด์ที่ส่งหลังจากรีลีสนั้น
5. **ผู้ทดสอบเป็นคนที่มองไม่เห็น** ในแอป TestFlight ข้อความ "no builds available" มักหมายความว่าบิลด์ไม่ได้อยู่ในกลุ่มใดเลย รอการรีวิวเบต้า หรือหมดอายุแล้ว รายละเอียดอยู่ใน[TestFlight สำหรับทดสอบแอป iPhone ของคุณ](https://devoria.fr/th/blog/testflight-test-iphone-app-before-app-store)

### สถานะที่ควรรู้

สถานะที่มักอธิบายได้ว่าทำไมบิลด์ไม่ขึ้น ตาม[รายการของ Apple](https://developer.apple.com/help/app-store-connect/reference/app-build-statuses) Processing และ Failed ไม่อยู่ในรายการนั้น เพราะเป็นสถานะการอัปโหลดที่อธิบายไว้ใน[การติดตามบิลด์](https://developer.apple.com/help/app-store-connect/manage-builds/view-builds-and-metadata)

| สถานะ              | ความหมาย                       | วิธีแก้ของคุณ               |
| ------------------ | ------------------------------ | --------------------------- |
| Processing         | Apple กำลังประมวลผลบิลด์       | รออีเมล                     |
| Failed             | เกิดข้อผิดพลาดระหว่างประมวลผล  | อ่าน error แล้วส่งใหม่      |
| Missing Compliance | ยังไม่ได้แจ้งเรื่องการเข้ารหัส | ตอบคำถาม หรือใช้ Info.plist |
| Invalid Binary     | การส่งไม่เป็นไปตามข้อกำหนด     | แก้ไข แล้วบิลด์ใหม่         |
| Expired            | เกิน 90 วัน                    | บิลด์ใหม่                   |
| Ready to Submit    | พร้อมทดสอบหรือรีวิว            | เพิ่มเข้ากลุ่ม              |

### แจ้งเรื่องการเข้ารหัสครั้งเดียวจบ

ถ้าไม่มีคีย์ `ITSAppUsesNonExemptEncryption` [Apple](https://developer.apple.com/documentation/bundleresources/information-property-list/itsappusesnonexemptencryption) จะถามคำถามเรื่องการปฏิบัติตามข้อกำหนดทุกครั้งที่มีเวอร์ชันใหม่ ใน Expo ฟิลด์นี้ชื่อ `ios.config.usesNonExemptEncryption`:

```json
{
  "expo": {
    "ios": {
      "config": {
        "usesNonExemptEncryption": false
      }
    }
  }
}
```

`false` หมายถึง ไม่มีการเข้ารหัส หรือมีเฉพาะการเข้ารหัสที่ได้รับยกเว้น [Apple ระบุ](https://developer.apple.com/documentation/security/complying-with-encryption-export-regulations) ว่าการเข้ารหัสที่มากับระบบ เช่น การเชื่อมต่อ HTTPS โดยทั่วไปได้รับยกเว้น และคำตอบนี้ครอบคลุมไลบรารีที่คุณใช้ด้วย แอปทั้งสามของผมแจ้งเป็น `false` **ใส่ `false` เฉพาะเมื่อเป็นความจริงสำหรับแอปของคุณเท่านั้น เพราะคุณต้องรับผิดชอบต่อคำแจ้งนี้**

## เปลี่ยนเลขของบิลด์ที่ส่งไปแล้วได้ไหม?

ไม่ได้ เลขนี้ถูกบันทึกอยู่ในไบนารีที่เซ็นแล้ว ถ้าจะแก้ต้องบิลด์ใหม่

สิ่งที่คุณเปลี่ยนได้คือบิลด์ที่ผูกกับเวอร์ชันของคุณ Apple อนุญาตให้มีบิลด์เดียวต่อเวอร์ชัน แต่[คุณเปลี่ยนได้กี่ครั้งก็ได้](https://developer.apple.com/help/app-store-connect/manage-builds/choose-a-build-to-submit) จนกว่าจะส่งรีวิว:

1. เปิดเวอร์ชันใน App Store Connect ที่ส่วน Build
2. เลื่อนเมาส์ไปที่บิลด์ปัจจุบัน แล้วคลิกปุ่มลบ ซึ่งเป็นเครื่องหมายลบ
3. คลิกปุ่มเพิ่ม ซึ่งเป็นเครื่องหมายบวก เลือกบิลด์ที่ถูกต้อง แล้วบันทึก

การเอาบิลด์ออกจากเวอร์ชันไม่ได้ลบบิลด์นั้นออกจากบัญชีของคุณ ถ้าเวอร์ชันอยู่ระหว่างรีวิวแล้ว ให้[ถอนการส่งก่อน](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/remove-a-submission-from-review) การรีวิวจะเริ่มใหม่ตั้งแต่ต้น

## ก่อนการส่งครั้งถัดไป

เลขบิลด์เป็นแค่หนึ่งในหลายจุดที่ถูกตรวจตอนส่ง อิมเมจที่ใช้บิลด์อาจทำให้เจอ [ITMS-90725](https://devoria.fr/th/blog/itms-90725-sdk-version-issue-expo) และการเซ็นก็มีกับดักของมันเอง ซึ่งอธิบายไว้ใน[ใบรับรองนักพัฒนา iOS และ provisioning profile](https://devoria.fr/th/blog/ios-certificate-provisioning-profile-expo) ขั้นตอนทั้งหมดตั้งแต่บิลด์จนถึง TestFlight อยู่ใน[เผยแพร่แอป iOS โดยไม่ใช้ Mac](https://devoria.fr/th/blog/publish-ios-app-without-mac-expo-eas) และระยะเวลารีวิวอยู่ใน[ระยะเวลาอนุมัติของ App Store](https://devoria.fr/th/blog/app-store-review-time-how-long) ทุกขั้นตอนรวมไว้ในหน้า[เผยแพร่แอปบน App Store](https://devoria.fr/th/expertise/publish-app-on-app-store)

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

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

### เวอร์ชันกับ build number บน App Store Connect ต่างกันอย่างไร?

เวอร์ชันคือเลขสาธารณะของรีลีส เช่น 1.4.0 ส่วน build number ใช้ระบุไบนารีตัวหนึ่งที่ส่งให้ Apple สำหรับเวอร์ชันนั้น คุณส่งหลายบิลด์สำหรับเวอร์ชันเดียวกันได้ แต่ละบิลด์มีเลขของตัวเอง

### ต้องเปลี่ยนเลขบิลด์ทุกครั้งที่ส่งไหม?

ใช่ สำหรับเวอร์ชันเดียวกัน Apple จะปฏิเสธการส่งครั้งที่สองที่ใช้คู่เวอร์ชันและเลขบิลด์ซ้ำ นั่นคือ error ITMS-90189 ถ้าใช้ EAS ตัวเลือก `autoIncrement` จะจัดการให้ทุกครั้งที่บิลด์ production

### เลขบิลด์ต้องเริ่มใหม่ที่ 1 ทุกเวอร์ชันไหม?

ไม่จำเป็น บน iPhone Apple ยอมรับเลขที่ต่ำกว่าสำหรับเวอร์ชันใหม่ เพราะแค่คู่เลขต้องไม่ซ้ำ ตัวนับที่เพิ่มขึ้นตลอดยังคงติดตามได้ง่ายกว่า

### เปลี่ยน build number ใน App Store Connect อย่างไร?

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

### ทำไมบิลด์ของฉันไม่ขึ้นใน App Store Connect?

ส่วนใหญ่บิลด์ยังอยู่ระหว่างประมวลผล หรือรอการแจ้งเรื่องการเข้ารหัสจากคุณ ให้เช็กด้วยว่าเวอร์ชันของบิลด์ตรงกับเวอร์ชันในหน้าแอป ถ้าประมวลผลนานเกิน 24 ชั่วโมง Apple ให้เปิดเรื่องแจ้งปัญหา


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

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