รุ่นเทียบกับการสร้างใน Xcode


660

ฉันมีแอพที่ฉันพัฒนาด้วย Xcode 3 และเพิ่งเริ่มแก้ไขด้วย Xcode 4 ในสรุปเป้าหมายฉันมีแบบฟอร์มเป้าหมายแอปพลิเคชัน iOS ที่มีฟิลด์: ตัวระบุรุ่นสร้างอุปกรณ์และเป้าหมายการปรับใช้ ฟิลด์เวอร์ชั่นว่างเปล่าและฟิลด์บิลด์เป็น 3.4.0 (ซึ่งตรงกับเวอร์ชั่นของแอพตั้งแต่ตอนที่ฉันยังแก้ไขด้วย Xcode 3)

คำถามของฉันคือ:

  1. ความแตกต่างระหว่างรุ่นและเขตข้อมูลสร้างคืออะไร?

  2. ทำไมฟิลด์รุ่นว่างเปล่าหลังจากฉันอัพเกรดเป็น Xcode 4


อย่างหนึ่งฉันคิดว่ามันเป็นหมายเลข Build ที่แสดงในรายการเก็บถาวร Xcode Organizer นอกจากนั้นฉันไม่แน่ใจว่ามันใช้ทำอะไร
Daniel Dickison

คำตอบ:


1224

แอปเปิ้ลจัดเรียงใหม่ / repurposed ฟิลด์

หากคุณมองไปที่แท็บข้อมูลสำหรับเป้าหมายแอปพลิเคชันของคุณคุณควรใช้สตริง "Bundle version, short" เป็นเวอร์ชันของคุณ (เช่น 3.4.0) และ "Bundle version" เป็น Build ของคุณ (เช่น 500 หรือ 1A500 ) หากคุณไม่เห็นพวกเขาทั้งคู่คุณสามารถเพิ่มพวกเขาได้ สิ่งเหล่านี้จะจับคู่กับกล่องข้อความรุ่นและสร้างที่เหมาะสมบนแท็บสรุป พวกเขาเป็นค่าเดียวกัน

เมื่อดูแท็บข้อมูลหากคุณคลิกขวาและเลือกแสดงคีย์ / ค่าดิบคุณจะเห็นชื่อจริงคือCFBundleShortVersionString(เวอร์ชั่น) และCFBundleVersion(Build)

ปกติแล้วเวอร์ชันจะถูกใช้ในลักษณะที่คุณใช้กับ Xcode 3 ฉันไม่แน่ใจในระดับที่คุณถามเกี่ยวกับความแตกต่างของ Version / Build ดังนั้นฉันจะตอบคำถามตามหลักปรัชญา

มีแผนการทุกประเภท แต่ที่เป็นที่นิยมคือ:

{MajorVersion}. {MinorVersion}. {} ทบทวน

  • รุ่นหลัก - การเปลี่ยนแปลงที่สำคัญการออกแบบใหม่และการเปลี่ยนแปลงการทำงาน
  • รุ่นรอง - การปรับปรุงเล็กน้อยการเพิ่มฟังก์ชัน
  • Revision - หมายเลขแพตช์สำหรับแก้ไขข้อบกพร่อง

จากนั้น Build จะใช้แยกต่างหากเพื่อระบุจำนวนการสร้างทั้งหมดสำหรับการเปิดตัวหรือตลอดอายุการใช้งานของผลิตภัณฑ์ทั้งหมด

นักพัฒนาหลายคนเริ่มสร้างหมายเลขที่ 0 และทุกครั้งที่สร้างพวกเขาจะเพิ่มจำนวนทีละหนึ่งเพิ่มขึ้นตลอดไป ในโครงการของฉันฉันมีสคริปต์ที่เพิ่มหมายเลขการสร้างโดยอัตโนมัติทุกครั้งที่ฉันสร้าง ดูคำแนะนำสำหรับด้านล่าง

  • 1.0.0 ที่วางจำหน่ายอาจจะสร้าง 542 มันต้องใช้ 542 สร้างที่จะได้รับการปล่อย 1.0.0
  • รุ่น 1.0.1 อาจจะสร้าง 578
  • รุ่น 1.1.0 อาจจะสร้าง 694
  • รุ่น 2.0.0 อาจเป็นรุ่น 949

