Mendapatkan Versi dan Info Bangun dengan Swift


92

Saya mencoba untuk mendapatkan akses ke NSBundle Utama untuk mengambil informasi Versi dan Bangun. Masalahnya, saya ingin mencobanya dengan cepat, saya tahu cara mendapatkannya kembali di Objective-C dengan Build.text = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];. Namun saya tidak tahu harus mulai dari mana dengan swift, saya telah mencoba menulisnya di sintaks baru tanpa hasil.


2
Tunjukkan upaya yang telah Anda lakukan. Ini sangat mirip dengan implementasi Objective-C.
Mick MacCallum

Jan 2017 swift 2.3: let sVer = NSBundle.mainBundle (). InfoDictionary? ["CFBundleShortVersionString"] sebagai? String let sBuild = NSBundle.mainBundle (). InfoDictionary? ["CFBundleVersion"] sebagai? String self.myVersionLabel.text = String (format: "Version% @ Build% @", sVer !, sBuild!)
Matthew Ferguson

Jawaban:


167

Apa yang salah dengan sintaks Swift? Ini sepertinya berhasil:

if let text = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
    print(text)
}

2
Mengapa ini tidak disukai? Saya kira itu mungkin lebih alami lettetapi sebaliknya terlihat benar.
Tommy

Ah, saya lupa "sebagai String" sehingga variabel akan menerimanya sebagai string. Terima kasih.
Ken-UbiDex

2
Itu tampaknya rusak dengan XCode 6 beta 3
Frédéric Adda

2
Ini bekerja untuk saya di Xcode 6 beta 5:let text = NSBundle.mainBundle().infoDictionary["CFBundleVersion"]! as String
E. Barnes

@Dean Sepertinya mereka mengubah infoDictionary untuk mengembalikan opsional. Saya telah mengedit jawabannya
Connor

118

Versi Swift 3/4

func version() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as! String
    let build = dictionary["CFBundleVersion"] as! String
    return "\(version) build \(build)"
} 

Versi Swift 2.x.

func version() -> String {
    let dictionary = NSBundle.mainBundle().infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as String
    let build = dictionary["CFBundleVersion"] as String
    return "\(version) build \(build)"
}

seperti yang terlihat di sini .


1
Anda mendapatkan kunci yang sama dua kali, harus menggunakan "CFBundleVersion" untuk versi. Saya kira itu adalah salinan / kesalahan ketik sebelumnya :)
untuk

Terima kasih @foOg, itu salah ketik. Faktanya itu mundur: yang pendek adalah versinya, yang biasa adalah build. Aneh, saya tahu.
Dan Rosenstark

Versi Swift 3. jika let infoPath = Bundle.main.path (forResource: "Info.plist", ofType: nil), biarkan infoAttr = coba? FileManager.default.attributesOfItem (atPath: infoPath), biarkan infoDate = infoAttr [.creationDate] sebagai? Tanggal {return infoDate} Tanggal kembali ()
Ryan X

18

Untuk rilis final penggunaan Xcode 6

NSBundle.mainBundle().infoDictionary?["CFBundleVersion"] as? String

The "?" karakter setelah infoDictionary penting di sini


1
Sial. Saya yakin suka semua ini "opsional ?, buka!" sistem, sangat jelas dan sangat mudah dibaca!
Jeroen Bouma

14

Berikut cara sederhana untuk mendapatkan Build dan versinya.

Untuk Swift 4.X

 if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
     print(version)
   }

 if let build = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
     print(build)
   }

Untuk Tujuan C

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

NSString * currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];

Beri tahu saya jika ada masalah. Ini bekerja untuk saya.


13

Cara cepat untuk AppName, AppVersiondan BuildNumber...

if let dict = NSBundle.mainBundle().infoDictionary {
   if let version = dict["CFBundleShortVersionString"] as? String,
       let bundleVersion = dict["CFBundleVersion"] as? String,
       let appName = dict["CFBundleName"] as? String {
           return "You're using \(appName) v\(version) (Build \(bundleVersion))."
   }
}

Mengapa Anda perlu membuka bungkus nilainya? Sepengetahuan saya, tidak mungkin nilai-nilai tersebut menjadi nol
Michael

@Michael beberapa orang SELALU membuka bungkus nilai opsional. Beberapa orang mengatakan Anda benar.
Dan Rosenstark

2
Bundle.mainmemiliki yang kosong infoDictionaryuntukku; mungkin karena saya melakukannya dari dalam kerangka kerja, bukan yang dapat dieksekusi atau aplikasi? Bundle(for: MyClass.self)berisi nilai yang diharapkan.
Raphael

7

Secara cepat, saya akan menjadikannya sebagai ekstensi untuk aplikasi UIA, seperti ini:

extension UIApplication {

    func applicationVersion() -> String {

        return NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
    }

