Ich möchte gerne die aktuelle Version meines iOS-Projekts/meiner App als NSString
-Objekt erhalten, 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 störe.
Sie können die Versions- und Build-Nummern wie folgt erhalten:
let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let build = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String
oder in Objective-C
NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"];
NSString * build = [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey];
Ich habe die folgenden Methoden in einer Kategorie zu 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
Hier ist das Äquivalent 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
Folgendes funktionierte auf 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)")
In Ziel C:
1) Um eine App-Version zu erhalten, müssen Sie Folgendes verwenden:
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
2) Um eine Build-Version zu erhalten, müssen Sie Folgendes verwenden:
NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
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
Ein Open-Source-Projekt von mir, App Update Tracker , bietet diese Funktionalität (und mehr) in Form von Klassenmethoden:
+ (NSString *)getShortVersionString
+ (NSString *)getLongVersionString
Du würdest es so benutzen:
#import "AppUpdateTracker.h"
NSLog(@"short version: %@", [AppUpdateTracker getShortVersionString]);
NSLog(@"long version: %@", [AppUpdateTracker getLongVersionString]);
Nur zur Kenntnisnahme
Um einen lokalisierten Wert eines Schlüssels zu erhalten, sollten Sie CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)
verwenden.