ฉันควรใช้ค่าใดสำหรับ CFBundleVersion และ CFBundleShortVersionString


104

นี่เป็นการส่งแอป iOS ครั้งแรกของฉันและฉันไม่ต้องการให้แอปของฉันถูกปฏิเสธ

นี่มาจาก Apple Docs:

CFBundleVersion (String - iOS, OS X) ระบุหมายเลขเวอร์ชันบิวด์ของบันเดิลซึ่งระบุการทำซ้ำ (เปิดตัวหรือยังไม่ได้เผยแพร่) ของบันเดิล หมายเลขเวอร์ชันบิวด์ควรเป็นสตริงที่ประกอบด้วยจำนวนเต็มที่ไม่เป็นลบสามจำนวนที่คั่นด้วยจุดโดยที่จำนวนเต็มแรกมีค่ามากกว่าศูนย์ สตริงควรมีเฉพาะอักขระตัวเลข (0-9) และจุด (.) เลขศูนย์นำหน้าจะถูกตัดทอนจากจำนวนเต็มแต่ละตัวและจะถูกละเว้น (นั่นคือ 1.02.3 เทียบเท่ากับ 1.2.3) คีย์นี้ไม่สามารถแปลเป็นภาษาท้องถิ่นได้

CFBundleShortVersionString (String - iOS, OS X) ระบุหมายเลขเวอร์ชันรีลีสของบันเดิลซึ่งระบุการทำซ้ำของแอพที่เผยแพร่ หมายเลขเวอร์ชันเผยแพร่คือสตริงที่ประกอบด้วยจำนวนเต็มที่คั่นด้วยจุดสามจุด จำนวนเต็มแรกแสดงถึงการแก้ไขที่สำคัญของแอปเช่นการแก้ไขที่ใช้คุณลักษณะใหม่หรือการเปลี่ยนแปลงที่สำคัญ จำนวนเต็มที่สองหมายถึงการแก้ไขที่ใช้คุณลักษณะที่โดดเด่นน้อยกว่า จำนวนเต็มที่สามแสดงถึงรีลีสการบำรุงรักษา

ค่าของคีย์นี้แตกต่างจากค่าของ“ CFBundleVersion” ซึ่งระบุการทำซ้ำ (เปิดตัวหรือยังไม่ได้เผยแพร่) ของแอป คีย์นี้สามารถแปลเป็นภาษาท้องถิ่นได้โดยรวมไว้ในไฟล์ InfoPlist.strings ของคุณ

แต่มันดูแปลกไปหน่อย การตีความของฉันสำหรับสิ่งนี้คือการทำให้ทั้งสองค่าเหมือนกันกล่าวคือ:

CFBundleVersion: 1.0.0
CFBundleShortVersionString: 1.0.0

มีใครสามารถยืนยันได้ 100% ว่าเป็นสิ่งที่ฉันควรจะใส่?


1
ตามนั้น CFBundleShortVersionString สามารถแปลได้ แต่ถ้าต้องเป็นจำนวนเต็มสามตัวคั่นด้วยจุดจะเป็นไปได้ในการแปลภาษาใด
Rick

@ Rick ฉันคิดว่านั่นหมายความว่าคุณสามารถแปลงเป็นภาษาที่มีตัวเลขต่างกันเช่นภาษาอาหรับได้หรือไม่?
shiser

@shiser เป็นเพียงการอวดรู้ "เลขอารบิก" เป็นตัวเลขที่เราใช้ในโลกตะวันตกและที่อื่น ๆ ส่วนใหญ่ก็เช่นกัน แต่ฉันเข้าใจว่าคุณหมายถึงอะไรและมีบางส่วนของโลกอาหรับที่ไม่ใช้ "เลขอารบิค" en.wikipedia.org/wiki/Arabic_numerals
RenniePet

1
คำตอบอื่นในที่นี่ stackoverflow.com/q/21125159/419348
AechoLiu

คำตอบ:


79

ลองคิดแบบนี้: "เวอร์ชันสั้น" ( CFBundleShortVersionString) คือหมายเลขเวอร์ชันสาธารณะ "เวอร์ชัน" ( CFBundleVersion) เป็นหมายเลขเวอร์ชันภายในที่สามารถเปลี่ยนแปลงได้บ่อยกว่า "เวอร์ชันสั้น" สาธารณะ โดยส่วนตัวฉันใช้เหมือนกันสำหรับทั้งสอง แต่หลายคนอัปเดต "เวอร์ชัน" ในทุกบิลด์ ไม่ว่าจะด้วยวิธีใดโดยทั่วไปคุณจะอัปเดต "เวอร์ชันสั้น" เมื่อคุณปล่อยให้ Apple คุณอัปเดต "เวอร์ชัน" บ่อยเพียงใดขึ้นอยู่กับคุณและความต้องการของคุณ


