ฉันจะรับค่าของทางโปรแกรมได้target versionอย่างไรเช่นในภาพด้านล่าง
ดังที่เห็นในหน้าต่างคุณสมบัติของเป้าหมายของโครงการ Xcode ของฉัน ฉันต้องการแสดงสิ่งนี้ในหน้าจอเริ่มต้นของแอปของฉันเพื่อที่ฉันจะได้ทราบว่าผู้คนกำลังใช้เวอร์ชันใดอยู่
ฉันจะรับค่าของทางโปรแกรมได้target versionอย่างไรเช่นในภาพด้านล่าง
ดังที่เห็นในหน้าต่างคุณสมบัติของเป้าหมายของโครงการ Xcode ของฉัน ฉันต้องการแสดงสิ่งนี้ในหน้าจอเริ่มต้นของแอปของฉันเพื่อที่ฉันจะได้ทราบว่าผู้คนกำลังใช้เวอร์ชันใดอยู่
คำตอบ:
มี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สิ่งต่อไปนี้:



Bundle.main.object(forInfoDictionaryKey: "...")ตอนนี้
                    คุณไม่จำเป็นต้องเปลี่ยนแปลงอะไรในโครงการหรือ Xcode ของคุณ นี่คือเวอร์ชัน Swift สำหรับทั้งสองแบบแยกกัน:
let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String
รวมอยู่ใน repo นี้โปรดตรวจสอบ:
Bundle.main.object(forInfoDictionaryKey: "...")ตอนนี้
                    นี่คือรหัสเดียวกันสำหรับ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)มีค่าที่คาดหวัง
                    แสดงเวอร์ชันและหมายเลขบิลด์ทางโปรแกรม - 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) )"
    คุณยังสามารถใช้เช่น
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)
    ฉันสร้างส่วนขยายสำหรับ 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")"
    }
}