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.

Antworten:


380

Sie können die Versions- und Build-Nummern wie folgt abrufen:

let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let build = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) 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 {

    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))"
    }
}

Inhalt: https://gist.github.com/ashleymills/6ec9fce6d7ec2a11af9b


Hier ist das Äquivalent in Ziel-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;
}

Inhalt: https://gist.github.com/ashleymills/c37efb46c9dbef73d5dd


1
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)")

3

In Ziel C:

1) Um die App-Version zu erhalten, müssen Sie Folgendes verwenden:

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

2) Um die Build-Version zu erhalten, müssen Sie Folgendes verwenden:

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

1

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

0

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:

#import "AppUpdateTracker.h"

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

0

Nur zur Kenntnisnahme

Um den lokalisierten Wert eines Schlüssels zu erhalten, sollten Sie ihn verwenden CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)


-1

Hier ist also eine Swift-Version für beide separat:

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

Es ist in diesem Repo enthalten, probieren Sie es aus:

https://github.com/goktugyil/EZSwiftExtensions


CFBundleVersionKey funktioniert nicht mehr mit Xcode 8 und Swift 3. Kennen Sie den neuen Schlüssel?
Crashalot

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.