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.