2011-09-30 16 views
125

Vorrei essere in grado di ottenere la versione corrente del mio progetto/app iOS come un oggetto NSString senza dover definire una costante in un file da qualche parte. Non voglio cambiare il valore della mia versione in 2 punti.Come si ottiene la versione corrente del mio progetto iOS in codice?

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

risposta

330

È possibile 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 a UIApplication:

extension UIApplication { 

    class func appVersion() -> String { 
     return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String 
    } 

    class func appBuild() -> String { 
     return Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String 
    } 

    class func 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

si potrebbe usare questo [ [NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleVersion"] invece di [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *) kCFBundleVersionKey].The Former sembra rima bene con [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleShortVersionString"]; così ora è diventato facile da tenere in memoria –

+4

@Duraiamuthan mi consiglia di usare '(NSString *) kCFBundleVersionKey' piuttosto che' @ "CFBundleVersion" '. Anche se è più lungo da digitare (il completamento automatico aiuterà qui), poiché è una costante viene controllata al momento della compilazione. –

+0

Btw, sarebbe più accurato fare questa estensione su 'NSBundle' invece che su' UIApplication', questo permetterà anche di sostituire le chiamate statiche con quelle di istanza. – Zapko

2

In Swift, è possibile ottenere la versione pacco utilizzando:

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

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

versionLabel.text = "Version:" + version 
1

An mio progetto open source, App Update Tracker , Offre questa funzionalità (e più), sotto forma di metodi di classe:

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

si può usare in questo modo:

#import "AppUpdateTracker.h" 

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

Così heres uno Swift versione per entrambi separatamente:

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

sua inclusi in questo repo, check it out:

https://github.com/goktugyil/EZSwiftExtensions

+0

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

+0

Ecco uno aggiornato: https://github.com/goktugyil/EZSwiftExtensions/blob/b06d55a8f5d4fda9f5bca03af4863252dcf53e10/Sources/EZSwiftFunctions.swift – Esqarrouth

2

In Objective C:

1) Per ottenere la versione App è necessario utilizzare un:

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

2) Per ottenere la versione Build devi usare:

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

Ecco cosa ha lavorato 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)") 
0

Proprio per la nota

Per ottenere il valore localizzato di qualsiasi chiave che si dovrebbe utilizzare CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)

Problemi correlati