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.

Ken-UbiDex
sumber
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)
}
Connor
sumber
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 .

Dan Rosenstark
sumber
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

JulianM
sumber
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.

Ashu
sumber
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))."
   }
}
Chris
sumber
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)
Jiri Trecak
sumber
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
}
Pratyush Pratik
sumber
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)")
LukeSideWalker
sumber
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"
Crashalot
sumber
2

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

let AppVersion = Bundle.main.infoDictionary!["CFBundleVersion"] as! String
Tarika Chawla
sumber
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)!
SunburstEnzo
sumber
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

pengguna3620768
sumber
0

Cepat 3:

let textVersion
 = Bundle.main.infoDictionary?["CFBundleVersion"] as? String
Zvonimir Taslak
sumber
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()
Ryan X
sumber
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
yoAlex5
sumber