Wie kann meine iPhone App ihre eigene Versionsnummer erkennen?


254

Ich schreibe eine iPhone App. Es wurde bereits veröffentlicht, aber ich möchte eine Funktion hinzufügen, bei der die Versionsnummer angezeigt wird.

Ich möchte dies lieber nicht mit jeder Version, die ich veröffentliche, manuell tun müssen ...

Gibt es in Ziel-C eine Möglichkeit, herauszufinden, wie die Version meiner App aussieht?


1
Diese Frage wurde hier bereits beantwortet stackackflow.com/a/16888788/2890157 .
Akshat Singhal

1
.. die verknüpfte Frage ist 4 Jahre später, daher ist das eigentliche Problem hier, dass cmos nie eine Antwort akzeptiert hat . Unabhängig davon sind die Antworten der verknüpften Frage nützlich, ebenso wie die Antworten hier. Schauen Sie in beiden Threads über die erste Antwort hinaus - manchmal gibt es aktuellere Informationen zu einer späteren Antwort.
ToolmakerSteve

Antworten:


222

Wie hier beschrieben , verwende ich ein Skript, um eine Header-Datei mit meiner aktuellen Subversion-Versionsnummer neu zu schreiben. Diese Revisionsnummer wird in der Konstante kRevisionNumber gespeichert. Ich kann dann auf die Versions- und Versionsnummer zugreifen, indem ich etwas Ähnliches wie folgt verwende:

[NSString stringWithFormat:@"Version %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"], kRevisionNumber]

Dadurch wird eine Zeichenfolge im Format "Version 1.0 (51)" erstellt.


152
Das gab meine Build-Version zurück, also habe ich diese verwendet. [[[NSBundle mainBundle] infoDictionary] objectForKey: @ "CFBundleShortVersionString"]
jspooner

6
CFBundleVersion ist falsch, da Xcode diesen Plist-Eintrag fälschlicherweise mit der Build-Nummer und nicht mit der Versionsnummer füllt. jspooner ist richtig.
Oscar

4
Unter stackoverflow.com/questions/6851660/version-vs-build-in-xcode-4 finden Sie eine ausführliche Erläuterung der Versions- und Build-Nummern. Bestätigt, CFBundleShortVersionStringwas Sie normalerweise für 'Version' und CFBundleVersionfür Build-Nummer möchten .
Rory

3
kRevisionNumber scheint bei mir nicht zu funktionieren. Um die angegebene Ausgabe zu erhalten, habe ich dies getan (mit @jspooner 's Fix):[NSString stringWithFormat:@"Version: %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]
Adam

147

Aufbauend auf Brad Larsons Antwort hat dies für mich gut funktioniert, wenn Sie Haupt- und Nebenversionsinformationen in der Info-Liste gespeichert haben (wie ich es bei einem bestimmten Projekt getan habe):

- (NSString *)appNameAndVersionNumberDisplayString {
    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString *appDisplayName = [infoDictionary objectForKey:@"CFBundleDisplayName"];
    NSString *majorVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
    NSString *minorVersion = [infoDictionary objectForKey:@"CFBundleVersion"];

    return [NSString stringWithFormat:@"%@, Version %@ (%@)", 
                appDisplayName, majorVersion, minorVersion];
}

Jetzt kann das manuelle Überarbeiten einer Nebenversion schmerzhaft sein. Daher ist die Verwendung eines Tricks zur Versionsnummer des Quell-Repositorys ideal. Wenn Sie das nicht eingebunden haben (wie ich es nicht getan habe), kann das obige Snippet nützlich sein. Außerdem wird der Anzeigename der App angezeigt.


59

Schnelle Version für beide separat:

Swift 3

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String

Swift 2

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


42

Das habe ich in meiner Bewerbung gemacht

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

Hoffentlich hilft diese einfache Antwort jemandem ...


1
Für meine Bedürfnisse ist das großartig. Vielen Dank. +1
David DelMonte

1
Dies gibt den Build-Namen zurück, nicht die Version
chancyWu

@chancyWu, CFBundleShortVersionString scheint die Version anzugeben.
Brian F Leighty


30

Es gibt zwei Dinge - Build-Version und App-Version.

  1. So erhalten Sie die App-Version:

    NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
  2. So erhalten Sie die Build-Version:

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

Gibt es einen Unterschied zwischen diesen beiden? Beide geben das gleiche für mich zurück.
jjnevis

Ja, möglicherweise sind Ihre Build-Nummer und Ihre App-Version in den Einstellungen identisch.
Shaik Riyaz

Okay, ich habe nur eine Einstellung in meiner RAKEFILE - app.version (ich verwende RubyMotion). Ich denke, beides wird für meine Bedürfnisse ausreichen. Danke
jjnevis

Danke, Kumpel. Hat reibungslos funktioniert.
Felipe

1
Zu Ihrer Information Es ist vorzuziehen, objectForInfoDictionaryKey:anstelle von zu verwenden, infoDictionary] objectForKey:da ersterer den lokalisierten Wert zurückgibt (falls vorhanden). Wahrscheinlich macht das hier aber keinen Unterschied;)
DeanWombourne

