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.

Jovan
quelle

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

Ashley Mills
quelle
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)")
Crashalot
quelle
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"]; 
Vaibhav Shiledar
quelle
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
Ravindra Kishan
quelle
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]);
Stunner
quelle
0

Nur zur Kenntnisnahme

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

akaDuality
quelle
-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

Esqarrouth
quelle
CFBundleVersionKey funktioniert nicht mehr mit Xcode 8 und Swift 3. Kennen Sie den neuen Schlüssel?
Crashalot
Hier ist eine aktuelle: github.com/goktugyil/EZSwiftExtensions/blob/…
Esqarrouth