นักพัฒนาอื่น ๆ รวมถึง Apple มีหมายเลข Build ซึ่งประกอบด้วยรุ่นหลัก + รุ่นรอง + จำนวนรุ่นสำหรับรุ่น เหล่านี้เป็นหมายเลขรุ่นซอฟต์แวร์จริงซึ่งตรงข้ามกับค่าที่ใช้สำหรับการตลาด

หากคุณไปที่เมนูXcode > เกี่ยวกับ Xcodeคุณจะเห็นหมายเลขเวอร์ชันและ Build หากคุณกดปุ่มข้อมูลเพิ่มเติม ...คุณจะเห็นเวอร์ชั่นต่าง ๆ มากมาย เนื่องจากข้อมูลเพิ่มเติม ...ปุ่มถูกลบออกใน Xcode 5 ข้อมูลนี้ยังสามารถใช้ได้จากซอฟท์แว> นักพัฒนาส่วนหนึ่งของระบบสารสนเทศแอปที่มีอยู่โดยการเปิดแอปเปิ้ลเมนู> เกี่ยวกับ Mac นี้ > รายงานระบบ ...

ตัวอย่างเช่น Xcode 4.2 (4C139) เวอร์ชันการตลาด 4.2 คือบิวด์เวอร์ชันหลัก 4, บิวด์เวอร์ชันรอง C, และบิวด์หมายเลข 139 รุ่นถัดไป (สันนิษฐาน 4.3) น่าจะเป็นรุ่นบิลด์ 4D และหมายเลขบิลด์จะเริ่มใหม่ที่ 0 และเพิ่มขึ้นจากที่นั่น

หมายเลขเวอร์ชั่น / Build ของ iPhone Simulator เป็นวิธีเดียวกันกับ iPhone, Macs และอื่น ๆ

  • 3.2: (7W367a)
  • 4.0: (8A400)
  • 4.1: (8B117)
  • 4.2: (8C134)
  • 4.3: (8H7)

อัปเดต : ตามคำขอนี่คือขั้นตอนในการสร้างสคริปต์ที่ทำงานทุกครั้งที่คุณสร้างแอปของคุณใน Xcode เพื่ออ่านหมายเลข Build เพิ่มขึ้นและเขียนกลับไปยัง{App}-Info.plistไฟล์ของแอป มีขั้นตอนเพิ่มเติมที่เป็นตัวเลือกหากคุณต้องการเขียนหมายเลขรุ่น / บิลด์ลงในSettings.bundle/Root*.plistไฟล์ของคุณ

นี้จะยื่นออกมาจากวิธีการบทความที่นี่

