Lesen Sie die Version von Info.plist

91

Ich möchte die Versionsinformationen des Bundles aus Info.plist in meinen Code einlesen, vorzugsweise als Zeichenfolge. Wie kann ich das machen?

John Smith
quelle

Antworten:

201

Sie können Ihre Info.plist als Wörterbuch mit lesen

[[NSBundle mainBundle] infoDictionary]

Und auf diese Weise können Sie die Version ganz einfach am CFBundleVersionSchlüssel erhalten.

Schließlich können Sie die Version mit erhalten

NSDictionary* infoDict = [[NSBundle mainBundle] infoDictionary];
NSString* version = [infoDict objectForKey:@"CFBundleVersion"];
gcamp
quelle
Perfekt. Das ist viel einfacher als alle Zeilen mit CF * -Funktionen, die ich verwendet habe ... Ich war mir sicher, dass es einen schnellen Weg gegeben haben muss, um das NSDictionary zu erhalten.
Eintopf
16
Für die Versionsnummer spielt dies keine Rolle, aber für andere Schlüssel möchten Sie möglicherweise objectForInfoDictionaryKey:stattdessen verwenden, da der lokalisierte Wert zurückgegeben wird, falls verfügbar:[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"]
Zargony
20
Beachten Sie, dass in Xcode4, wenn Sie sich das Zusammenfassungsfenster des Ziels ansehen, die Felder Version & Build angezeigt werden. CFBundleVersionwurde für Build und Version umfunktioniert CFBundleShortVersionString.
Memmons
5
Dadurch werden sowohl die Versions- als auch die Build-Nummer NSString *version = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; NSString *build = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]; self.versionLabel.text = [NSString stringWithFormat:@"%@.%@", version, build];
abgerufen
Verwenden Sie CFBundleShortVersionString als Schlüssel für die objectForKey-Methode.
Ayalcinkaya
11

für Swift-Benutzer:

if let version = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") {
    print("version is : \(version)")
}

für Swift3-Benutzer:

if let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") {
    print("version is : \(version)")
}
Ayalcinkaya
quelle
5

Ich weiß, dass seit der Suche und der Antwort einige Zeit vergangen ist.

Seit iOS8 funktioniert die akzeptierte Antwort möglicherweise nicht mehr.

Dies ist der neue Weg, dies jetzt zu tun:

NSString *version = (__bridge id)CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), kCFBundleVersionKey);
Michael Kessler
quelle
6
Haben Sie einen Link, warum dies so ist?
Ian Warburton
4

In iOS 8 sind jetzt beide Felder erforderlich. Früher funktioniert es ohne die CFBundleShortVersionString. Jetzt ist es jedoch erforderlich, eine App im App Store einzureichen. Und kCFBundleVersionKeywird für das Hochladen jedes neuen Builds verglichen, der in inkrementeller Reihenfolge erfolgen muss. Speziell für TestFlight-Builds. Ich mache es so,

NSString * version = nil;
    version = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
    if (!version) {
        version = [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey];
    }
Karim
quelle
Danke .. version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleShortVersionString"]; arbeitete für mich
swiftBoy
3

Swift 3:

let appBuildNumber = Bundle.main.infoDictionary!["CFBundleVersion"] as! String
let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"] as! String
Nitin Nain
quelle