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.