Come posso ottenere la versione corrente del mio progetto iOS nel codice?


152

Vorrei essere in grado di ottenere la versione corrente del mio progetto / app iOS come NSStringoggetto senza dover definire una costante in un file da qualche parte. Non voglio cambiare il valore della mia versione in 2 posti.

Il valore deve essere aggiornato quando eseguo il bump della mia versione nel riepilogo di destinazione del progetto.

Risposte:


382

Puoi ottenere la versione e costruire i numeri come segue:

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

o in Objective-C

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

Ho i seguenti metodi in una categoria su 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))"
    }
}

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


Ecco l'equivalente in 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;
}

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


1
È possibile utilizzare questo oggetto [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleVersion"] anziché [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *) kCFBundleVersionKey] L'Exer sembra rima bene con [NSBundleFundBundle]. ]; così ora è diventato facile da ricordare
Durai Amuthan.

4
@Duraiamuthan Consiglierei di utilizzare (NSString *)kCFBundleVersionKeypiuttosto che @"CFBundleVersion". Anche se è più lungo da digitare (il completamento automatico aiuterà qui), poiché è una costante che viene controllata al momento della compilazione.
Ashley Mills,

A proposito, sarebbe più accurato rendere questa estensione NSBundleinvece di UIApplicationquesta consentirà anche di sostituire le chiamate statiche con quelle dell'istanza.
Zapko,

@Zapko - Rispetto rispettosamente. Concettualmente questo si adatta UIApplication, poiché le informazioni restituite riguardano l'applicazione. Inoltre, questo vale solo per il mainbundle: non avrebbe senso rendere questo un metodo di istanza su qualsiasi bundle.
Ashley Mills,

Intendevi buildquando hai detto appBundle(nella seconda riga del tuo codice)?
user1046037

14

Ecco cosa ha funzionato su 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

Nell'obiettivo C:

1) Per ottenere la versione dell'app devi usare un:

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

2) Per ottenere la versione Build devi usare un:

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

1

In Swift, puoi ottenere la versione del bundle usando:

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

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

versionLabel.text = "Version:" + version

0

Un mio progetto open source, App Update Tracker , offre questa funzionalità (e altro) sotto forma di metodi di classe:

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

Lo useresti così:

#import "AppUpdateTracker.h"

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

0

Solo per nota

Per ottenere il valore localizzato di qualsiasi chiave che dovresti usare CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)


-1

Ecco quindi una versione Swift per entrambi separatamente:

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

È incluso in questo repository, dai un'occhiata:

https://github.com/goktugyil/EZSwiftExtensions


CFBundleVersionKey non funziona più su Xcode 8 e Swift 3. Conosci la nuova chiave?
Crashalot,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.