14
โปรดทราบว่าเวอร์ชันบันเดิล (CFBundleVersion) ต้องเป็นตัวเลขที่สูงกว่าเวอร์ชันบันเดิลของแอปก่อนหน้าของคุณมิฉะนั้นจะได้รับข้อผิดพลาดเมื่อส่งไปยัง App Store ดูstackoverflow.com/questions/4933093/...
ฟิลิป

3
เช่นเดียวกับที่ Phil กล่าวไว้ข้างต้นในปัจจุบันหากคุณส่งบิวด์ที่ล้มเหลว (ไม่ได้รับการอนุมัติจาก App Store) อีกครั้งดูเหมือนว่าคุณต้องชน CFBundleVersion ในการส่งแต่ละครั้งดังนั้นจึงมีแนวโน้มว่าตัวเลขเหล่านี้จะแตกต่างกันเว้นแต่คุณจะสมบูรณ์แบบเสมอไป หรือคุณไม่รังเกียจที่จะชนรุ่นสาธารณะ (CFBundleShortVersionString) # เมื่อมีการเปลี่ยนแปลงใด ๆ ที่จำเป็นเพื่อให้ส่งไปยัง App Store ได้สำเร็จ
likethesky

112

CFBundleShortVersionStringให้เวอร์ชันแอปของคุณ โดยทั่วไปจะเพิ่มขึ้นทุกครั้งที่คุณเผยแพร่แอปไปยัง App Store นี่คือเวอร์ชันที่ปรากฏในส่วน "เวอร์ชัน" สำหรับหน้า App Store ของแอปพลิเคชันของคุณ

CFBundleVersionให้หมายเลขรุ่นที่ใช้สำหรับการพัฒนาและการทดสอบ ได้แก่ วัตถุประสงค์ด้าน "เทคนิค" ผู้ใช้ปลายทางไม่ค่อยสนใจหมายเลขรุ่น แต่ในระหว่างการพัฒนาคุณอาจจำเป็นต้องทราบว่ามีการพัฒนาและแก้ไขอะไรในแต่ละรุ่น โดยปกติจะเพิ่มขึ้นในการทำซ้ำแต่ละครั้งของรีลีสภายใน และคุณสามารถใช้เครื่องมือการรวมแบบต่อเนื่องเช่น Jenkins เพื่อเพิ่มหมายเลขบิวด์โดยอัตโนมัติในแต่ละบิลด์

เวอร์ชันและหมายเลขรุ่น

ตัวเลขทั้งสองไม่ได้ขึ้นอยู่กับกันและกัน แต่เป็นความคิดที่ดีที่จะขนานกันเพื่อหลีกเลี่ยงความสับสน โปรดทราบว่าเมื่อแอปของคุณผ่านการตรวจสอบ App Store แล้วคุณจะต้องเพิ่มหมายเลขรุ่นอย่างที่ Phil และ likeTheSky ระบุไว้ไม่ว่าคุณจะเผยแพร่หรือไม่ก็ตาม

กรณีการใช้งาน: สมมติว่าคุณมีงานสร้างที่ผ่านการทดสอบมาแล้วพร้อมสำหรับการส่ง หมายเลขรุ่นมันเป็น1.0.0และหมายเลขการสร้างเป็น1.0.0.32 เมื่อคุณส่งแอปของคุณคุณต้องอัปเดตเวอร์ชันเป็น1.0.1และหมายเลขการสร้างเป็น1.0.1.0


4
ดังนั้นจึงปลอดภัยหรือไม่ที่จะเพิกเฉยต่อบิตนั้นในเอกสาร (ที่อ้างถึงในคำถาม) เกี่ยวกับ CFBundleVersion เป็นค่าที่คั่นด้วยจุด " สาม "
big_m

ฉันคิดว่ามันขึ้นอยู่กับคุณ หากคุณไม่ได้เผยแพร่รุ่นบ่อยๆหรือหากคุณไม่จำเป็นต้องปฏิบัติตามการแก้ไขข้อบกพร่องอย่างเคร่งครัดผ่านรอบการทดสอบบ่อยๆ คุณอาจใช้ตัวเลข 3 หลักสำหรับทั้งคู่
Yunus Nedim Mehel

