build number App Store Connect: เวอร์ชันและเลขบิลด์
โดย Mehdi Azizi
เผยแพร่เมื่อ , 8 นาที
เวอร์ชันคือเลขที่ลูกค้าเห็น ส่วน build number ใช้ระบุการส่งแต่ละครั้ง คู่นี้ต้องไม่ซ้ำกัน ถ้าใช้ Expo ทาง EAS จะเพิ่มเลขบิลด์ให้คุณเอง
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 อธิบายว่าเป็นเวอร์ชันที่ผู้ใช้เห็น ประกอบด้วยจำนวนเต็มสามตัวคั่นด้วยจุด เช่น 10.14.1 ส่วนเอกสารเรื่อง CFBundleVersion พูดถึงเวอร์ชันของบิลด์ ประกอบด้วยจำนวนเต็มหนึ่งถึงสามตัว มีได้แค่ตัวเลขและจุด
| องค์ประกอบ | คีย์ iOS | ใครเห็น | ฟิลด์ใน Expo |
|---|---|---|---|
| เวอร์ชัน | CFBundleShortVersionString | ลูกค้าของคุณ | version |
| เลขบิลด์ | CFBundleVersion | คุณและ Apple | ios.buildNumber |
ตัวอย่างสมมติ: สำหรับเวอร์ชัน 1.4.0 คุณส่งบิลด์ 12, 13 และ 14 ระหว่างทดสอบ แล้วเลือกหนึ่งบิลด์ไปรีวิว ความช่วยเหลือของ App Store Connect สรุปไว้ว่า เวอร์ชันผูกบิลด์เข้ากับหน้าแอป ส่วนเลขบิลด์ใช้ระบุบิลด์นั้นทั่วทั้งระบบ
กฎการเพิ่มเลขของ Apple
- คู่เลขต้องไม่ซ้ำกัน ตามเอกสารของ Xcode Cloud App Store Connect กำหนดให้คู่ของเวอร์ชันและเลขบิลด์ต้องไม่ซ้ำ แอป iPhone จึงเริ่มเลขบิลด์ใหม่ที่ 1 สำหรับเวอร์ชันใหม่ได้ แต่แอป Mac ทำไม่ได้ เลขต้องเพิ่มขึ้นเสมอ
- เวอร์ชันที่อนุมัติแล้วจะถูกปิด เมื่อ Apple อนุมัติเวอร์ชัน 1.4.0 แล้ว คุณจะเพิ่มบิลด์เข้าไปในเวอร์ชันนั้นไม่ได้อีก เวอร์ชันถัดไปต้องมีเลขสูงกว่า
- เลขแต่ละตัวเปรียบเทียบแบบจำนวนเต็ม 1.10 มาหลัง 1.9 เพราะ 10 มากกว่า 9 ถ้าส่งเวอร์ชัน 1.9 หลังจาก 1.20 ได้รับอนุมัติแล้ว จะถูกปฏิเสธ
คำแนะนำของผม: ใช้เลขบิลด์เป็นจำนวนเต็มที่เพิ่มขึ้นตลอด ไม่ต้องรีเซ็ตกลับเป็น 1 บน iPhone รีเซ็ตเป็น 1 ได้ แต่เลขที่ไม่ซ้ำตลอดอายุแอปช่วยไม่ให้สับสนระหว่างสองบิลด์ใน TestFlight นี่คือสิ่งที่ผมเห็นในแอปของผมที่ใช้โหมด remote ตัวนับเดินต่อจากเวอร์ชันหนึ่งไปอีกเวอร์ชัน
จัดการเวอร์ชันและบิลด์ด้วย Expo และ EAS
หน้าเรื่องเวอร์ชันของ Expo ซึ่งอัปเดตเมื่อ 25 กันยายน 2026 แยกหน้าที่ไว้ชัดเจน เวอร์ชัน (version ใน app.json) เป็นหน้าที่ของคุณ คุณเปลี่ยนเมื่อเตรียมรีลีสใหม่ ส่วนเลขบิลด์ (ios.buildNumber) ฝากให้ EAS จัดการได้ Expo ยังระบุด้วยว่าการลืมเพิ่มเลขนี้เป็นสาเหตุที่พบบ่อยที่ทำให้การส่งถูกปฏิเสธ
ทุกอย่างตั้งค่าใน eas.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 รับค่า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: เวอร์ชันนี้ได้รับอนุมัติไปแล้ว
ข้อความจะหน้าตาประมาณนี้ (เลขสมมติ):
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 ฟิลด์นี้มีลำดับความสำคัญเหนือ version สำหรับ iOS วิธีแก้เดียวกันใช้กับ error ที่ใกล้เคียงกันอย่าง ITMS-90186 "Invalid Pre-Release Train" ซึ่งแจ้งว่าเวอร์ชันนั้นปิดรับบิลด์ใหม่แล้ว
ITMS-90189: Redundant Binary Upload
กรณีนี้ปัญหาอยู่ที่เลขบิลด์:
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": บิลด์ของคุณไม่ขึ้น
บิลด์ส่งไปแล้ว แต่หน้าแอปของคุณไม่มีให้เลือก ให้เช็กตามลำดับนี้
- ยังอยู่ระหว่างประมวลผล Apple ประมวลผลทุกบิลด์ก่อนแสดง และส่งอีเมลแจ้งเมื่อเสร็จ Expo บอกว่าปกติใช้เวลา 10 ถึง 15 นาที ตามที่ Apple ระบุ ถ้าประมวลผลนานเกิน 24 ชั่วโมง ต้องเปิดเรื่องผ่าน Feedback Assistant
- รอการแจ้งเรื่องการเข้ารหัสจากคุณ นี่คือสถานะ Missing Compliance ซึ่งอธิบายไว้ด้านล่าง
- เวอร์ชันไม่ตรงกัน บิลด์ 1.4.1 จะไม่ไปอยู่ใต้หน้าแอปที่เตรียมไว้เป็น 1.5.0 ใน App Store Connect ให้ปรับทั้งสองให้ตรงกัน
- มีเวอร์ชันออกไปในระหว่างนั้น ตามความช่วยเหลือเรื่องการเลือกบิลด์ รายการจะแสดงเฉพาะบิลด์ที่ส่งหลังจากรีลีสนั้น
- ผู้ทดสอบเป็นคนที่มองไม่เห็น ในแอป TestFlight ข้อความ "no builds available" มักหมายความว่าบิลด์ไม่ได้อยู่ในกลุ่มใดเลย รอการรีวิวเบต้า หรือหมดอายุแล้ว รายละเอียดอยู่ในTestFlight สำหรับทดสอบแอป iPhone ของคุณ
สถานะที่ควรรู้
สถานะที่มักอธิบายได้ว่าทำไมบิลด์ไม่ขึ้น ตามรายการของ Apple Processing และ Failed ไม่อยู่ในรายการนั้น เพราะเป็นสถานะการอัปโหลดที่อธิบายไว้ในการติดตามบิลด์
| สถานะ | ความหมาย | วิธีแก้ของคุณ |
|---|---|---|
| Processing | Apple กำลังประมวลผลบิลด์ | รออีเมล |
| Failed | เกิดข้อผิดพลาดระหว่างประมวลผล | อ่าน error แล้วส่งใหม่ |
| Missing Compliance | ยังไม่ได้แจ้งเรื่องการเข้ารหัส | ตอบคำถาม หรือใช้ Info.plist |
| Invalid Binary | การส่งไม่เป็นไปตามข้อกำหนด | แก้ไข แล้วบิลด์ใหม่ |
| Expired | เกิน 90 วัน | บิลด์ใหม่ |
| Ready to Submit | พร้อมทดสอบหรือรีวิว | เพิ่มเข้ากลุ่ม |
แจ้งเรื่องการเข้ารหัสครั้งเดียวจบ
ถ้าไม่มีคีย์ ITSAppUsesNonExemptEncryption Apple จะถามคำถามเรื่องการปฏิบัติตามข้อกำหนดทุกครั้งที่มีเวอร์ชันใหม่ ใน Expo ฟิลด์นี้ชื่อ ios.config.usesNonExemptEncryption:
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}
false หมายถึง ไม่มีการเข้ารหัส หรือมีเฉพาะการเข้ารหัสที่ได้รับยกเว้น Apple ระบุ ว่าการเข้ารหัสที่มากับระบบ เช่น การเชื่อมต่อ HTTPS โดยทั่วไปได้รับยกเว้น และคำตอบนี้ครอบคลุมไลบรารีที่คุณใช้ด้วย แอปทั้งสามของผมแจ้งเป็น false ใส่ false เฉพาะเมื่อเป็นความจริงสำหรับแอปของคุณเท่านั้น เพราะคุณต้องรับผิดชอบต่อคำแจ้งนี้
เปลี่ยนเลขของบิลด์ที่ส่งไปแล้วได้ไหม?
ไม่ได้ เลขนี้ถูกบันทึกอยู่ในไบนารีที่เซ็นแล้ว ถ้าจะแก้ต้องบิลด์ใหม่
สิ่งที่คุณเปลี่ยนได้คือบิลด์ที่ผูกกับเวอร์ชันของคุณ Apple อนุญาตให้มีบิลด์เดียวต่อเวอร์ชัน แต่คุณเปลี่ยนได้กี่ครั้งก็ได้ จนกว่าจะส่งรีวิว:
- เปิดเวอร์ชันใน App Store Connect ที่ส่วน Build
- เลื่อนเมาส์ไปที่บิลด์ปัจจุบัน แล้วคลิกปุ่มลบ ซึ่งเป็นเครื่องหมายลบ
- คลิกปุ่มเพิ่ม ซึ่งเป็นเครื่องหมายบวก เลือกบิลด์ที่ถูกต้อง แล้วบันทึก
การเอาบิลด์ออกจากเวอร์ชันไม่ได้ลบบิลด์นั้นออกจากบัญชีของคุณ ถ้าเวอร์ชันอยู่ระหว่างรีวิวแล้ว ให้ถอนการส่งก่อน การรีวิวจะเริ่มใหม่ตั้งแต่ต้น
ก่อนการส่งครั้งถัดไป
เลขบิลด์เป็นแค่หนึ่งในหลายจุดที่ถูกตรวจตอนส่ง อิมเมจที่ใช้บิลด์อาจทำให้เจอ ITMS-90725 และการเซ็นก็มีกับดักของมันเอง ซึ่งอธิบายไว้ในใบรับรองนักพัฒนา iOS และ provisioning profile ขั้นตอนทั้งหมดตั้งแต่บิลด์จนถึง TestFlight อยู่ในเผยแพร่แอป iOS โดยไม่ใช้ Mac และระยะเวลารีวิวอยู่ในระยะเวลาอนุมัติของ App Store ทุกขั้นตอนรวมไว้ในหน้าเผยแพร่แอปบน App Store
ถ้าคุณกำลังเตรียมรีลีสแรก ทำการวินิจฉัยฟรี ได้เลย ระบบจะบอกว่าอะไรติดอยู่ในโปรเจกต์ของคุณ และส่งเช็กลิสต์กันโดน Apple ปฏิเสธของผมให้ ส่วนการสร้างแอป เชื่อมระบบสมัครสมาชิก และเผยแพร่ iOS & Android Kit จะพาคุณไปตามเส้นทางสี่ขั้นตอน พร้อมโค้ดเริ่มต้นจากแอปของผม ตามจังหวะของคุณเอง
คำถามที่พบบ่อย
เวอร์ชันกับ 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 ให้เปิดเรื่องแจ้งปัญหา

