ฉันต้องการรับโครงการ iOS / แอปเวอร์ชันปัจจุบันของฉันเป็นNSString
วัตถุโดยไม่ต้องกำหนดค่าคงที่ในไฟล์ที่อื่น ฉันไม่ต้องการเปลี่ยนค่าเวอร์ชั่นของฉันใน 2 แห่ง
ค่าจำเป็นต้องได้รับการปรับปรุงเมื่อฉันชนรุ่นของฉันในการสรุปเป้าหมายโครงการ
ฉันต้องการรับโครงการ iOS / แอปเวอร์ชันปัจจุบันของฉันเป็นNSString
วัตถุโดยไม่ต้องกำหนดค่าคงที่ในไฟล์ที่อื่น ฉันไม่ต้องการเปลี่ยนค่าเวอร์ชั่นของฉันใน 2 แห่ง
ค่าจำเป็นต้องได้รับการปรับปรุงเมื่อฉันชนรุ่นของฉันในการสรุปเป้าหมายโครงการ
คำตอบ:
คุณสามารถรับรุ่นและหมายเลขบิลด์ดังนี้:
let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let build = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String
หรือใน Objective-C
NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"];
NSString * build = [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey];
ฉันมีวิธีการดังต่อไปนี้ในหมวดหมู่เมื่อUIApplication
:
extension UIApplication {
static var appVersion: String {
return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
}
static var appBuild: String {
return Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String
}
static var versionBuild: String {
let version = appVersion, build = appBuild
return version == build ? "v\(version)" : "v\(version)(\(build))"
}
}
สรุปสาระสำคัญ: https://gist.github.com/ashleymills/6ec9fce6d7ec2a11af9b
นี่เทียบเท่าใน Objective-C:
+ (NSString *) appVersion
{
return [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"];
}
+ (NSString *) build
{
return [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey];
}
+ (NSString *) versionBuild
{
NSString * version = [self appVersion];
NSString * build = [self build];
NSString * versionBuild = [NSString stringWithFormat: @"v%@", version];
if (![version isEqualToString: build]) {
versionBuild = [NSString stringWithFormat: @"%@(%@)", versionBuild, build];
}
return versionBuild;
}
สรุปสาระสำคัญ: https://gist.github.com/ashleymills/c37efb46c9dbef73d5dd
(NSString *)kCFBundleVersionKey
@"CFBundleVersion"
แม้ว่าจะพิมพ์นานกว่า (การทำให้สมบูรณ์อัตโนมัติจะช่วยได้ที่นี่) เนื่องจากเป็นค่าคงที่มันจะถูกตรวจสอบในเวลารวบรวม
NSBundle
แทนที่จะเป็นการUIApplication
อนุญาตให้แทนที่การโทรแบบคงที่ด้วยอินสแตนซ์
UIApplication
ข้อมูลที่ส่งคืนเป็นเรื่องเกี่ยวกับแอปพลิเคชัน นอกจากนี้สิ่งนี้ใช้ได้กับmain
บันเดิลเท่านั้น - มันไม่มีเหตุผลที่จะทำให้นี่เป็นวิธีอินสแตนซ์สำหรับบันเดิลใด ๆ
build
เมื่อคุณพูดappBundle
(ในบรรทัดที่ 2 ของรหัสของคุณ)?
นี่คือสิ่งที่ทำงานกับXcode 8, Swift 3:
let gAppVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "0"
let gAppBuild = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "0"
print("Version: \(gAppVersion)")
print("Build: \(gAppBuild)")
ในวัตถุประสงค์ C:
1) ในการรับเวอร์ชั่นของแอปคุณต้องใช้:
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
2) ในการรับเวอร์ชั่น Build คุณต้องใช้:
NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
ใน Swift คุณสามารถรับเวอร์ชันของบันเดิลโดยใช้:
let info:NSDictionary = NSBundle.mainBundle().infoDictionary!
let version:String = info.objectForKey("CFBundleShortVersionString") as! String
versionLabel.text = "Version:" + version
โปรเจ็กต์โอเพนซอร์สของฉัน, App Update Tracker , มีฟังก์ชั่นนี้ (และอื่น ๆ ) ในรูปแบบของวิธีการเรียน:
+ (NSString *)getShortVersionString
+ (NSString *)getLongVersionString
คุณจะใช้มันเช่น:
#import "AppUpdateTracker.h"
NSLog(@"short version: %@", [AppUpdateTracker getShortVersionString]);
NSLog(@"long version: %@", [AppUpdateTracker getLongVersionString]);
เพียงเพื่อทราบ
ในการรับค่าที่แปลเป็นภาษาท้องถิ่นของคีย์ใด ๆ ที่คุณควรใช้ CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)
ดังนั้นนี่คือเวอร์ชั่น Swift สำหรับทั้งสองอย่างนี้ต่างหาก:
let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String
มันรวมอยู่ใน repo นี้ลองดู: