ฉันจะรับโปรเจ็กต์ iOS เวอร์ชันปัจจุบันของฉันในโค้ดได้อย่างไร


151

ฉันต้องการรับโครงการ iOS / แอปเวอร์ชันปัจจุบันของฉันเป็นNSStringวัตถุโดยไม่ต้องกำหนดค่าคงที่ในไฟล์ที่อื่น ฉันไม่ต้องการเปลี่ยนค่าเวอร์ชั่นของฉันใน 2 แห่ง

ค่าจำเป็นต้องได้รับการปรับปรุงเมื่อฉันชนรุ่นของฉันในการสรุปเป้าหมายโครงการ

คำตอบ:


381

คุณสามารถรับรุ่นและหมายเลขบิลด์ดังนี้:

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


1
คุณสามารถใช้ [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleVersion"] แทนที่จะเป็น [[NSBundle mainBundle] ObjectForInfoDictionaryKey: (NSString *) kCFBundleVersionKey] ]; ดังนั้นตอนนี้มันกลายเป็นเรื่องง่ายที่จะเก็บไว้ในความทรงจำ
Durai Amuthan.H

4
@Duraiamuthan ฉันขอแนะนำให้ใช้มากกว่า(NSString *)kCFBundleVersionKey @"CFBundleVersion"แม้ว่าจะพิมพ์นานกว่า (การทำให้สมบูรณ์อัตโนมัติจะช่วยได้ที่นี่) เนื่องจากเป็นค่าคงที่มันจะถูกตรวจสอบในเวลารวบรวม
Ashley Mills

Btw จะมีความแม่นยำมากขึ้นในการทำให้ส่วนขยายนี้NSBundleแทนที่จะเป็นการUIApplicationอนุญาตให้แทนที่การโทรแบบคงที่ด้วยอินสแตนซ์
Zapko

@Zapko - ฉันไม่เห็นด้วยอย่างเคารพ แนวคิดนี้สอดคล้องกับUIApplicationข้อมูลที่ส่งคืนเป็นเรื่องเกี่ยวกับแอปพลิเคชัน นอกจากนี้สิ่งนี้ใช้ได้กับmainบันเดิลเท่านั้น - มันไม่มีเหตุผลที่จะทำให้นี่เป็นวิธีอินสแตนซ์สำหรับบันเดิลใด ๆ
Ashley Mills

คุณหมายถึงbuildเมื่อคุณพูดappBundle(ในบรรทัดที่ 2 ของรหัสของคุณ)?
user1046037

14

นี่คือสิ่งที่ทำงานกับ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)")

3

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

1) ในการรับเวอร์ชั่นของแอปคุณต้องใช้:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];

2) ในการรับเวอร์ชั่น Build คุณต้องใช้:

NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; 

1

ใน Swift คุณสามารถรับเวอร์ชันของบันเดิลโดยใช้:

let info:NSDictionary = NSBundle.mainBundle().infoDictionary!

let version:String = info.objectForKey("CFBundleShortVersionString") as! String

versionLabel.text = "Version:" + version

0

โปรเจ็กต์โอเพนซอร์สของฉัน, App Update Tracker , มีฟังก์ชั่นนี้ (และอื่น ๆ ) ในรูปแบบของวิธีการเรียน:

  • + (NSString *)getShortVersionString
  • + (NSString *)getLongVersionString

คุณจะใช้มันเช่น:

#import "AppUpdateTracker.h"

NSLog(@"short version: %@", [AppUpdateTracker getShortVersionString]);
NSLog(@"long version: %@", [AppUpdateTracker getLongVersionString]);

0

เพียงเพื่อทราบ

ในการรับค่าที่แปลเป็นภาษาท้องถิ่นของคีย์ใด ๆ ที่คุณควรใช้ CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)


-1

ดังนั้นนี่คือเวอร์ชั่น Swift สำหรับทั้งสองอย่างนี้ต่างหาก:

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

มันรวมอยู่ใน repo นี้ลองดู:

https://github.com/goktugyil/EZSwiftExtensions


CFBundleVersionKey ไม่ทำงานบน Xcode 8 และ Swift 3 คุณรู้จักรหัสใหม่หรือไม่
Crashalot

นี่คือข้อมูลล่าสุด: github.com/goktugyil/EZSwiftExtensions/blob/…
Esqarrouth
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.