如何使用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