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?

Brad Larson
quelle
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.

Brad Larson
quelle
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.

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

Esqarrouth
quelle
42

Das habe ich in meiner Bewerbung gemacht

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

Hoffentlich hilft diese einfache Antwort jemandem ...

Arkady
quelle
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
31

Sie können die CFBundleShortVersionStringZeichenfolge in Ihrer plist.info angeben und diese mithilfe der bereitgestellten API programmgesteuert lesen .

Jasper Bekkers
quelle
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"];
Shaik Riyaz
quelle
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"];
John Erck
quelle
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"];
rodamn
quelle
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]
Abhishek Verma
quelle
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

lostInTransit
quelle
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)"
}
Rajat Chauhan
quelle
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

dengST30
quelle
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!

Jeehut
quelle
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.

apex39
quelle
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.

RedFilter
quelle
0

Sie können diese Methode ausprobieren:

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