ดังนั้น CFBundleVersion จึงเป็น 0 สำหรับการสร้างแอปสโตร์ได้หรือไม่ Apple จะปฏิเสธหรือไม่?
kraftydevil

3
ได้คุณสามารถใช้ค่าอื่นที่ไม่ใช่ตัวเลข 3 ตัวพร้อมเครื่องหมายวรรคตอน ฉันใช้ค่าวันที่ - เวลาเช่น201606070620ในแอป iOS สำหรับการจัดส่ง
Basil Bourque

3
@BasilBourque หากคุณไม่ปฏิบัติตามหลักเกณฑ์คุณอาจประสบปัญหาหากคุณใช้การซื้อในแอป ดูหมายเหตุทางเทคนิค 2413
DanSkeel

15

คำตอบโดย rmaddyถูกต้อง ฉันจะเพิ่มความคิดอีกสองข้อ

หมายเลขเวอร์ชันที่สาม

ระวังหมายเลขเวอร์ชันที่สามซึ่งระบุไว้บนเว็บไซต์ iTunesConnect ซึ่งเป็นส่วนหนึ่งของคำจำกัดความของแอปของคุณ หากตัวเลขนั้นแตกต่างจากทั้งสองใน Xcode Apple จะเตือนคุณ คุณสามารถเพิกเฉยต่อคำเตือนได้เนื่องจากไม่ใช่ตัวหยุดการแสดง (ไม่ใช่ "ข้อผิดพลาด")

วันที่ - เวลาเป็นเวอร์ชัน

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

สำหรับแอปอื่น ๆ คุณอาจต้องการใช้เพียงแค่ค่าวันที่ - เวลาในรูปแบบมาตรฐานISO 8601 (YYYYMMDDHHMM) ตัวอย่างเช่น201606070620. ลำดับของปีเดือนวันที่ - ชั่วโมงนาทีจะแสดงจำนวนที่เพิ่มขึ้นเรื่อย ๆ โดยมีความยาวเท่ากันเสมอเนื่องจากช่องว่างภายในเป็นศูนย์ซึ่งเมื่อเรียงลำดับตามตัวอักษรก็จะเรียงตามลำดับ

ฉันใช้หมายเลขเวอร์ชันรูปแบบนี้สำเร็จแล้วในแอป iOS สำหรับการจัดส่งที่ทำงานใน iOS 7, 8 และ 9

คุณสามารถสร้างค่านี้โดยอัตโนมัติได้ ในโครงการของคุณTarget> Build Phases> Run Scriptแผง:

  1. ระบุในShellฟิลด์:/bin/sh
  2. วางสคริปต์ 5 บรรทัดต่อไปนี้ที่เห็นด้านล่าง
  3. (ไม่บังคับ) Show environment variables in build logเลือกช่องทำเครื่องหมาย
  4. ยกเลิกการRun script only when installingเลือกช่องทำเครื่องหมาย

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

#!/bin/bash
buildNumber=$(date -u "+%Y%m%d%H%M")
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $buildNumber" "$INFOPLIST_FILE"  # Version number
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"  # Build number
echo "DateTime for app version number: $buildNumber"

หรือทำแบบไฮบริดโดยใช้แบบเดิม1.2.3สำหรับหมายเลขเวอร์ชันและวันที่ - เวลาเป็นหมายเลขบิลด์ ในการทำไฮบริดเพียงแค่แสดงความคิดเห็นออกจากCFBundleShortVersionStringบรรทัดที่มี#ด้านหน้า


9

รูปแบบที่เหมาะสมที่สุดสำหรับฉันคือการใช้หมายเลขเวอร์ชัน (เช่นCFBundleShortVersionString) สำหรับหมายเลขเวอร์ชันจริงจากนั้นใช้หมายเลขรุ่น (เช่นCFBundleVersion) เพื่อแสดงการส่งไปยัง App Store ดังนั้นหากไม่มีปัญหาใด ๆ และส่งซ้ำหมายเลขนี้จะเป็น 1 เสมอสำหรับรุ่นใหม่ฉันรีเซ็ตเป็น 1 หากก่อนหน้านี้มีปัญหาในการทดสอบ TestFlight หรืออยู่ระหว่างการตรวจสอบ

