Bagaimana cara saya mendapatkan kode proyek iOS versi saya saat ini?


151

Saya ingin bisa mendapatkan versi proyek / aplikasi iOS saya saat ini sebagai NSStringobjek tanpa harus menentukan konstanta dalam file di suatu tempat. Saya tidak ingin mengubah nilai versi saya di 2 tempat.

Nilai perlu diperbarui ketika saya menabrak versi saya di ringkasan target proyek.

Jawaban:


381

Anda bisa mendapatkan versi dan membangun nomor sebagai berikut:

let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let build = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String

atau di Objective-C

NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"];
NSString * build = [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey];

Saya memiliki metode berikut dalam kategori di 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))"
    }
}

Intisari: https://gist.github.com/ashleymills/6ec9fce6d7ec2a11af9b


Berikut ini persamaan di 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;
}

Intisari: https://gist.github.com/ashleymills/c37efb46c9dbef73d5dd


1
Anda dapat menggunakan objek [[NSBundle mainBundle] iniUntukInfoDictionaryKey: @ "CFBundleVersion"] alih-alih [[NSBundle mainBundle] objekUntukInfoDictionaryKey: (NSString *) kCFBundleVersionKey] .Pemula tampaknya memiliki rhasi baik dengan kata kunci: ]; jadi Sekarang menjadi mudah untuk diingat
Durai Amuthan. H

4
@Duraiamuthan Saya sarankan menggunakan (NSString *)kCFBundleVersionKeydaripada @"CFBundleVersion". Meskipun lebih lama untuk mengetik (pelengkapan otomatis akan membantu di sini), karena ini adalah konstanta yang diperiksa pada waktu kompilasi.
Ashley Mills

Namun, akan lebih akurat untuk menjadikan ekstensi ini aktif, NSBundlealih-alih UIApplicationini juga akan memungkinkan untuk mengganti panggilan statis dengan panggilan instan.
Zapko

@ Zapko - Dengan hormat saya tidak setuju. Secara konseptual ini cocok dengan UIApplication, karena informasi yang dikembalikan adalah tentang aplikasi. Juga, ini hanya berlaku untuk mainbundel - tidak masuk akal untuk menjadikan ini metode instan pada bundel apa pun.
Ashley Mills

Apakah maksud Anda buildketika Anda mengatakan appBundle(pada baris kedua kode Anda)?
user1046037

14

Inilah yang bekerja pada 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

Dalam Tujuan C:

1) Untuk mendapatkan versi Aplikasi Anda harus menggunakan:

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

2) Untuk mendapatkan versi Build Anda harus menggunakan:

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

1

Di Swift, Anda bisa mendapatkan versi bundel dengan menggunakan:

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

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

versionLabel.text = "Version:" + version

0

Proyek sumber terbuka milik saya, Pelacak Pembaruan Aplikasi , menawarkan fungsionalitas ini (dan banyak lagi) dalam bentuk metode kelas:

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

Anda akan menggunakannya seperti ini:

#import "AppUpdateTracker.h"

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

0

Hanya untuk dicatat

Untuk mendapatkan nilai lokal dari kunci apa pun yang harus Anda gunakan CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)


-1

Jadi inilah versi Swift untuk keduanya secara terpisah:

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

Termasuk dalam repo ini, lihat:

https://github.com/goktugyil/EZSwiftExtensions


CFBundleVersionKey tidak lagi bekerja di Xcode 8 dan Swift 3. Apakah Anda tahu kunci baru?
Crashalot

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.