ฉันจะรับค่าของทางโปรแกรมได้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")"
}
}