หมายเลขรุ่นเป็นวิธีการตั้งชื่อการส่งแต่ละรายการที่คุณระบุสำหรับรุ่นเฉพาะ ตามที่อธิบายไว้ในคำจำกัดความข้างต้นคอลเลกชันของรุ่นทั้งหมดที่คุณมีให้สำหรับเวอร์ชันเฉพาะของแอปของคุณเรียกว่า "การฝึกรุ่น" ของเวอร์ชันนั้น สำหรับแอป iOS หมายเลขบิวด์จะต้องไม่ซ้ำกันในแต่ละขบวนแต่ไม่จำเป็นต้องไม่ซ้ำกันในรถไฟรุ่นต่างๆ [เน้นของฉัน] กล่าวคือสำหรับแอป iOS คุณสามารถใช้หมายเลขบิลด์เดียวกันอีกครั้งในรถไฟรุ่นต่างๆได้หากต้องการ

จากหมายเหตุทางเทคนิค TN2420: หมายเลขเวอร์ชันและหมายเลขรุ่น


1
ยินดีที่จะเห็นคำตอบที่ให้ข้อมูลอ้างอิงอย่างเป็นทางการเพื่อยืนยันการตีความที่นำเสนอในคำตอบอื่น ๆ ในหน้านี้
user2067021

6

ผมใช้CFBundleVersionเพื่อบ่งชี้ถึงการสร้างภายในสำหรับCFBundleShortVersionString ฉันใช้เที่ยวบินทดสอบเพื่อส่งรุ่นสำหรับผู้ทดสอบของฉันดังนั้นความแตกต่างระหว่างพวกเขาจึงมีประโยชน์อย่างยิ่ง

เอกสารของ Apple ระบุว่า CFBundleVersion "ควรเป็นสตริงที่ประกอบด้วยจำนวนเต็ม3 จำนวนที่ไม่เป็นลบคั่นด้วยจุด" แต่จริงๆแล้วมันอาจมากกว่า 3 ส่วน (ตามที่คำตอบด้านบนแสดง) ฉันใช้สิ่งนั้นเพื่อระบุโครงสร้างการพัฒนาของฉันพูดว่า CFBundleShortVersionString ของฉันคือ 1.0.0 ฉันสามารถใช้ 1.0.0.11 สำหรับ CFBundleVersion เพื่อระบุว่าเป็นรุ่นที่ 11 ของฉันสำหรับรุ่น 1.0.0

CFBundleVersion แต่ละรายการที่ส่งไปยัง app store ควรมีขนาดใหญ่กว่าเดิมมิฉะนั้นคุณจะได้รับERROR ITMS-90478 : "เวอร์ชันไม่ถูกต้องไม่สามารถนำเข้าบิวด์ที่มีเวอร์ชัน" xxx "ได้เนื่องจากเวอร์ชันที่ใหม่กว่าถูกปิดสำหรับการส่งบิลด์ใหม่โปรดเลือก หมายเลขเวอร์ชันอื่น "

CFBundleShortVersionStringสามารถมีเพียง 3 ชิ้นส่วนหรือคุณจะได้รับข้อผิดพลาด ITMS-90060: ค่าสำหรับ CFBundleShortVersionString คีย์ 'xxx' ในไฟล์ Info.plist ต้องเป็นรายการที่คั่นของที่มากที่สุด . สาม integers เชิงลบ"

จำนวน 3ว่าเพรา Bourque กล่าวคือหมายเลขรุ่นแสดงบนiTunesConnectคือสิ่งที่อาจได้รับความซับซ้อน