ใน Xcode 4.2 - 5.0:

  1. โหลดโครงการ Xcode ของคุณ
  2. ในบานหน้าต่างด้านซ้ายคลิกที่โครงการของคุณที่ด้านบนสุดของลำดับชั้น สิ่งนี้จะโหลดเครื่องมือแก้ไขการตั้งค่าโครงการ
  3. ทางด้านซ้ายมือของบานหน้าต่างหน้าต่างศูนย์คลิกบนแอปของคุณภายใต้เป้าหมายหัวข้อ คุณจะต้องกำหนดค่าการตั้งค่านี้สำหรับเป้าหมายแต่ละโครงการ
  4. เลือกแท็บBuild Phases
    • ใน Xcode 4 ที่ด้านล่างขวาคลิกเพิ่มรูปร่างเฟสและเลือกเพิ่มเรียกใช้สคริปต์
    • ใน Xcode 5 เลือกเมนูตัวแก้ไข > เพิ่มเฟสบิลด์ > เพิ่มเฟสรันสคริปต์บิลด์
  5. ลากแล้วปล่อยขั้นตอนการเรียกใช้สคริปต์ใหม่เพื่อย้ายไปข้างหน้าขั้นตอนการคัดลอกทรัพยากรบันเดิล (เมื่อไฟล์ app-info.plist จะถูกรวมกับแอปของคุณ)
  6. ในใหม่เรียกใช้สคริปต์ขั้นตอนการตั้งค่าเชลล์/bin/bash :
  7. คัดลอกและวางข้อมูลต่อไปนี้ลงในพื้นที่สคริปต์สำหรับหมายเลขบิลด์ที่เป็นจำนวนเต็ม:

    buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
    buildNumber=$(($buildNumber + 1))
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
    

    @Bdebeez ชี้ให้เห็นว่าApple Generic Versioning Tool ( agvtool) ก็มีให้เช่นกัน หากคุณต้องการใช้งานแทนมีหลายสิ่งที่จะต้องเปลี่ยนก่อน:

    • เลือกแท็บBuild Settings
    • ภายใต้รุ่นส่วนกำหนดโครงการรุ่นปัจจุบันเป็นรุ่นจำนวนเริ่มต้นที่คุณต้องการใช้งานเช่น1
    • กลับไปที่แท็บBuild Phasesแล้วลากและวางสคริปต์ RunของคุณหลังจากเฟสCopy Bundle Resourcesเพื่อหลีกเลี่ยงสภาวะการแย่งชิงเมื่อพยายามสร้างและอัปเดตไฟล์ต้นฉบับที่มีหมายเลขบิลด์ของคุณ

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

    อย่างไรก็ตามในช่วงRun Script ของคุณคุณสามารถใช้สคริปต์ต่อไปนี้:

    "${DEVELOPER_BIN_DIR}/agvtool" next-version -all

    next-versionเพิ่มขึ้นโต้แย้งสร้างจำนวน ( bumpยังเป็นนามแฝงสำหรับสิ่งเดียวกัน) และ-allการปรับปรุงInfo.plistที่มีหมายเลขการสร้างใหม่

  8. และหากคุณมีบันเดิลการตั้งค่าที่คุณแสดงเวอร์ชันและบิลด์คุณสามารถเพิ่มสิ่งต่อไปนี้ในตอนท้ายของสคริปต์เพื่ออัปเดตเวอร์ชันและบิลด์ หมายเหตุ: เปลี่ยนPreferenceSpecifiersค่าเพื่อให้ตรงกับการตั้งค่าของคุณ PreferenceSpecifiers:2หมายถึงดูรายการที่ดัชนี 2 ภายใต้PreferenceSpecifiersอาร์เรย์ในไฟล์ plist ของคุณดังนั้นสำหรับดัชนีที่ใช้ 0 นั่นคือการตั้งค่าอันดับที่ 3 ในอาร์เรย์

    productVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$INFOPLIST_FILE")
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root.plist
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root.plist

    หากคุณใช้agvtoolแทนการอ่านInfo.plistโดยตรงคุณสามารถเพิ่มสิ่งต่อไปนี้ในสคริปต์ของคุณแทน:

    buildNumber=$("${DEVELOPER_BIN_DIR}/agvtool" what-version -terse)
    productVersion=$("${DEVELOPER_BIN_DIR}/agvtool" what-marketing-version -terse1)
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root.plist
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root.plist
  9. และหากคุณมีแอพสากลสำหรับ iPad และ iPhone คุณสามารถตั้งค่าสำหรับไฟล์ iPhone:

    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root~iphone.plist    
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root~iphone.plist

17
"ในโครงการของฉันฉันมีสคริปต์ที่เพิ่มหมายเลขการสร้างโดยอัตโนมัติทุกครั้งที่ฉันสร้าง" - คุณสามารถแบ่งปันได้อย่างไร ขอบคุณสำหรับรายละเอียดคำตอบและสำหรับคำถามเดิม
Zsolt

2
@Andrews - ฉันอัปเดตคำตอบพร้อมรายละเอียดเกี่ยวกับสคริปต์สร้าง
nekno

9
ในการเพิ่มจำนวน Hex คุณสามารถใช้buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE") dec=$((0x$buildNumber)) buildNumber=$(($dec + 1)) hex=$(printf "%X" $buildNumber) /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $hex" "$INFOPLIST_FILE"
Alon Amir

8
กล่าวโดยย่อ: ไม่อนุญาตให้ใช้ HEX ใน AppStore
Nicolas Miari

