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


387

Ich habe eine IOS-App mit einem Azure-Back-End und möchte bestimmte Ereignisse protokollieren, z. B. Anmeldungen und welche Versionen der App-Benutzer ausgeführt werden.

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



6
Das ist Objective-C, nicht Swift.
Øyvind Vik

10
Verwechseln Sie CFBundleVersion& CFBundleShortVersionString` nicht. Die erste ist Ihre Build- Version. Die andere ist die Versionsnummer . Siehe hier für weitere Informationen
Honey

1
@ ØyvindVik Die meisten Leute gehen davon aus, dass Sie eine Objective-C-Lösung ohne Händchenhalten in Swift übersetzen können.
Gnasher729

Antworten:


424

BEARBEITEN

Aktualisiert für Swift 4.2

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

BEARBEITEN

Wie von @azdev in der neuen Version von Xcode hervorgehoben, wird beim Kompilieren meiner vorherigen Lösung ein Kompilierungsfehler angezeigt. Um dies zu lösen, bearbeiten Sie es einfach wie vorgeschlagen, um das Bundle-Wörterbuch mit einem!

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

Bearbeiten beenden

Verwenden Sie einfach dieselbe Logik wie in Objective-C, jedoch mit einigen kleinen Änderungen

//First get the nsObject by defining as an optional anyObject
let nsObject: AnyObject? = NSBundle.mainBundle().infoDictionary["CFBundleShortVersionString"]

//Then just cast the object as a String, but be careful, you may want to double check for nil
let version = nsObject as! String

Ich hoffe das hilft dir weiter.

David


Wenn ich dies benutze, erhalte ich einen Compilerfehler "[NSObject: AnyObject]? Hat kein Mitglied namens 'tiefgestellt'"
andreas

Sie können versuchen, das AnyObject zu ersetzen? von AnyObject! Ohne genau zu wissen, welchen Code Sie verwenden, ist es sehr schwierig zu erraten, was falsch ist. Denken Sie auch daran, dass Swift von einer Xcode-Version zu einer anderen wechseln kann. Daher ist es auch wichtig, Ihre Xcode-Version zu kennen.
David

18
@andreas infoDictionarysollte mit ausgepackt werden !. Dies ist, was ich benutze, in eine Globals.swift-Datei gelegt:let appVersion = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as String
Azdev

1
Ich musste noch ein "!" nach "as". let appVersion = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String
Josei

3
Sie sollten vermeiden, ein erzwungenes Auspacken "!" da sie dazu führen, dass Ihre App abstürzt, wenn einer dieser Werte Null ist
Julius

278

Ich weiß, dass dies bereits beantwortet wurde, aber ich persönlich denke, dass dies ein wenig sauberer ist:

Swift 3.0:

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

Schnell <2.3

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

Auf diese Weise kümmert sich die if let-Version um die bedingte Verarbeitung (in meinem Fall das Festlegen des Beschriftungstextes), und wenn infoDictionary oder CFBundleShortVersionString gleich Null sind, wird der Code beim optionalen Entpacken übersprungen.


6
self.labelVersion.textist optionaler Typ, so dass Sie direkt zuweisen könnenNSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String
Jonauz

8
Gibt es einen Grund, warum der Wert nicht festgelegt wird? Ich bin mir leteinig, dass es definitiv vorsichtiger ist und frage mich nur, warum es nötig sein könnte. Vielen Dank!
Crashalot

@Crashalot trotz Ihres Namens;) Sie möchten nicht, dass Ihre App abstürzt, wenn Sie beispielsweise einen Tippfehler machen, sondern die Versionsnummer lautet "etwas ist schief gelaufen".
Daniel Springer

OP: Sie können das ersetzen? mit! und entfernen Sie "als Zeichenfolge". Wenn es Null ist, wird es sowieso nicht abstürzen
Daniel Springer

245

Aktualisiert für Swift 3.0

Die NSPräfixe sind jetzt in Swift 3.0 verschwunden und einige Eigenschaften / Methoden haben den Namen geändert, um schneller 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 ursprünglichen Antwort viel mit Frameworks gearbeitet, daher wollte ich meine Lösung auf etwas aktualisieren, das in einer Umgebung mit mehreren Bundles sowohl einfacher als auch viel nützlicher ist:

extension NSBundle {

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

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

}

Jetzt ist diese Erweiterung in Apps nützlich, um sowohl das Hauptpaket als auch alle anderen enthaltenen Pakete (z. B. ein gemeinsames Framework für die Erweiterungsprogrammierung oder dritte Frameworks wie AFNetworking) zu identifizieren:

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

// or...

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

Ursprüngliche Antwort

Ich wollte einige der bereits veröffentlichten Antworten verbessern. Ich habe eine Klassenerweiterung geschrieben, die zu Ihrer Werkzeugkette hinzugefügt werden kann, um dies logischer zu handhaben.

extension NSBundle {

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

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

class var applicationBuildNumber: String {
    if let build = NSBundle.mainBundle().infoDictionary?["CFBundleVersion"] as? String {
        return build
    }
    return "Build Number Not Available"
}

}

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

let versionNumber = NSBundle.applicationVersionNumber

CFBundleVersionKey funktioniert nicht mehr in Swift 3, Xcode 8. Kennen Sie den neuen Schlüssel?
Crashalot

71

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

(*) Für Erweiterungen aktualisiert

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

Verwendungszweck:

someLabel.text = Bundle.main.releaseVersionNumberPretty

@ Veraltet: Alte Antworten

Swift 3.1 :

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

Für ältere Versionen :

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

Wenn Sie also Beschriftungstext festlegen oder woanders verwenden möchten;

self.labelVersion.text = getVersion()

1
oder: class func getVersion () -> String {return NSBundle.mainBundle (). infoDictionary? ["CFBundleShortVersionString"] as? String ?? "no version info"}
tapmonkey

Ich denke, das Kopieren anderer Antworten macht keinen Sinn. Wenn Ihre Antwort nicht mehr gültig ist, haben Sie immer die Möglichkeit, sie zu löschen und Platz für die anderen Antworten zu schaffen :)
carmen_munich

1
@carmen_munich Da du hier verleumdest, muss ich dir antworten. Zunächst wird diese Antwort im März 2015 und Ihre Antwort im Februar 2017 veröffentlicht. Daher muss Ihre Inspiration von den früheren Antworten stammen. Zweitens habe ich Ihre Antwort überhaupt nicht gesehen. Ich habe meine Antwort aktualisiert, weil ich sie heutzutage so verwende. Die Verwendung einer Erweiterung ist wohl nicht nur für jemanden in der iOS-Community möglich. Bitte versuchen Sie wirklich, reif zu sein und andere Entwickler zu respektieren. Ich bekomme hier nichts zu posten. Ich möchte Menschen helfen, das ist es. Bitte versuchen Sie nicht, Leute zu entmutigen, die versuchen, auf SO zu helfen.
Gunhan

Ich habe viele Rückmeldungen von Neulingen gehört, dass sie eine Antwort posten und sehen möchten, dass jemand auf "up" klickt, was wirklich schön zu sehen ist und die Leute motiviert. Aber wenn jemand Antworten in seine veraltete Antwort kopiert, wird derjenige, der sich die Mühe gemacht hat, sie zu veröffentlichen, nicht die Motivation bekommen, dass jemand dafür gestimmt hat. Die Neulinge sind also wirklich enttäuscht und haben das Gefühl, dass sie der Community keinen Wert bringen und aufhören zu posten. Und versteh es nicht falsch, ich meine das im Allgemeinen. Ich hoffe, Sie fühlen sich nicht beleidigt und verstehen jetzt besser, warum ich diesen Vorschlag gemacht habe.
carmen_munich

@carmen_munich Wenn Sie die Antworten auf diese Frage chronologisch sortieren, werden Sie feststellen, dass jemand anderes bereits die gleiche Antwort gegeben hat wie Sie vor Ihnen! Sie beschuldigen mich also, etwas getan zu haben, das Sie selbst getan haben. Da ich einen Verlauf für diese Frage habe, habe ich meine neuen Nutzungseinstellungen in einem Update geteilt. Das ist alles.
Gunhan

32

Für Swift 4.0

let version = Bundle.main.infoDictionary!["CFBundleShortVersionString"]!
let build = Bundle.main.infoDictionary!["CFBundleVersion"]!

29

Ich habe eine Erweiterung für Bundle erstellt

extension Bundle {

    var appName: String {
        return infoDictionary?["CFBundleName"] as! String
    }

    var bundleId: String {
        return bundleIdentifier!
    }

    var versionNumber: String {
        return infoDictionary?["CFBundleShortVersionString"] as! String 
    }

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

}

und dann benutze es

versionLabel.text = "\(Bundle.main.appName) v \(Bundle.main.versionNumber) (Build \(Bundle.main.buildNumber))"

Eigentlich ist es etwas anders. Ich benutze zum Beispiel das gewaltsame Auspacken. Sie könnten denken, dass das Auspacken von Gewalt im Allgemeinen schlecht ist, dies ist einer der seltenen Fälle, in denen es in Ordnung ist. Um es etwas genauer zu erklären, sollten diese Werte im Wörterbuch enthalten sein, da sonst etwas mit der Projektdatei nicht stimmt. Deshalb verwendet dieser Ansatz das gewaltsame Auspacken :-)
carmen_munich

Das Umbenennen und Erzwingen des Auspackens ist keine Änderung, die als neue Antwort veröffentlicht werden muss. Außerdem können die Leute lernen, dass das Auspacken von Gewalt überall angewendet werden kann, wenn sie Ihre Antwort sehen. Nehmen Sie für die Leser nicht an, dass der Schlüssel vorhanden ist. Es ist immer besser, das optionale Auspacken manuell durchzuführen, als das Auspacken zu erzwingen.
Gunhan

Um fair zu sein, gibt es einige seltene Fälle, in denen das Auspacken von Gewalt in Ordnung ist. Dieser eine Beitrag zeigt nur einen Fall, in dem es in Ordnung sein kann. Wenn Sie mehr über das Auspacken von Gewalt erfahren möchten, finden Sie einige gute Erklärungen und Tutorials von Paul Hudson. Ich kann es wirklich allen Neulingen empfehlen www.hackingwithswift.com
carmen_munich

Es ist eine gute Empfehlung für die Neulinge. Vielleicht können Sie auch mehr lesen und mehr lernen. Außerdem sollten Sie Ihr Verständnis für Kommentare und deren Bedeutung verbessern. ZB hat dir niemand gesagt, dass du niemals / nie Gewalt beim Auspacken anwenden sollst. Aber für das Info-Diktat können diese Schlüssel entfernt werden und das gewaltsame Auspacken kann zu einem Absturz führen. Hier ist das Auspacken sicherer.
Gunhan

Vielleicht können Sie erklären, in welchem ​​Fall sie entfernt werden können und gleich Null sind? Was ich aus der erwähnten Ressource gelernt habe, ist in diesem speziellen Fall nicht der Fall. Sie sollten immer da sein, es sei denn, die Projektdatei ist kaputt. In diesem Fall würde das Projekt wahrscheinlich sowieso nicht kompiliert werden
carmen_munich

16

Für Swift 3.0 funktioniert NSBundle nicht. Der folgende Code funktioniert einwandfrei.

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

und für nur die Build-Nummer ist es:

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

Verwirrenderweise ist 'CFBundleVersion' die Build- Nummer, wie sie in Xcode unter Allgemein-> Identität eingegeben wurde.


16

Xcode 9.4.1 Swift 4.1

Beachten Sie die Verwendung von localizedInfoDictionary, um die richtige Sprachversion des Anzeigenamens des Bundles zu ermitteln.

var displayName: String?
var version: String?
var build: String?

override func viewDidLoad() {
    super.viewDidLoad()

    // Get display name, version and build

    if let displayName = Bundle.main.localizedInfoDictionary?["CFBundleDisplayName"] as? String {
        self.displayName = displayName
    }
    if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
        self.version = version
    }
    if let build = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
        self.build = build
    }
}

14

Xcode 8, Swift 3:

let gAppVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "0"
let gAppBuild = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "0"

13

Swift 4, nützliche Erweiterung für Bundle

import Foundation

public extension Bundle {

    public var shortVersion: String {
        if let result = infoDictionary?["CFBundleShortVersionString"] as? String {
            return result
        } else {
            assert(false)
            return ""
        }
    }

    public var buildVersion: String {
        if let result = infoDictionary?["CFBundleVersion"] as? String {
            return result
        } else {
            assert(false)
            return ""
        }
    }

    public var fullVersion: String {
        return "\(shortVersion)(\(buildVersion))"
    }
}

Um dies zu nutzen, müssen Sie zum Beispiel Bundle.main.fullVersion sagen
Joseph Astrahan

12

Bundle + Extensions.swift

import Foundation

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

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

    var bundleName: String? {
        return infoDictionary?["CFBundleName"] as? String
    }
}

Verwendungszweck:

someLabel.text = Bundle.main.versionNumber

11

OP fragte sowohl nach der Versionsnummer als auch nach der Build-Nummer. Leider bieten die meisten Antworten nicht beide Optionen. Darüber hinaus fügen andere unnötige Erweiterungsmethoden hinzu. Hier ist eine, die ziemlich einfach ist und das Problem von OP löst:

// Example output: "1.0 (234)"
private func versionAndBuildNumber() -> String {
  let versionNumber = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String
  let buildNumber = Bundle.main.infoDictionary?["CFBundleVersion"] as? String
  if let versionNumber = versionNumber, let buildNumber = buildNumber {
    return "\(versionNumber) (\(buildNumber))"
  } else if let versionNumber = versionNumber {
    return versionNumber
  } else if let buildNumber = buildNumber {
    return buildNumber
  } else {
    return ""
  }
}

9

Meine Antwort (Stand August 2015) angesichts von Swift entwickelt sich weiter:

let version = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String

8

Ich habe eine Erweiterung für UIApplication erstellt.

extension UIApplication {
    static var appVersion: String {
        let versionNumber = Bundle.main.infoDictionary?[IdentifierConstants.InfoPlist.versionNumber] as? String
        let buildNumber = Bundle.main.infoDictionary?[IdentifierConstants.InfoPlist.buildNumber] as? String

        let formattedBuildNumber = buildNumber.map {
            return "(\($0))"
        }

        return [versionNumber,formattedBuildNumber].compactMap { $0 }.joined(separator: " ")
    }
}

struct IdentifierConstants {
    struct InfoPlist {
        static let versionNumber = "CFBundleShortVersionString"
        static let buildNumber = "CFBundleVersion"
    }
}

6

Nachdem ich mir die Dokumentation angesehen habe, glaube ich, dass Folgendes sauberer ist:

let version = 
NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") 
as? String

Quelle : "Die Verwendung dieser Methode wird anderen Zugriffsmethoden vorgezogen, da sie den lokalisierten Wert eines Schlüssels zurückgibt, wenn einer verfügbar ist."


1
das ist der richtige schnelle Weg, keine Kraft auspacken, irgendwo
Juan Boero

5

Für Swift 1.2 ist es:

let version = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"] as! String
let build = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String

1
Du könntest benutzen ? auch
Dan Rosenstark

4

Swift 3:

Versionsnummer

if let versionNumberString = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String { // do something }

Build-Nummer

if let buildNumberString = Bundle.main.infoDictionary?["CFBundleVersion"] as? String { // do something }

Wie wäre es mit der Build-Nummer? Vielen Dank! CFBundleVersionKey funktioniert nicht.
Crashalot

@Crashalot Ich habe es auch mit der Build-Nummer aktualisiert. Hier ist auch eine Liste aller Core Foundation Keys: developer.apple.com/library/content/documentation/General/…
jasonnoahchoi

3

Swift 4

func getAppVersion() -> String {
    return "\(Bundle.main.infoDictionary!["CFBundleShortVersionString"] ?? "")"
}

Bundle.main.infoDictionary! ["CFBundleShortVersionString"]

Schnelle alte Syntax

let appVer: AnyObject? = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"]

2
extension UIApplication {

    static var appVersion: String {
        if let appVersion = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") {
            return "\(appVersion)"
        } else {
            return ""
        }
    }

    static var build: String {
        if let buildVersion = NSBundle.mainBundle().objectForInfoDictionaryKey(kCFBundleVersionKey as String) {
            return "\(buildVersion)"
        } else {
            return ""
        }
    }

    static var versionBuild: String {
        let version = UIApplication.appVersion
        let build = UIApplication.build

        var versionAndBuild = "v\(version)"

        if version != build {
            versionAndBuild = "v\(version)(\(build))"
        }

        return versionAndBuild
    }

}

Achtung: Sie sollten verwenden, wenn Sie dies hier zulassen, falls die App-Version oder der Build nicht festgelegt ist. Dies führt zu einem Absturz, wenn Sie versuchen, diese zu verwenden! auspacken.


2

Hier ist eine aktualisierte Version für Swift 3.2:

extension UIApplication
{
    static var appVersion:String
    {
        if let appVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString")
        {
            return "\(appVersion)"
        }
        return ""
    }

    static var buildNumber:String
    {
        if let buildNum = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String)
        {
            return "\(buildNum)"
        }
        return ""
    }

    static var versionString:String
    {
        return "\(appVersion).\(buildNumber)"
    }
}

2

Sie können jetzt eine Konstante dafür verwenden, anstatt wie zuvor streng typisierten Code verwenden zu müssen, was die Dinge noch komfortabler macht.

var appVersion: String {
    return Bundle.main.infoDictionary![kCFBundleVersionKey as String] as! String
}

2
public var appVersionNumberString: String {
    get {
        return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
    }
}

1

SWIFT 4

// Holen Sie sich zuerst das nsObject, indem Sie es als optionales AnyObject definieren

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

// Dann wandle das Objekt einfach als String um, aber sei vorsichtig, vielleicht möchtest du noch einmal nach Null suchen

let version = nsObject as! String

1

Für alle Interessierten gibt es eine schöne und gepflegte Bibliothek mit dem Namen SwifterSwiftverfügbar unter Github und auch für jede Version von schnellen (siehe vollständig dokumentiert swifterswift.com ).

Mit dieser Bibliothek ist das Lesen der App-Version und der Build-Nummer so einfach:

import SwifterSwift

let buildNumber = SwifterSwift.appBuild
let version = SwifterSwift.appVersion

1

Update für Swift 5

Hier ist eine Funktion, mit der ich entscheide, ob eine Seite "Die App aktualisiert" angezeigt werden soll oder nicht. Es gibt die Build-Nummer zurück, die ich in ein Int konvertiere:

if let version: String = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
        guard let intVersion = Int(version) else { return }

        if UserDefaults.standard.integer(forKey: "lastVersion") < intVersion {
            print("need to show popup")
        } else {
            print("Don't need to show popup")
        }

        UserDefaults.standard.set(intVersion, forKey: "lastVersion")
    }

Wenn es noch nie zuvor verwendet wurde, wird 0 zurückgegeben, was niedriger als die aktuelle Build-Nummer ist. Um neuen Benutzern einen solchen Bildschirm nicht anzuzeigen, fügen Sie einfach die Build-Nummer nach der ersten Anmeldung oder nach Abschluss des Onboarding hinzu.


1

Für Swift 5.0 :

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

1

Einfache Dienstprogrammfunktion zum Zurückgeben der App-Version als Int

func getAppVersion() -> Int {

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

            let appVersionClean = appVersion.replacingOccurrences(of: ".", with: "", options: NSString.CompareOptions.literal, range:nil)

            if let appVersionNum = Int(appVersionClean) {
                return appVersionNum
            }
        }
        return 0
    }

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

1

Bundle + Extension.swift (SwiftUI, Swift 5, Xcode 11)

Ich habe Ideen aus einigen Antworten kombiniert und ein wenig erweitert:

  • ein SwiftUI-Beispiel
  • Zeigt ein Warndreieck-Emoticon an (anstatt die App zum Absturz zu bringen), wenn der Schlüssel in der Info.plist fehlt

Foundation importieren

Erweiterungspaket {

public var appVersionShort: String? {
    if let result = infoDictionary?["CFBundleShortVersionString"] as? String {
        return result
    } else {
        return "⚠️"
    }
}
public var appVersionLong: String? {
    if let result = infoDictionary?["CFBundleVersion"] as? String {
        return result
    } else {
        return "⚠️"
    }
}
public var appName: String? {
    if let result = infoDictionary?["CFBundleName"] as? String {
        return result
    } else {
        return "⚠️"
    }
}

}}


SwiftUI Beispiel verwenden

VStack {

     Text("Version: \(Bundle.main.appVersionShort!) (\(Bundle.main.appVersionLong!))")
                    .font(.subheadline)
                    .frame(maxWidth: .infinity, maxHeight: .infinity)
}

0
if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
        lblVersion.text = "Version \(version)"

    }
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.