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.

Jovan
sumber

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

Ashley Mills
sumber
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)")
Crashalot
sumber
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"]; 
Vaibhav Shiledar
sumber
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
Ravindra Kishan
sumber
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]);
Stunner
sumber
0

Hanya untuk dicatat

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

alias kualitas
sumber
-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

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