Wie bekomme ich die aktuelle Version meines iOS-Projekts in Code?
151
Ich möchte in der Lage sein, die aktuelle Version meines iOS-Projekts / meiner iOS-App als NSStringObjekt abzurufen, ohne irgendwo eine Konstante in einer Datei definieren zu müssen. Ich möchte meinen Versionswert nicht an zwei Stellen ändern.
Der Wert muss aktualisiert werden, wenn ich meine Version in der Projektzielzusammenfassung stoße.
Sie können die Versions- und Build-Nummern wie folgt abrufen:
let version =Bundle.main.object(forInfoDictionaryKey:"CFBundleShortVersionString")as!Stringlet build =Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey asString)as!String
oder in Ziel-C
NSString* version =[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];NSString* build =[[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString*)kCFBundleVersionKey];
Ich habe die folgenden Methoden in einer Kategorie auf UIApplication:
extension UIApplication{staticvar appVersion:String{returnBundle.main.object(forInfoDictionaryKey:"CFBundleShortVersionString")as!String}staticvar appBuild:String{returnBundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey asString)as!String}staticvar versionBuild:String{let version = appVersion, build = appBuild
return version == build ?"v\(version)":"v\(version)(\(build))"}}
Sie können dieses [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleVersion"] anstelle von [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *) kCFBundleVersionKey] verwenden. ]; so Jetzt ist es leicht geworden, in Erinnerung zu bleiben
Durai Amuthan.H
4
@ Duraiamuthan Ich würde (NSString *)kCFBundleVersionKeyeher empfehlen, als zu verwenden @"CFBundleVersion". Obwohl die Eingabe länger dauert (die automatische Vervollständigung hilft hier), wird sie zur Kompilierungszeit überprüft, da es sich um eine Konstante handelt.
Ashley Mills
Übrigens wäre es genauer, diese Erweiterung zu aktivieren, NSBundleanstatt UIApplicationstatische Aufrufe durch Instanzaufrufe zu ersetzen.
Zapko
@ Zapko - Ich bin respektvoll anderer Meinung. Konzeptionell passt dies UIApplication, da sich die zurückgegebenen Informationen auf die Anwendung beziehen. Dies gilt auch nur für das mainBundle - es wäre nicht sinnvoll, dies zu einer Instanzmethode für ein Bundle zu machen.
Ashley Mills
Meinten Sie, buildals Sie sagten appBundle(in der 2. Zeile Ihres Codes)?
user1046037
14
Folgendes hat bei Xcode 8, Swift 3 funktioniert :
let gAppVersion =Bundle.main.object(forInfoDictionaryKey:"CFBundleShortVersionString")??"0"let gAppBuild =Bundle.main.object(forInfoDictionaryKey:"CFBundleVersion")??"0"print("Version: \(gAppVersion)")print("Build: \(gAppBuild)")
In Swift können Sie die Bundle-Version erhalten, indem Sie Folgendes verwenden:
let info:NSDictionary=NSBundle.mainBundle().infoDictionary!let version:String= info.objectForKey("CFBundleShortVersionString")as!String
versionLabel.text ="Version:"+ version
Um den lokalisierten Wert eines Schlüssels zu erhalten, sollten Sie ihn verwenden CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)
Hier ist also eine Swift-Version für beide separat:
let versionNumber =NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString")as!Stringlet buildNumber =NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion")as!String
Es ist in diesem Repo enthalten, probieren Sie es aus:
(NSString *)kCFBundleVersionKey
eher empfehlen, als zu verwenden@"CFBundleVersion"
. Obwohl die Eingabe länger dauert (die automatische Vervollständigung hilft hier), wird sie zur Kompilierungszeit überprüft, da es sich um eine Konstante handelt.NSBundle
anstattUIApplication
statische Aufrufe durch Instanzaufrufe zu ersetzen.UIApplication
, da sich die zurückgegebenen Informationen auf die Anwendung beziehen. Dies gilt auch nur für dasmain
Bundle - es wäre nicht sinnvoll, dies zu einer Instanzmethode für ein Bundle zu machen.build
als Sie sagtenappBundle
(in der 2. Zeile Ihres Codes)?Folgendes hat bei Xcode 8, Swift 3 funktioniert :
quelle
In Ziel C:
1) Um die App-Version zu erhalten, müssen Sie Folgendes verwenden:
2) Um die Build-Version zu erhalten, müssen Sie Folgendes verwenden:
quelle
In Swift können Sie die Bundle-Version erhalten, indem Sie Folgendes verwenden:
quelle
Ein Open-Source-Projekt von mir, App Update Tracker , bietet diese Funktionalität (und mehr) in Form von Klassenmethoden:
+ (NSString *)getShortVersionString
+ (NSString *)getLongVersionString
Sie würden es so verwenden:
quelle
Nur zur Kenntnisnahme
Um den lokalisierten Wert eines Schlüssels zu erhalten, sollten Sie ihn verwenden
CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)
quelle
Hier ist also eine Swift-Version für beide separat:
Es ist in diesem Repo enthalten, probieren Sie es aus:
https://github.com/goktugyil/EZSwiftExtensions
quelle