Swift ile Sürüm ve Derleme Bilgilerini Alma


92

Sürüm ve Derleme bilgilerini almak için Ana NSBundle'a erişim sağlamaya çalışıyorum. Mesele şu ki, hızlı bir şekilde denemek istiyorum, onu Objective-C ile nasıl geri alacağımı biliyorum Build.text = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];. Yine de swift ile nereden başlayacağımı bilmiyorum, onu yeni sözdiziminde boşuna yazmaya çalıştım.


2
Zaten yaptığınız denemeleri gösterin. Objective-C uygulamasına çok benzer.
Mick MacCallum

Ocak 2017 swift 2.3: let sVer = NSBundle.mainBundle (). İnfoDictionary? ["CFBundleShortVersionString"] olarak? String let sBuild = NSBundle.mainBundle (). İnfoDictionary? ["CFBundleVersion"] olarak? String self.myVersionLabel.text = Dize (format: "Sürüm% @ Yapı% @", sVer !, sBuild!)
Matthew Ferguson

Yanıtlar:


167

Swift sözdizimindeki sorun neydi? Bu işe yarıyor gibi görünüyor:

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

2
Bu neden reddedildi? Sanırım daha doğal olabilir letama başka türlü doğru görünüyor.
Tommy

Ah, "as String" i unuttum, böylece değişken onu bir dizge olarak kabul edecek. Teşekkür ederim.
Ken-UbiDex

2
Bu XCode 6 beta 3 ile bozulmuş görünüyor
Frédéric Adda

2
Bu benim için Xcode 6 beta 5'te çalıştı:let text = NSBundle.mainBundle().infoDictionary["CFBundleVersion"]! as String
E. Barnes

@Dean İsteğe bağlı olarak dönmek için infoDictionary değiştirilmiş gibi görünüyor. Cevabı düzenledim
Connor

118

Swift 3/4 Sürümü

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

Swift 2.x Sürümü

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

burada görüldüğü gibi .


1
Aynı anahtarı iki kez alırsınız, sürüm için "CFBundleVersion" kullanmalısınız. Sanırım bir kopya / geçmiş yazım hatası :)
foOg

Teşekkürler @foOg bir yazım hatasıydı. Aslında geriye doğru: kısa olan versiyon, normal olan ise yapı. Garip, biliyorum.
Dan Rosenstark

Swift 3 versiyonu. let infoPath = Bundle.main.path (forResource: "Info.plist", ofType: nil), let infoAttr = try? FileManager.default.attributesOfItem (atPath: infoPath), let infoDate = infoAttr [.creationDate] olarak? Tarih {return infoDate} dönüş Tarihi ()
Ryan X

18

Xcode 6'nın son sürümü için şunu kullanın:

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

"?" infoDictionary sonra karakter burada önemlidir


1
Lanet olsun. Eminim bu "isteğe bağlı mı?" sistem, kristal berraklığında ve okunması çok kolay!
Jeroen Bouma

14

Build ve version'ı edinmenin basit yolu.

Swift 4.X için

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

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

Amaç C için

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

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

Herhangi bir sorun olursa bana bildirin. Bu benim için çalışıyor.


13

Swifty için yolu AppName, AppVersionve 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))."
   }
}

Değerleri neden açmanız gerekiyor? Bildiğim kadarıyla bu değerlerden herhangi birinin sıfır olması imkansız
Michael

@Michael bazı kişiler HER ZAMAN isteğe bağlı değerleri açarlar. Bazı insanlar haklı olduğunu söylüyor.
Dan Rosenstark

2
Bundle.maininfoDictionarybenim için bir boş vardı ; belki de bunu yürütülebilir bir uygulama veya uygulamadan değil bir çerçeveden yaptığım için? Bundle(for: MyClass.self)beklenen değerleri içerir.
Raphael

7

Hızlı olarak, bunu UIApplication için bir uzantı olarak yapardım, şöyle:

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

O zaman ihtiyacınız olan her şeyi elde etmek için aşağıdakileri kullanabilirsiniz:

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

7

// Uygulamanın sürüm numarasını döndürür

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

// Uygulamanın derleme numarasını döndür

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

6

Swift 5.0

Swift 5 için uygulamayla ilgili bazı dizeleri tüm uygulamalarımda tek bir yerde AppInfo adı verilen bir sarmalayıcı oluşturdum .

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

Bunu şu şekilde kullanabilirsiniz:

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

Swift'de bir değer bulunmadığında sıfır kullanılır. IMO özel yer tutucu dizeleri yerine nil döndürmelisiniz.
Luca Angeletti

Bu yüzden bir paketleyicidir: Her zaman bir şeyi geri almak için. Sıfır durum gerçekten "yok edilmiş" değildir, hala oradadır, ancak önceden ele alınmıştır. Aksi takdirde, uygulamanızın başka bir yerinde "sıfır" durumunu ele almanız gerekir.
LukeSideWalker

teşekkürler dostum. ayrıca, son küme ayracı kod bloğunun dışındadır. :)
Mark Perkins

2
uygulama adı da olabilirCFBundleDisplayName
gondo

2

Bu kod Swift 3, Xcode 8 için çalışır:

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

2

Swift 3 için, NSBundle'ı Bundle ile değiştirin ve mainBundle, basitçe main ile değiştirilir.

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

1

[Güncelleme: Xcode 6.3.1] Yukarıdakilerin hepsini denedim ve bunlardan hiçbiri Xcode 6.3.1'de çalışmıyor ama şunu buldum:

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

1

Diğer bir seçenek de değişkenleri AppDelegate'te tanımlamaktır:

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

AppDelegate'te değişkenler olarak referans verilebilir



0

SWIFT 3 Sürümü

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

Çerçeve için bir sonuç elde etmek için kullanabilirsiniz

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

veya testlerde

let version = Bundle(for: <SomeClass>.self).infoDictionary?["CFBundleShortVersionString"] as? String
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.