2009-01-19 5 views
233

Ich schreibe eine iPhone App. Es wurde bereits veröffentlicht, aber ich möchte ein Feature hinzufügen, wo seine Versionsnummer angezeigt wird.Wie kann meine iPhone App eine eigene Versionsnummer erkennen?

Ich würde lieber nicht manuell befreie ich mit jeder Version zu tun haben ...

Gibt es eine Möglichkeit in Objective-C, um herauszufinden, was die Version meiner App?

+1

Diese Frage wurde hier schon beantwortet http://stackoverflow.com/a/16888788/2890157. –

+0

.. die verknüpfte Frage ist 4 Jahre später, so dass das eigentliche Problem hier ist, dass CMOS * keine Antwort * akzeptiert *. Unabhängig davon sind die Antworten der verknüpften Frage nützlich, ebenso wie die Antworten hier. Schauen Sie sich bei beiden Threads die erste Antwort an - manchmal gibt es aktuellere Informationen zu einer späteren Antwort. – ToolmakerSteve

Antwort

0

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

Die Idee ist, dass jedes Mal, wenn Sie einen Build erstellen, ein Skript ausgeführt wird, das die aktuelle Revisionsnummer Ihres Codes abruft und eine Datei in Ihrem Projekt aktualisiert (normalerweise mit einer Form von Tokenersatz). Sie können dann eine Fehlerbehandlungsroutine schreiben, die immer die Revisionsnummer in der Fehlerausgabe enthält, oder Sie können sie auf einer "Über" -Seite anzeigen.

30

Sie können die CFBundleShortVersionString Zeichenfolge in Ihrer plist.info angeben und das programmatisch mit der provided API lesen.

215

As I describe here, verwende ich ein Skript, um eine Header-Datei mit meiner aktuellen Subversion Revisionsnummer neu zu schreiben. Diese Revisionsnummer wird in der Konstante kRevisionNumber gespeichert. Ich kann dann Zugriff auf die Versions- und Revisionsnummer etwas ähnlich der folgenden verwenden:

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

die einen String des Formats „Version 1.0 (51)“ schaffen wird.

+149

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

+6

CFBundleVersion ist falsch, weil Xcode fälschlicherweise diesen PLIST-Eintrag mit der Build-Nummer und nicht mit der Versionsnummer füllt. jspooner ist korrekt. – Oscar

+4

Siehe http://stackoverflow.com/questions/6851660/version-vs-build-in-xcode-4 für eine großartige Erklärung der Version vs Build-Nummern.Bestätigt, dass "CFBundleShortVersionString" das ist, was Sie normalerweise für "Version" und "CFBundleVersion" für Build-Nummer wünschen. – Rory

4

Lesen Sie die Datei info.plist Ihrer App und ermitteln Sie den Wert für den Schlüssel CFBundleShortVersionString. Das Lesen von info.plist gibt Ihnen ein NSDictionary -Objekt

143

Aufbauend auf Brad Larson's Antwort, wenn Sie große und kleine Versionsinformationen im info plist gespeichert haben (wie ich in einem bestimmten Projekt), funktionierte das gut für mich:

Jetzt manuell eine Minorversion revrieren kann ein Schmerz sein, und so ist die Verwendung eines Quellrepositoriums Revisionsnummer Trick ideal. Wenn Sie das nicht gebunden haben (wie ich es nicht getan habe), kann das obige Snippet nützlich sein. Außerdem wird der Anzeigename der App angezeigt.

16

Eine prägnante Art und Weise eine Version Zeichenfolge in XYZ Format zu erhalten, ist:

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

Oder für nur XY:

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

Beide Schnipsel Strings zurückgibt, würden Sie Zuweisen zu der Texteigenschaft Ihres Label-Objekts, z

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

Dies ist, was ich in meiner Anwendung haben wird

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

Hoffentlich einfache Antwort jemand helfen ...

+1

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

+1

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

+0

@chancyWu, CFBundleShortVersionString scheint die Version zu geben. –

7

können Sie versuchen Wörterbuch verwenden wie: -

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

NSString *buildVersion = infoDictionary[(NSString*)kCFBundleVersionKey]; 
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey] 
17
// Syncs with App Store and Xcode Project Settings Input 
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; 
+1

Genau das, was ich brauchte! – Julius

29

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

  1. Um App-Version zu erhalten:

    NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; 
    
  2. zu bekommen Um Version Körperbau:

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

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

+0

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

+0

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

45

Swift-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 

Die in diesem Repo enthalten, check it out:

https://github.com/goktugyil/EZSwiftExtensions

1

Wenn Sie eine Kombination von beide Version und build num, hier ist ein kurzer Weg mit Swift 3:

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

ein as! String an das Ende entweder die appVersion oder buildNum Linie nur den Teil als String Objekt zu erhalten. Keine Notwendigkeit dafür, wenn Sie für die volle versionInfo suchen.

Ich hoffe, das hilft!

0

Sie können das infoDictionary verwenden, das die Versionsdetails von info.plist Ihrer App erhält. 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)" 
} 
0

können Sie versuchen, diese Methode:

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