567 Stimmen

Wie erhalte ich die App-Version und die Build-Nummer mit Swift?

Ich habe eine IOS-App mit einem Azure-Backend und möchte bestimmte Ereignisse protokollieren, wie z.B. Anmeldungen und welche Versionen der App die Benutzer verwenden.

Wie kann ich die Version und Build-Nummer mit Swift zurückgeben?

642voto

David Punkte 6575

Bearbeiten

Aktualisiert für Swift 4.2

let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String

Bearbeiten

Wie von @azdev angemerkt, erhalten Sie in der neuen Version von Xcode einen Kompilierungsfehler, wenn Sie meine vorherige Lösung versuchen. Um dies zu beheben, bearbeiten Sie es einfach, wie vorgeschlagen, um das Bundle-Dictionary mit einem ! zu entpacken

let nsObject: AnyObject? = Bundle.main.infoDictionary!["CFBundleShortVersionString"]

Ende der Bearbeitung

Verwenden Sie einfach die gleiche Logik wie in Objective-C, aber mit einigen kleinen Änderungen

//Zuerst das nsObject erhalten, indem es als optionaler anyObject definiert wird
let nsObject: AnyObject? = NSBundle.mainBundle().infoDictionary["CFBundleShortVersionString"]

//Dann das Objekt einfach als String casten, aber seien Sie vorsichtig, es könnte sein, dass Sie nochmals auf nil überprüfen möchten
let version = nsObject as! String

334voto

Blake Merryman Punkte 3895

Aktualisiert für Swift 3.0

Die NS-Präfixe sind jetzt in Swift 3.0 verschwunden und mehrere Eigenschaften/Methoden haben Namen geändert, um mehr Swifty zu sein. So sieht das jetzt aus:

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

Bundle.main.releaseVersionNumber
Bundle.main.buildVersionNumber

Alte Aktualisierte Antwort

Ich habe seit meiner ersten Antwort viel mit Frameworks gearbeitet, daher wollte ich meine Lösung auf etwas aktualisieren, das sowohl einfacher als auch in einer Multi-Bundle-Umgebung viel nützlicher ist:

extension NSBundle {

    var releaseVersionNumber: String? {
        return self.infoDictionary?["CFBundleShortVersionString"] as? String
    }

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

}

Diese Erweiterung wird nun in Apps nützlich sein, um sowohl das Hauptbundle als auch andere enthaltene Bundles zu identifizieren (wie z.B. ein gemeinsames Framework für Erweiterungsprogrammierung oder Drittanbieter-Frameworks wie AFNetworking), zum Beispiel so:

NSBundle.mainBundle().releaseVersionNumber
NSBundle.mainBundle().buildVersionNumber

// oder...

NSBundle(URL: someURL)?.releaseVersionNumber
NSBundle(URL: someURL)?.buildVersionNumber

Ursprüngliche Antwort

Ich wollte einige der bereits geposteten Antworten verbessern. Ich habe eine Klassenerweiterung geschrieben, die zu Ihrem Toolchain hinzugefügt werden kann, um dies auf logischere Weise zu behandeln.

extension NSBundle {

class var applicationVersionNumber: String {
    if let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"]

as? String { return version } return "Versionsnummer nicht verfügbar" }

class var applicationBuildNumber: String {
    if let build = NSBundle.mainBundle().infoDictionary?["CFBundleVersion"] as? String {
        return build
    }
    return "Versionsnummer nicht verfügbar"
}

}

Jetzt können Sie leicht darauf zugreifen, indem Sie:

let versionNumber = NSBundle.applicationVersionNumber

308voto

Timothy Tripp Punkte 3239

Ich weiß, dass dies bereits beantwortet wurde, aber persönlich finde ich das etwas sauberer:

Swift 3.0:

 if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
    self.labelVersion.text = version
}

Swift 2.3

if let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String {
    self.labelVersion.text = version
}

Auf diese Weise kümmert sich das if let version um die bedingte Verarbeitung (das Setzen des Label-Textes in meinem Fall) und wenn infoDictionary oder CFBundleShortVersionString nil sind, führt das optionale Entpacken dazu, dass der Code übersprungen wird.

105voto

Gunhan Punkte 6241

Ich weiß auch, dass dies bereits beantwortet wurde, aber ich habe die vorherigen Antworten zusammengefasst:

(*)Aktualisiert für Erweiterungen

extension Bundle {
    var releaseVersionNumber: String? {
        return infoDictionary?["CFBundleShortVersionString"] as? String
    }
    var buildVersionNumber: String? {
        return infoDictionary?["CFBundleVersion"] as? String
    }
    var releaseVersionNumberPretty: String {
        return "v\(releaseVersionNumber ?? "1.0.0")"
    }
}

Verwendung:

someLabel.text = Bundle.main.releaseVersionNumberPretty

@Deprecated: Alte Antworten

Swift 3.1:

class func getVersion() -> String {
    guard let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String else {
        return "keine Versionsinformation"
    }
    return version
}

Für ältere Versionen:

class func getVersion() -> String {
    if let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String {
        return version
    }
    return "keine Versionsinformation"
}

Wenn Sie also den Label-Text setzen oder an anderer Stelle verwenden möchten;

self.labelVersion.text = getVersion()

91voto

Andrew Punkte 6861

2023, Swift 3-

extension Bundle {
    public var appName: String           { getInfo("CFBundleName") }
    public var displayName: String       { getInfo("CFBundleDisplayName") }
    public var language: String          { getInfo("CFBundleDevelopmentRegion") }
    public var identifier: String        { getInfo("CFBundleIdentifier") }
    public var copyright: String         { getInfo("NSHumanReadableCopyright").replacingOccurrences(of: "\\n", with: "\n") }

    public var appBuild: String          { getInfo("CFBundleVersion") }
    public var appVersionLong: String    { getInfo("CFBundleShortVersionString") }
    //public var appVersionShort: String { getInfo("CFBundleShortVersion") }

    fileprivate func getInfo(_ str: String) -> String { infoDictionary?[str] as? String ?? "" }
}

Verwendung (SwiftUI Beispiel):

Text("Ver: \(Bundle.main.appVersionLong) (\(Bundle.main.appBuild)) ")

Text(Bundle.main.copyright)
    .font(.system(size: 10, weight: .thin))
    .multilineTextAlignment(.center)

Bonus: Copyright unterstützt \n Symbole!

enter image description here

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X