Nhận thông tin về phiên bản và xây dựng với Swift


92

Tôi đang cố gắng giành quyền truy cập vào Nhóm NSB chính để truy xuất thông tin Phiên bản và Bản dựng. Điều đó là, tôi muốn thử nó nhanh chóng, tôi biết cách lấy nó trong Objective-C với Build.text = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];. Tuy nhiên, tôi không biết bắt đầu từ đâu với swift, tôi đã cố gắng viết nó theo cú pháp mới nhưng không có kết quả.


2
Hiển thị những nỗ lực bạn đã thực hiện. Nó rất giống với việc triển khai Objective-C.
Mick MacCallum

Tháng 1 năm 2017 swift 2.3: let sVer = NSBundle.mainBundle (). InfoDictionary? ["CFBundleShortVersionString"] là? Chuỗi let sBuild = NSBundle.mainBundle (). InfoDictionary? ["CFBundleVersion"] là? String self.myVersionLabel.text = String (định dạng: "Phiên bản% @ Build% @", sVer !, sBuild!)
Matthew Ferguson

Câu trả lời:


167

Điều gì đã xảy ra với cú pháp Swift? Điều này dường như hoạt động:

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

2
Tại sao điều này bị phản đối? Tôi đoán nó có thể tự nhiên hơn letnhưng nếu không thì có vẻ đúng.
Tommy

À, tôi quên "as String" nên biến sẽ chấp nhận nó là một chuỗi. Cảm ơn bạn.
Ken-UbiDex

2
Đó dường như bị phá vỡ với XCode 6 beta 3
Frédéric Adda

2
Điều này đã làm việc cho tôi trong Xcode 6 beta 5:let text = NSBundle.mainBundle().infoDictionary["CFBundleVersion"]! as String
E. Barnes

@Dean Có vẻ như họ đã thay đổi infoDictionary để trả về một tùy chọn. Tôi đã chỉnh sửa câu trả lời
Connor

118

Phiên bản 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)"
} 

Phiên bản 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)"
}

như đã thấy ở đây .


1
Bạn nhận được cùng một khóa hai lần, nên sử dụng "CFBundleVersion" cho phiên bản. Tôi đoán đó là một bản sao / lỗi đánh máy quá khứ :)
foOg

Cảm ơn @foOg, đó là lỗi đánh máy. Thực tế thì nó ngược lại: cái ngắn là phiên bản, cái thông thường là bản dựng. Kỳ lạ, tôi biết.
Dan Rosenstark

Phiên bản Swift 3. if let infoPath = Bundle.main.path (forResource: "Info.plist", ofType: nil), hãy để infoAttr = thử? FileManager.default.attributesOfItem (atPath: infoPath), hãy để infoDate = infoAttr [.creationDate] là? Ngày {return infoDate} return Date ()
Ryan X

18

Đối với bản phát hành cuối cùng của Xcode 6, hãy sử dụng

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

Các "?" ký tự sau thông tin


1
Chỉ trích. Tôi chắc chắn thích toàn bộ "tùy chọn ?, mở ra!" hệ thống, nó rất rõ ràng và rất dễ đọc!
Jeroen Bouma

14

Đây là cách đơn giản để tải Bản dựng và phiên bản.

Đối với 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)
   }

Đối với Mục tiêu C

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

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

Hãy cho tôi biết nếu bất kỳ vấn đề. Điều này đang làm việc cho tôi.


13

Swifty cách cho AppName, AppVersionBuildNumber...

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

Tại sao bạn cần phải mở các giá trị? Theo hiểu biết của tôi, không thể có bất kỳ giá trị nào trong số đó là con số không
Michael

@Michael một số người LUÔN LUÔN mở các giá trị tùy chọn. Một số người nói rằng bạn đúng.
Dan Rosenstark

2
Bundle.maincó một trống infoDictionarycho tôi; có thể vì tôi đang làm điều đó từ trong khuôn khổ, không phải tệp thực thi hoặc ứng dụng? Bundle(for: MyClass.self)chứa các giá trị mong đợi.
Raphael

7

Trong thời gian nhanh chóng, tôi sẽ đặt nó làm phần mở rộng cho Ứng dụng UIA, như thế này:

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

Sau đó, bạn có thể chỉ cần sử dụng sau đây để có được mọi thứ bạn cần:

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

7

// Trả về số phiên bản của ứng dụng

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

// Trả về số bản dựng của ứng dụng

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

6

Swift 5.0

Tôi đã tạo một trình bao bọc cho Swift 5 để lấy một số chuỗi liên quan đến ứng dụng tại một nơi trong tất cả các ứng dụng của tôi, được gọi là 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
     }
}

Bạn có thể sử dụng nó như vậy:

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

Khi trong Swift, một giá trị không có sẵn thì nil được sử dụng. IMO bạn nên trả về nil thay vì các chuỗi giữ chỗ tùy chỉnh.
Luca Angeletti

Đó là lý do tại sao nó là một cái bao bọc: Để luôn nhận lại được thứ gì đó. Tình huống nil không thực sự bị "tiêu diệt", nó vẫn còn đó, nhưng đã được xử lý trước. Nếu không, bạn sẽ phải xử lý tình huống "nil" ở một nơi khác trong ứng dụng của mình.
LukeSideWalker

cảm ơn nụ. Ngoài ra, dấu ngoặc nhọn cuối cùng của bạn nằm ngoài khối mã. :)
Mark Perkins

2
tên ứng dụng cũng có thể đượcCFBundleDisplayName
gondo

2

Mã này hoạt động cho Swift 3, Xcode 8:

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

2

Đối với Swift 3, Thay thế NSBundle bằng Bundle và mainBundle được thay thế đơn giản bằng chính.

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

1

[Cập nhật: Xcode 6.3.1] Tôi đã thử tất cả các cách trên và không có cách nào trong số này hoạt động trong Xcode 6.3.1 nhưng tôi thấy rằng điều này làm được:

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

1

Một tùy chọn khác là xác định trong AppDelegate các biến:

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

có thể được tham chiếu dưới dạng các biến trong AppDelegate



0

Phiên bản 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

Để có kết quả cho khuôn khổ, bạn có thể sử dụng

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

hoặc trong các bài kiểm tra

let version = Bundle(for: <SomeClass>.self).infoDictionary?["CFBundleShortVersionString"] as? String
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.