ฉันใช้หมายเลข iTunesConnect ที่แตกต่างจากCFBundleShortVersionStringเนื่องจากเมื่อฉันส่งแอปไปยังร้านแอปครั้งแรกเรามีการเผยแพร่ภายในหลายรอบอยู่แล้ว ดังนั้นฉันจึงใช้ 1.0 สำหรับหมายเลข iTunesConnect และ 5.x สำหรับ CFBundleShortVersionString ในแอพสโตร์รุ่นถัดไปฉันได้จัดเตรียมฟังก์ชันเพื่อตรวจสอบว่ามีเวอร์ชันใหม่กว่าในแอพสโตร์หรือไม่และตระหนักว่าตอนนี้ฉันมีปัญหาเพราะฉันสามารถรับหมายเลข iTunesConnect ได้เท่านั้น (โดยใช้http://itunes.apple.com/lookup?bundleId=) ดังนั้นฉันต้องทำการคำนวณก่อนที่จะเปรียบเทียบ ด้วยหมายเลข CFBundleShortVersionString

ฉันพยายามแก้ไขโดยใช้หมายเลข iTunesConnect เป็น CFBundleShortVersionString ของฉัน แต่พบข้อผิดพลาดERROR ITMS-90062 : "บันเดิลนี้ไม่ถูกต้องค่าสำหรับคีย์ CFBundleShortVersionString [xxx] ในไฟล์ Info.plist ต้องมีเวอร์ชันที่สูงกว่านั้น ของเวอร์ชันที่ได้รับการอนุมัติก่อนหน้านี้ [xxx] "

ดังนั้นฉันจะแนะนำให้ทำให้เหมือนกันเสมอ


5

สิ่งที่ฉันไม่เคยเห็นมาก่อนคือจำนวนสูงสุดสำหรับแต่ละฟิลด์ใน CFBundleVersion คือเท่าใด

ด้วยการตั้งค่า CFBundleVersion ในแอปเป็น 1.1.1 และดูค่าเลขฐานสิบหกสำหรับเวอร์ชันใน "lsregister -dump" ฉันพิจารณาแล้วว่าค่าสูงสุดสำหรับฟิลด์แรกคือ (2 ^ 22) -1 หรือ 4194303 และค่าสูงสุด ค่าสำหรับฟิลด์ที่สองและสามคือ (2 ^ 21) -1 หรือ 2097151

ช่อง 3 รวมกันได้สูงสุด 64 บิต

สิ่งนี้มีผลสำหรับพวกเราที่ใช้ CFBundleVersion ตามวันที่และเวลา

ฉันตั้งค่าฟิลด์แรกเป็น YYYYMMDD สิ่งนี้มากกว่าเวอร์ชันสูงสุดที่อนุญาตเสมอและนำไปสู่ผลลัพธ์ที่ไม่สามารถคาดเดาได้กล่าวอย่างน้อยที่สุดคือเมื่อ Launch Services กำลังตัดสินใจว่าจะเรียกใช้แอปเวอร์ชันใดเมื่อคุณติดตั้งหลายเวอร์ชันและใช้สิ่งต่างๆเช่น 'open -a Appname 'จากบรรทัดคำสั่ง

โปรดเผยแพร่สิ่งนี้ให้กว้างขวาง ฉันแน่ใจว่ามีคนจำนวนมากไม่พอใจกับเรื่องนี้


คุณจำสิ่งที่เกิดขึ้นได้หรือไม่หากมีการเพิ่มฟิลด์ที่สี่ (1.1.1.20191201) และสิ่งที่คุณใช้แทน ฉันหวังว่า Apple จะใช้ค่าตัวเลขเดียวกับที่ Android ทำที่นี่ ปล. ขอบคุณที่ค้นหาสิ่งนี้!
spacesuitdiver

ฉันเชื่อว่ามีการบันทึกข้อ จำกัด ไว้ที่นี่และค่อนข้างเข้มงวดกว่าที่กล่าวไว้ที่นี่
saagarjha

4

ณ ตอนนี้เอกสารของ Apple สำหรับCFBundleVersionรัฐ [เน้นของฉัน]:

เวอร์ชันบิวด์ที่ระบุการวนซ้ำของบันเดิล

...

คีย์นี้เป็นสตริงที่เครื่องอ่านได้ซึ่งประกอบด้วยจำนวนเต็มที่คั่นด้วยจุดหนึ่งถึงสามเช่น 10.14.1 สตริงสามารถมีได้เฉพาะอักขระตัวเลข (0-9) และจุด

...

คุณสามารถรวมจำนวนเต็มเพิ่มเติมได้ แต่ระบบไม่สนใจ

สำหรับCFBundleShortVersionString[เน้นเหมือง]:

หมายเลขรุ่นหรือเวอร์ชันของบันเดิล

...

คีย์นี้เป็นสตริงที่ผู้ใช้มองเห็นได้สำหรับเวอร์ชันของบันเดิล รูปแบบที่ต้องการคือจำนวนเต็มที่คั่นด้วยจุดสามจุดเช่น 10.14.1 สตริงสามารถมีได้เฉพาะอักขระตัวเลข (0-9) และจุด

ฉันขอแนะนำให้เพิ่มโดยอัตโนมัติCFBundleVersionสำหรับแต่ละรุ่น (หรือทุกรุ่นเป็น TestFlight) และรีเซ็ตเป็น 0 เมื่อใดก็ตามที่คุณเปลี่ยนCFBundleShortVersionStringเมื่อใดก็ตามที่คุณเปลี่ยน

CFBundleShortVersionStringคุณอย่างชัดเจนควรวางแผนหรือประดิษฐ์วิธีการที่สอดคล้องกันในการปรับปรุงรุ่นที่มองเห็นของผู้ใช้ใน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.