3
(ผู้ใช้ Xcode 5 คน) คุณอาจต้องเปลี่ยนขั้นตอนที่ 5 เพื่ออ่าน: "จากแถบเมนูเลือกตัวแก้ไข -> เพิ่มเฟส Build -> เพิ่มเรียกใช้สคริปต์ Build Build เฟส"
Greg M. Krsak

72

(เพิ่งออกจากที่นี่เพื่อการอ้างอิงของฉันเอง) นี่จะแสดงเวอร์ชันและบิลด์สำหรับฟิลด์ "version" และ "build" ที่คุณเห็นในเป้าหมาย Xcode:

- (NSString*) version {
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    return [NSString stringWithFormat:@"%@ build %@", version, build];
}

ในสวิฟท์

func version() -> String {
    let dictionary = NSBundle.mainBundle().infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as? String
    let build = dictionary["CFBundleVersion"] as? String
    return "\(version) build \(build)"
}

2
OT: คุณมีการรั่วไหลในวิธีการของคุณ - คุณalloc/ initสตริงที่เก็บสตริง แต่คุณไม่ได้ปล่อยมัน บนวัตถุที่คุณกลับมาจากวิธีการที่คุณโดยทั่วไปควรใช้วิธีการอำนวยความสะดวกเพื่อสตริง autoreleased autoreleaseโดยอัตโนมัติหรือโทร อย่างใดอย่างหนึ่ง: return [NSString stringWithFormat:@"%@ build %@", version, build]; หรือ return [[[NSString alloc] initWithFormat:@"%@ build %@", version, build] autorelease];
nekno

1
ขอบคุณ @nekno เปลี่ยนคำตอบดังนั้นมันจึงเป็นมิตรกับ ARC หรือไม่ใช่ ARC
Dan Rosenstark

2
อาจดีกว่าถ้าใช้ค่าคงที่หากมี (เช่น kCFBundleVersionKey) เพื่อหลีกเลี่ยงการพิมพ์ผิด แม้ว่าฉันไม่สามารถหาหนึ่งสำหรับ "CFBundleShortVersionString" :)
DannyA

คุณมีข้อผิดพลาดในรหัสที่รวดเร็ว - คุณกำลังเรียก CFBundleShortVersionString สองครั้ง
Yariv Nissim

ขอบคุณ @ yar1vn ฉันซ่อมมันและไม่มันไม่ย้อนกลับ
Dan Rosenstark

53

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

ลองคิดดูสิ:

  • Build ( CFBundleVersion): จำนวนการสร้าง โดยปกติแล้วคุณจะเริ่มต้นที่ 1 และเพิ่มขึ้น 1 กับแต่ละบิลด์ของแอป มันช่วยให้สามารถเปรียบเทียบได้อย่างรวดเร็วว่า build ใดที่เป็นรุ่นล่าสุดและจะแสดงถึงความคืบหน้าของ codebase สิ่งเหล่านี้มีคุณค่าอย่างท่วมท้นเมื่อทำงานกับ QA และต้องแน่ใจว่ามีการบันทึกข้อบกพร่องกับสิ่งที่ถูกต้อง
  • เวอร์ชั่นการตลาด ( CFBundleShortVersionString): หมายเลขที่ผู้ใช้งานใช้เพื่อแสดงถึงแอพของคุณในเวอร์ชันนี้ โดยปกติแล้วจะเป็นไปตามโครงร่างเวอร์ชัน Major.minor (เช่น MyAwesomeApp 1.2) เพื่อให้ผู้ใช้ทราบว่ารุ่นใดเป็นรุ่นปรับปรุงการบำรุงรักษาที่มีขนาดเล็กลง

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

วิธีใช้:

  • ตั้งค่าโครงการของคุณใน Xcode ภายใต้การกำหนดเวอร์ชันเพื่อใช้ "Apple Generic"
  • ในอาคารผู้โดยสาร
    • agvtool new-version 1 (ตั้งค่าหมายเลข Build เป็น 1)
    • agvtool new-marketing-version 1.0 (ตั้งค่าเวอร์ชันการตลาดเป็น 1.0)

ดูหน้าคนagvtoolของข้อมูลที่ดีมากมาย


บทความอื่นเกี่ยวกับagvtool iPhone รุ่นง่ายแอพลิเคชันที่มี agvtool
Gon

