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.