如何使用Swift获取应用程序版本和内部版本号?

我有一个Azure后端IOS应用程序,并希望logging某些事件,如login和应用程序用户正在运行的版本。

我如何使用Swift返回版本和内部版本号?

编辑

正如@azdev在新版本的Xcode中所指出的那样,您将在尝试我以前的解决scheme时得到一个编译错误,要解决这个问题,请按照build议使用!

 let nsObject: AnyObject? = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"] 

结束编辑

只需使用与Objective-C相同的逻辑,但只需稍作更改即可

 //First get the nsObject by defining as an optional anyObject let nsObject: AnyObject? = NSBundle.mainBundle().infoDictionary["CFBundleShortVersionString"] //Then just cast the object as a String, but be careful, you may want to double check for nil let version = nsObject as String 

我希望这能够帮到你。

大卫

我知道这已经回答,但我个人认为这是一个小清洁剂:

Swift 3.0:

  if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String { self.labelVersion.text = version } 

Swift <2.3

 if let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String { self.labelVersion.text = version } 

这样,如果让版本照顾条件处理(在我的情况下设置标签文本),如果infoDictionary或CFBundleShortVersionString是零的可选展开将导致代码被跳过。

更新了Swift 3.0

NS -prefixes现在在Swift 3.0中消失了,一些属性/方法的名称更改为Swifty。 这是现在的样子:

 extension Bundle { var releaseVersionNumber: String? { return infoDictionary?["CFBundleShortVersionString"] as? String } var buildVersionNumber: String? { return infoDictionary?["CFBundleVersion"] as? String } } Bundle.main.releaseVersionNumber Bundle.main.buildVersionNumber 

旧的更新的答案

自从我原来的答案以来,我一直在使用Frameworks,所以我想将我的解决scheme更新为在多捆绑环境中更简单和更有用的解决scheme:

 extension NSBundle { var releaseVersionNumber: String? { return self.infoDictionary?["CFBundleShortVersionString"] as? String } var buildVersionNumber: String? { return self.infoDictionary?["CFBundleVersion"] as? String } } 

现在,这个扩展在应用程序中很有用,可以识别主包和任何其他包含的包(例如扩展编程的共享框架或AFNetworking等第三个框架),如下所示:

 NSBundle.mainBundle().releaseVersionNumber NSBundle.mainBundle().buildVersionNumber // or... NSBundle(URL: someURL)?.releaseVersionNumber NSBundle(URL: someURL)?.buildVersionNumber 

原始答复

我想改善一些已经发布的答案。 我写了一个类扩展,可以添加到您的工具链来处理这个更合乎逻辑的方式。

 extension NSBundle { class var applicationVersionNumber: String { if let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] 

如? string{返回版本}返回“版本号不可用”}

 class var applicationBuildNumber: String { if let build = NSBundle.mainBundle().infoDictionary?["CFBundleVersion"] as? String { return build } return "Build Number Not Available" } } 

所以现在你可以通过以下方式轻松访问:

 let versionNumber = NSBundle.applicationVersionNumber 

我也知道这已经被回答了,但我把以前的答案包括在内:

更新了扩展名

 extension Bundle { var releaseVersionNumber: String? { return infoDictionary?["CFBundleShortVersionString"] as? String } var buildVersionNumber: String? { return infoDictionary?["CFBundleVersion"] as? String } var releaseVersionNumberPretty: String { return "v\(releaseVersionNumber ?? "1.0.0")" } } 

用法:

 someLabel.text = Bundle.main.releaseVersionNumberPretty 

旧的答案

更新了Swift 3.1:

 class func getVersion() -> String { guard let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String else { return "no version info" } return version } 

对于旧版本:

 class func getVersion() -> String { if let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String { return version } return "no version info" } 

所以如果你想设置标签文本或想要在别的地方使用;

 self.labelVersion.text = getVersion() 

我在Bundle上做了一个扩展

 extension Bundle { var appName: String { return infoDictionary?["CFBundleName"] as! String } var bundleId: String { return bundleIdentifier! } var versionNumber: String { return infoDictionary?["CFBundleShortVersionString"] as! String } var buildNumber: String { return infoDictionary?["CFBundleVersion"] as! String } } 

然后使用它

 versionLabel.text = "\(Bundle.main.appName) v \(Bundle.main.versionNumber) (Build \(Bundle.main.buildNumber))" 

对于Swift 3.0 NSBundle不起作用,下面的代码完美地工作。

 let versionNumberString = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String 

而只是build立号码,它是:

 let buildNumberString = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String 

混淆'CFBundleVersion'是在常规 – >身份的Xcode中input的内部版本号。

Xcode 8,Swift 3:

 let gAppVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "0" let gAppBuild = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "0" 

我的回答(截至2015年8月),Swift不断发展:

 let version = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String 

对于Swift 1.2来说:

 let version = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"] as! String let build = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String 

看了文档,我相信以下是更清洁的:

 let version = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as? String 

来源 :“使用此方法优于其他访问方法,因为它返回一个可用的密钥的本地化值。

Swift 3:

版本号

 if let versionNumberString = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String { // do something } 

内部编号

 if let buildNumberString = Bundle.main.infoDictionary?["CFBundleVersion"] as? String { // do something } 
 extension UIApplication { static var appVersion: String { if let appVersion = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") { return "\(appVersion)" } else { return "" } } static var build: String { if let buildVersion = NSBundle.mainBundle().objectForInfoDictionaryKey(kCFBundleVersionKey as String) { return "\(buildVersion)" } else { return "" } } static var versionBuild: String { let version = UIApplication.appVersion let build = UIApplication.build var versionAndBuild = "v\(version)" if version != build { versionAndBuild = "v\(version)(\(build))" } return versionAndBuild } } 

注意:你应该使用,如果让这里的应用程序版本或构build没有设置,这将导致崩溃,如果你尝试使用! 打开。

 public var appVersionNumberString: String { get { return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String } } 

这里是Swift 3.2的更新版本:

 extension UIApplication { static var appVersion:String { if let appVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") { return "\(appVersion)" } return "" } static var buildNumber:String { if let buildNum = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) { return "\(buildNum)" } return "" } static var versionString:String { return "\(appVersion).\(buildNumber)" } } 

对于Swift 2.0

 //First get the nsObject by defining as an optional anyObject let nsObject: AnyObject? = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"] let version = nsObject as! String