วิธีการแสดงเวอร์ชัน / สร้างจำนวนเป้าหมายในแอป iOS โดยทางโปรแกรม


136

ฉันจะรับค่าของทางโปรแกรมได้target versionอย่างไรเช่นในภาพด้านล่าง

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

คำตอบ:


396

มี2เบอร์!

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

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


ในการรับหมายเลขเวอร์ชัน :

วัตถุประสงค์ -C:

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

สวิฟต์ <3.0:

let appVersionString: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String

Swift 3.0+ (ทดสอบด้วย 5.0):

let appVersionString: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String

ที่จะได้รับการสร้างจำนวน:

วัตถุประสงค์ -C:

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

สวิฟต์ <3.0:

let buildNumber: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String

Swift 3.0+ (ทดสอบจนถึง 5.0):

let buildNumber: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String   

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

ขั้นแรกให้ใช้บรรทัดด้านบนแล้วจึงใช้บรรทัดต่อไปนี้

วัตถุประสงค์ -C:

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

Swift (ทดสอบจนถึง 5.0):

let versionAndBuildNumber: String = "\(appVersionString) (\(buildNumber))"

หมายเหตุ:

ไม่มีค่าในบันเดิลหลักเสมอไปตัวอย่างเช่นในแอ็พพลิเคชันบรรทัดคำสั่งไม่มีCFBundleShortVersionStringหรือCFBundleVersionดังนั้นวิธีการจะส่งคืนnilและจะหยุดทำงานเนื่องจากในโค้ดทำให้ดาวน์แคสต์ไม่ถูกต้อง แต่ในแอป Cocoa iOS และ Mac ปกติจะมีการกำหนดค่าเหล่านี้และจะไม่ถูกลบ

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

การสร้าง


ใน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"

สำหรับ Xcodeสิ่งต่อไปนี้:

ขั้นตอนที่ 1

ขั้นตอนที่ 1

ขั้นตอนที่ 2

ขั้นตอนที่ 2

ขั้นตอนที่ 3

ขั้นที่ 3


4
เพื่อเพิ่มสำหรับตัวอย่างข้างต้น "CFBundleVersion" คือ Build = 300 "CFBundleShortVersionString" คือ Version = 0.41 คำตอบของ Viktor ควรเป็นคำตอบที่ถูกต้อง
justinkoh

1
ฉันมีปัญหากับเลขฐานสิบหกหนึ่งครั้ง Apple ระบุให้ใช้จำนวนเต็ม: developer.apple.com/library/ios/documentation/general/Reference/…
hashier

คุณทราบหรือไม่ว่ามีค่าคงที่สตริงสำหรับ @ "CFBundleShortVersionString" และ @ "CFBundleVersion" หรือไม่
igrek

ตอนนี้ระบบ CI / CD เป็นเรื่องธรรมดาคุณอาจต้องการชี้ให้เห็นข้อผิดพลาดของการใช้ build scripts เพื่อตั้งค่าเวอร์ชัน # กับสิ่งเหล่านี้
Sam Ballantyne

1
สิ่งต่างๆถูกเปลี่ยนชื่อเป็น Swift 3.0: Bundle.main.object(forInfoDictionaryKey: "...")ตอนนี้
Raphael

13

คุณไม่จำเป็นต้องเปลี่ยนแปลงอะไรในโครงการหรือ Xcode ของคุณ นี่คือเวอร์ชัน Swift สำหรับทั้งสองแบบแยกกัน:

let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String

รวมอยู่ใน repo นี้โปรดตรวจสอบ:

https://github.com/goktugyil/EZSwiftExtensions


คำตอบไหน? ฉันไม่เห็น
Esqarrouth

มีเพียงคำตอบเดียวอยู่ในย่อหน้าที่สองของเขา
Daniel Galasko

3
ใช่ 1. มีสัญญาณรบกวนมากเกินไปและไม่ค่อยมีสัญญาณในคำตอบของเขา 2. นี่คือความรวดเร็วนั่นคือวัตถุประสงค์ -c 3. จากยุค ios5
Esqarrouth

สิ่งต่างๆถูกเปลี่ยนชื่อเป็น Swift 3.0: Bundle.main.object(forInfoDictionaryKey: "...")ตอนนี้
Raphael

5

นี่คือรหัสเดียวกันสำหรับSwift 3 :

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String

Bundle.mainมีความว่างเปล่าinfoDictionaryสำหรับฉัน อาจเป็นเพราะฉันทำจากภายในกรอบไม่ใช่ปฏิบัติการหรือแอป? Bundle(for: MyClass.self)มีค่าที่คาดหวัง
Raphael

4

แสดงเวอร์ชันและหมายเลขบิลด์ทางโปรแกรม - Swift 4.0

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"

let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"            

let versionAndBuildNumber = "Ver #\(versionNumber) ( Build #\(buildNumber) )"

1

คุณยังสามารถใช้เช่น

var appVersion: String {
  //versionNumber
  let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"

  //buildNumber
  let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"

  return "Version: #\(versionNumber) (#\(buildNumber))"
}

จากนั้นคุณสามารถใช้ที่ใดก็ได้เมื่อคุณประกาศทั่วโลก

print(appVersion)

เอาท์พุต:

Version: #1.0 (#1.0.3)

1

ฉันสร้างส่วนขยายสำหรับ Bundle เพื่อให้ใช้งานได้ง่าย

extension Bundle {
    var releaseVersionNumber: String? {
        return infoDictionary?["CFBundleShortVersionString"] as? String
    }

    var buildVersionNumber: String? {
        return infoDictionary?["CFBundleVersion"] as? String
    }

    var applicationName: String {
        return infoDictionary?["CFBundleDisplayName"] as? String ?? "ADKATech"
    }

    var applicationReleaseDate: String {
        return infoDictionary?["ApplicationReleaseDate"] as? String ?? Date().description
    }

    var applicationReleaseNumber: Int {
        return infoDictionary?["ApplicationReleaseNumber"] as? Int ?? 0
    }

    var releaseVersionNumberPretty: String {
        return "\(releaseVersionNumber ?? "1.0.0")"
    }

    var buildVersionNumberPretty: String {
        return "\(buildVersionNumber ?? "1")"
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.