25

สคริปต์สำหรับสร้างหมายเลขบิลด์ในคำตอบข้างต้นไม่ได้ผลสำหรับฉันถ้าหมายเลขบิลด์เป็นค่าเลขทศนิยมดังนั้นฉันจึงแก้ไขเล็กน้อย:

#!/bin/bash    
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=`echo $buildNumber +1|bc`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

21

จำนวนการเปิดตัวการตลาดสำหรับลูกค้าที่เรียกว่าหมายเลขรุ่น มันเริ่มต้นด้วย1.0และขึ้นไปสำหรับการปรับปรุงที่สำคัญในการ2.0 , 3.0 , สำหรับการปรับปรุงเล็กน้อย1.1 , 1.2และแก้ไขข้อผิดพลาดในการ1.0.1 , 1.0.2 หมายเลขนี้เน้นเกี่ยวกับรุ่นและคุณสมบัติใหม่

หมายเลขการสร้างเป็นส่วนใหญ่เลขที่ภายในของสร้างที่ได้ทำจนแล้ว แต่บางคนใช้ตัวเลขอื่น ๆ เช่นหมายเลขสาขาของที่เก็บ หมายเลขนี้ควรไม่ซ้ำกันเพื่อแยกความแตกต่างที่แตกต่างกันเกือบ builds เดียวกัน

อย่างที่คุณเห็นหมายเลขบิลด์นั้นไม่จำเป็นและขึ้นอยู่กับหมายเลขบิลด์ที่คุณต้องการใช้ ดังนั้นหากคุณอัปเดตXcodeเป็นรุ่นที่สำคัญการสร้างสนามเป็นที่ว่างเปล่า รุ่นฟิลด์อาจจะไม่ว่าง !.


ที่จะได้รับการสร้างจำนวนเป็นNSStringตัวแปร

NSString * appBuildString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];

วิธีรับหมายเลขเวอร์ชันเป็นNSStringตัวแปร:

NSString * appVersionString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];

หากคุณต้องการทั้งสองอย่างในที่เดียวNSString:

NSString * versionBuildString = [NSString stringWithFormat:@"Version: %@ (%@)", appVersionString, appBuildString];

นี้มีการทดสอบกับXcode เวอร์ชัน 4.6.3 (4H1503) หมายเลขบิลด์มักเขียนในวงเล็บ / วงเล็บปีกกา หมายเลขบิลด์เป็นเลขฐานสิบหกหรือทศนิยม

buildandversion


ในXcodeคุณสามารถเพิ่มหมายเลขบิลด์เป็นเลขทศนิยมโดยอัตโนมัติโดยวางสิ่งต่อไปนี้ในRun scriptเฟสบิลด์ในการตั้งค่าโครงการ

#!/bin/bash    
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

สำหรับหมายเลขบิลด์ฐานสิบหกให้ใช้สคริปต์นี้

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$((0x$buildNumber)) 
buildNumber=$(($buildNumber + 1)) 
buildNumber=$(printf "%X" $buildNumber)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

project_settings


6

ขอบคุณ @nekno และ @ ale84 สำหรับคำตอบที่ยอดเยี่ยม

อย่างไรก็ตามฉันปรับเปลี่ยนสคริปต์ของ @ ale84 เพียงเล็กน้อยเพื่อเพิ่มหมายเลขบิลด์สำหรับจุดลอย

ค่าของรวมสามารถเปลี่ยนแปลงได้ตามความต้องการรูปแบบลอยของคุณ ตัวอย่างเช่น: ถ้ารวม = 0.01 รูปแบบผลลัพธ์จะเป็น ... 1.19, 1.20, 1.21 ...

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
incl=.01
buildNumber=`echo $buildNumber + $incl|bc`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

1

อีกวิธีหนึ่งคือการตั้งค่าหมายเลขรุ่นในappDelegate didFinishLaunchingWithOptions:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
     NSString * ver = [self myVersion];
     NSLog(@"version: %@",ver);

     NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
     [userDefaults setObject:ver forKey:@"version"];
     return YES;
}

- (NSString *) myVersion {
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    return [NSString stringWithFormat:@"%@ build %@", version, build];
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.