17
// Syncs with App Store and Xcode Project Settings Input
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];

1
Genau das, was ich brauchte!
Julius

16

Ein prägnanter Weg, um eine Versionszeichenfolge im XYZ- Format zu erhalten, ist:

[NSBundle mainBundle].infoDictionary[@"CFBundleVersion"]

Oder nur für XY:

[NSBundle mainBundle].infoDictionary[@"CFBundleShortVersionString"]

Beide Snippets geben Zeichenfolgen zurück, die Sie der Texteigenschaft Ihres Beschriftungsobjekts zuweisen würden, z

myLabel.text = [NSBundle mainBundle].infoDictionary[@"CFBundleVersion"];

7

Sie können versuchen, das Wörterbuch wie folgt zu verwenden: -

NSDictionary *infoDictionary = [[NSBundle mainBundle]infoDictionary];

NSString *buildVersion = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]

4

Lesen Sie die Datei info.plist Ihrer App und ermitteln Sie den Wert für den Schlüssel CFBundleShortVersionString. Wenn Sie info.plist lesen, erhalten Sie ein NSDictionary-Objekt


4

Sie können das infoDictionary verwenden, das die Versionsdetails aus der info.plist Ihrer App abruft. Dieser Code funktioniert für Swift 3. Rufen Sie einfach diese Methode auf und zeigen Sie die Version in einem beliebigen bevorzugten UI-Element an.

Swift-3  

func getVersion() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as! String
    let build = dictionary["CFBundleVersion"] as! String
    return "v\(version).\(build)"
}

3

Swift 5:

Es gibt zwei Dinge - App-Version und Build-Version

  • So erhalten Sie die App-Version:

     if let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
          // present appVersion
    }
  • So erhalten Sie die Build-Version:

     if let buildVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
          // present buildVersion
     }

Dank @Brad Larson♦viel


1

Wenn Sie eine Kombination aus Version und Build-Nummer benötigen, können Sie Swift 3 auf kurze Weise verwenden :

let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"]!
let buildNum = Bundle.main.infoDictionary!["CFBundleVersion"]!
let versionInfo = "\(appVersion) (build \(buildNum))"
// versionInfo is now something like "2.3.0 (build 17)"

Fügen Sie as! Stringam Ende der Zeile appVersionoder ein buildNumhinzu, um nur diesen Teil als StringObjekt zu erhalten. Keine Notwendigkeit dafür, wenn Sie das volle suchen versionInfo.

Ich hoffe das hilft!


1
func getAppVersion() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let versionValue = dictionary["CFBundleShortVersionString"] ?? "0"
    let buildValue = dictionary["CFBundleVersion"] ?? "0"
    return "\(versionValue) (build \(buildValue))"
}

Basierend auf @rajat Chauhan Antwort ohne erzwungene Besetzung String.


0

Dies ist eine gute Sache, um mit einem Revisionskontrollsystem umzugehen. Auf diese Weise können Sie, wenn Sie einen Fehlerbericht von einem Benutzer erhalten, diese Code-Revision überprüfen und (hoffentlich) den Fehler reproduzieren, der genau denselben Code wie der Benutzer ausführt.

Die Idee ist, dass Sie jedes Mal, wenn Sie einen Build ausführen, ein Skript ausführen, das die aktuelle Versionsnummer Ihres Codes abruft und eine Datei in Ihrem Projekt aktualisiert (normalerweise mit einer Art Token-Ersatz). Sie können dann eine Fehlerbehandlungsroutine schreiben, die immer die Versionsnummer in der Fehlerausgabe enthält, oder Sie können sie auf einer "Info" -Seite anzeigen.


0

Sie können diese Methode ausprobieren:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
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.