    func applicationBuild() -> String {

        return NSBundle.mainBundle().objectForInfoDictionaryKey(kCFBundleVersionKey as String) as! String
    }

    func versionBuild() -> String {

        let version = self.applicationVersion()
        let build = self.applicationBuild()

        return "v\(version)(\(build))"
    }
}

Maka Anda bisa menggunakan yang berikut ini untuk mendapatkan semua yang Anda butuhkan:

let version = UIApplication.sharedApplication.applicationVersion() // 1
let build = UIApplication.sharedApplication.applicationBuild() // 80
let both = UIApplication.sharedApplication.versionBuild() // 1(80)

7

// Mengembalikan nomor versi aplikasi

public static var appVersion: String? {
    return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String
}

// Kembalikan nomor build aplikasi

public static var appBuild: String? {
    return Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as? String
}

6

Swift 5.0.0

Saya membuat pembungkus untuk Swift 5 untuk mendapatkan beberapa string terkait aplikasi di satu tempat di semua aplikasi saya, yang disebut AppInfo .

struct AppInfo {

var appName : String {
    return readFromInfoPlist(withKey: "CFBundleName") ?? "(unknown app name)"
}

var version : String {
    return readFromInfoPlist(withKey: "CFBundleShortVersionString") ?? "(unknown app version)"
}

var build : String {
    return readFromInfoPlist(withKey: "CFBundleVersion") ?? "(unknown build number)"
}

var minimumOSVersion : String {
    return readFromInfoPlist(withKey: "MinimumOSVersion") ?? "(unknown minimum OSVersion)"
}

var copyrightNotice : String {
    return readFromInfoPlist(withKey: "NSHumanReadableCopyright") ?? "(unknown copyright notice)"
}

var bundleIdentifier : String {
    return readFromInfoPlist(withKey: "CFBundleIdentifier") ?? "(unknown bundle identifier)"
}

var developer : String { return "my awesome name" }

// lets hold a reference to the Info.plist of the app as Dictionary
private let infoPlistDictionary = Bundle.main.infoDictionary

/// Retrieves and returns associated values (of Type String) from info.Plist of the app.
private func readFromInfoPlist(withKey key: String) -> String? {
    return infoPlistDictionary?[key] as? String
     }
}

Anda dapat menggunakannya seperti ini:

print("The apps name = \(AppInfo.appname)")

Saat di Swift nilai tidak tersedia, nihil digunakan. IMO Anda harus mengembalikan nihil sebagai ganti string placeholder kustom.
Luca Angeletti

Itulah mengapa ini adalah pembungkus: Untuk selalu mendapatkan sesuatu kembali. Situasi nihil tidak benar-benar "dihancurkan", itu masih ada, tetapi sudah ditangani sebelumnya. Jika tidak, Anda harus menangani situasi "nil" di tempat lain dalam aplikasi Anda.
LukeSideWalker

terima kasih kawan. juga, kurung kurawal terakhir Anda berada di luar blok kode. :)
Mark Perkins

2
nama aplikasi juga bisaCFBundleDisplayName
gondo

2

Kode ini berfungsi untuk Swift 3, Xcode 8:

let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "0"
let build = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "0"

2

Untuk Swift 3, Ganti NSBundle dengan Bundle dan mainBundle diganti hanya dengan main.

let AppVersion = Bundle.main.infoDictionary!["CFBundleVersion"] as! String

1

[Perbarui: Xcode 6.3.1] Saya mencoba semua cara di atas dan tidak ada yang berfungsi di Xcode 6.3.1 tetapi saya menemukan bahwa ini berfungsi:

(NSBundle.mainBundle().infoDictionary?["CFBundleVersion"] as? String)!

1

Opsi lainnya adalah menentukan di AppDelegate variabel:

var applicationVersion:String {
    return NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
}
var applicationBuild:String  {
    return NSBundle.mainBundle().objectForInfoDictionaryKey(kCFBundleVersionKey as String) as! String
}
var versionBuild:String  {
    let version = self.applicationVersion
    let build = self.applicationBuild
    return "version:\(version) build:(\(build))"
}

yang bisa dirujuk sebagai variabel di AppDelegate


0

Cepat 3:

let textVersion
 = Bundle.main.infoDictionary?["CFBundleVersion"] as? String

0

Versi SWIFT 3

if let infoPath = Bundle.main.path(forResource: "Info.plist", ofType: nil),
        let infoAttr = try? FileManager.default.attributesOfItem(atPath: infoPath),
        let infoDate = infoAttr[.creationDate] as? Date
{
    return infoDate
}
return Date()

0

Untuk mendapatkan hasil untuk kerangka yang dapat Anda gunakan

let version = Bundle(for: type(of: self)).infoDictionary?["CFBundleShortVersionString"] as? String

atau dalam ujian

let version = Bundle(for: <SomeClass>.self).infoDictionary?["CFBundleShortVersionString"] as? String
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.