Wie kann die Version / Build-Nummer des Ziels in der iOS-App programmgesteuert angezeigt werden?

135

Wie kann ich programmgesteuert den Wert von erhalten target version, wie im Bild unten?

Wie im Eigenschaftenfenster des Ziels meines Xcode-Projekts zu sehen. Ich möchte dies auf dem Begrüßungsbildschirm meiner App anzeigen, damit ich weiß, welche Version die Benutzer derzeit verwenden.

schlank
quelle

Antworten:

392

Es gibt 2 Zahlen!

Die Marketing- Versionsnummer ist für die Kunden als Versionsnummer bezeichnet . Es beginnt mit 1.0 und reicht für größere Updates auf 2.0 , 3.0 , für kleinere Updates auf 1.1 , 1.2 und für Fehlerkorrekturen auf 1.0.1 , 1.0.2 . Diese Nummer orientiert sich an Releases und neuen Funktionen. Es muss nicht bei 9 aufhören, 1.11.23 ist eine vernünftige Versionsnummer.

Die Build-Nummer ist meistens die interne Anzahl der Builds , die bis dahin erstellt wurden. Einige verwenden jedoch andere Nummern wie die Zweigstellennummer des Repositorys oder die Festschreibungsnummer. Diese Nummer sollte eindeutig sein , um die verschiedenen Builds zu unterscheiden, die nur geringfügige inkrementelle Änderungen aufweisen.


So erhalten Sie die Versionsnummer :

Ziel c:

NSString * appVersionString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];

Swift <3.0:

let appVersionString: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String

Swift 3.0+ (getestet mit 5.0):

let appVersionString: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String

So erhalten Sie die Build- Nummer:

Ziel c:

NSString * appBuildString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];

Swift <3.0:

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

Swift 3.0+ (getestet bis 5.0):

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

Wenn Sie beide in einem wollen:

Verwenden Sie zuerst die obigen Zeilen und dann die folgende.

Ziel c:

NSString * versionBuildString = [NSString stringWithFormat:@"Version: %@ (%@)", appVersionString, appBuildString];

Swift (getestet bis 5.0):

let versionAndBuildNumber: String = "\(appVersionString) (\(buildNumber))"

Anmerkungen:

Die Werte im Hauptpaket sind nicht immer vorhanden. In einer Befehlszeilenanwendung gibt es beispielsweise kein CFBundleShortVersionStringoder CFBundleVersion. Daher werden die Methoden zurückgegeben nilund stürzen ab, da im Code ein falscher Downcast ausgeführt wird. In normalen Cocoa iOS- und Mac-Apps sind diese Werte jedoch definiert und werden nicht gelöscht.

Dies wird mit Xcode Version 7.3 (7D175) getestet . Die Build-Nummer wird häufig in Klammern angegeben. Die Build-Nummer ist hexadezimal oder dezimal.

buildandversion


In Xcode können Sie die Build-Nummer automatisch als Dezimalzahl erhöhen, indem Sie Run scriptin den Projekteinstellungen Folgendes in die Build-Phase einfügen

#!/bin/bash    
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

Verwenden Sie für die hexadezimale Build-Nummer dieses Skript

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$((0x$buildNumber)) 
buildNumber=$(($buildNumber + 1)) 
buildNumber=$(printf "%X" $buildNumber)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

Gehen Sie dazu Xcodewie folgt vor:

Schritt 1

Schritt 1

Schritt 2

Schritt 2

Schritt 3

Schritt 3

Binarian
quelle
4
Um für das obige Beispiel hinzuzufügen, ist "CFBundleVersion" der Build = 300, "CFBundleShortVersionString" die Version = 0.41. Viktors Antwort sollte die richtige sein.
Justinkoh
1
Ich hatte einmal Probleme mit Hex-Zahlen. Apple gibt an, Ganzzahlen zu verwenden: developer.apple.com/library/ios/documentation/general/Reference/…
Hashier
Wissen Sie, ob es Zeichenfolgenkonstanten für @ "CFBundleShortVersionString" und @ "CFBundleVersion" gibt?
Igrek
Jetzt, da CI / CD-Systeme weit verbreitet sind, möchten Sie vielleicht auf die Fallstricke hinweisen, die bei der Verwendung von Build-Skripten zum Festlegen von Versionsnummern mit diesen auftreten.
Sam Ballantyne
1
Die Dinge wurden für Swift 3.0 umbenannt: Es ist Bundle.main.object(forInfoDictionaryKey: "...")jetzt.
Raphael
13

Sie müssen nichts an Ihrem Projekt oder Xcode ändern. Hier ist die 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
welche Antwort? Ich sehe es nicht
Esqarrouth
Es gibt nur eine Antwort, es ist in seinem zweiten Absatz
Daniel Galasko
3
Ja, 1. Es gibt zu viel Rauschen und nicht viel Signal in seiner Antwort. 2. Das ist schnell, das ist Ziel-c. 3. Das ist aus der ios5-Ära
Esqarrouth
Die Dinge wurden für Swift 3.0 umbenannt: Es ist Bundle.main.object(forInfoDictionaryKey: "...")jetzt.
Raphael
5

Hier der gleiche Code für Swift 3 :

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String
Tanaschita
quelle
Bundle.mainhatte eine leere infoDictionaryfür mich; Vielleicht, weil ich es innerhalb eines Frameworks mache, nicht einer ausführbaren Datei oder App? Bundle(for: MyClass.self)enthält die erwarteten Werte.
Raphael
4

Programmgesteuerte Anzeige von Version und Build-Nummer - Swift 4.0

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"

let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"            

let versionAndBuildNumber = "Ver #\(versionNumber) ( Build #\(buildNumber) )"
Sandip Patel - SM
quelle
1

Sie können auch gerne verwenden

var appVersion: String {
  //versionNumber
  let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"

  //buildNumber
  let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"

  return "Version: #\(versionNumber) (#\(buildNumber))"
}

Dann können Sie überall verwenden, wenn Sie global deklarieren.

print(appVersion)

Ausgabe:

Version: #1.0 (#1.0.3)
Sivabalaa Jothibose
quelle
1

Ich habe eine Erweiterung für Bundle erstellt, damit es einfach zu bedienen ist

extension Bundle {
    var releaseVersionNumber: String? {
        return infoDictionary?["CFBundleShortVersionString"] as? String
    }

    var buildVersionNumber: String? {
        return infoDictionary?["CFBundleVersion"] as? String
    }

    var applicationName: String {
        return infoDictionary?["CFBundleDisplayName"] as? String ?? "ADKATech"
    }

    var applicationReleaseDate: String {
        return infoDictionary?["ApplicationReleaseDate"] as? String ?? Date().description
    }

    var applicationReleaseNumber: Int {
        return infoDictionary?["ApplicationReleaseNumber"] as? Int ?? 0
    }

    var releaseVersionNumberPretty: String {
        return "\(releaseVersionNumber ?? "1.0.0")"
    }

    var buildVersionNumberPretty: String {
        return "\(buildVersionNumber ?? "1")"
    }
}
Amr wütend
quelle