首页 文章

如何使用Swift获取App版本和内部版本号?

提问于
浏览
266

我有一个带有Azure后端的IOS应用程序,并且想要记录某些事件,例如登录以及正在运行的应用程序用户的哪个版本 .

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

22 回答

  • 1

    Xcode 9.4.1 Swift 4.1

    请注意使用localizedInfoDictionary来获取捆绑显示名称的正确语言版本 .

    var displayName: String?
    var version: String?
    var build: String?
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        // Get display name, version and build
    
        if let displayName = Bundle.main.localizedInfoDictionary?["CFBundleDisplayName"] as? String {
            self.displayName = displayName
        }
        if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
            self.version = version
        }
        if let build = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
            self.build = build
        }
    }
    
  • -1

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

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

    看过文档后,我相信以下内容更清晰:

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

    Source:"Use of this method is preferred over other access methods because it returns the localized value of a key when one is available."

  • 2

    对于Swift 1.2,它是:

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

    EDIT

    针对Swift 4.2进行了更新

    let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"] as? String
    

    EDIT

    正如@azdev在Xcode的新版本中所指出的那样,你会在尝试我之前的解决方案时遇到编译错误,解决这个问题只需按照建议进行编辑即可使用!来解开捆绑字典!

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

    End Edit

    只需使用与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
    

    我希望这能够帮到你 .

    大卫

  • 204

    我知道这已经得到了回答,但我个人认为这有点清洁:

    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
    }
    

    这样,if let版本负责条件处理(在我的情况下设置标签文本),如果infoDictionary或CFBundleShortVersionString为nil,则可选的展开将导致代码被跳过 .

  • 12

    Updated for Swift 3.0

    NS -prefix现在已经在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
    

    Old Updated Answer

    自从我的原始答案以来,我一直在使用Frameworks,所以我想将我的解决方案更新为更简单且在多捆绑环境中更有用的东西:extension NSBundle {

    var releaseVersionNumber:String? {
    返回self.infoDictionary?[“CFBundleShortVersionString”]为?串
    }

    var buildVersionNumber:String? {
    返回self.infoDictionary?[“CFBundleVersion”]为?串
    }

    }
    现在,这个扩展将在应用程序中用于识别主包和任何其他包含的包(例如扩展编程的共享框架或AFNetworking等第三个框架),如下所示:NSBundle.mainBundle() . releaseVersionNumber
    NSBundle.mainBundle() . buildVersionNumber

    // 要么...

    NSBundle(URL:someURL)?. releaseVersionNumber
    NSBundle(URL:someURL)? . buildVersionNumber


    Original Answer

    我想改进一些已发布的答案 . 我编写了一个类扩展,可以添加到您的工具链中,以更合理的方式处理它 . 扩展名NSBundle {

    class var applicationVersionNumber:String {
    如果让版本= NSBundle.mainBundle() . infoDictionary?[“CFBundleShortVersionString”]
    如? String
    返回“版本号不可用”} class var applicationBuildNumber:String {
    如果让build = NSBundle.mainBundle() . infoDictionary?[“CFBundleVersion”]为?字符串{
    返回构建
    }
    返回“内部版本号不可用”
    }

    }
    所以现在您可以通过以下方式轻松访问:let versionNumber = NSBundle.applicationVersionNumber

  • 256

    我也知道这已经得到了解答,但我结束了以前的答案:

    (*)已更新扩展程序

    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
    

    @Deprecated:旧答案

    Swift 3.1

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

    For older versions

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

    因此,如果您想设置标签文本或想要在其他地方使用;

    self.labelVersion.text = getVersion()
    
  • 4

    我在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))"
    
  • 3

    对于 Swift 4.0

    let version = Bundle.main.infoDictionary!["CFBundleShortVersionString"]!
    let build = Bundle.main.infoDictionary!["CFBundleVersion"]!
    
  • 1

    对于Swift 3.0,NSBundle不起作用,以下代码完美运行 .

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

    而对于构建号,它是:

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

    令人困惑'CFBundleVersion'是在General-> Identity上的Xcode中输入的 build 数字 .

  • 1

    Xcode 8, Swift 3:

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

    Swift 3:

    版本号

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

    内部编号

    if let buildNumberString = Bundle.main.infoDictionary?["CFBundleVersion"] as? String { // do something }
    
  • 16

    Swift 4

    func getAppVersion() -> String {
        return "\(Bundle.main.infoDictionary!["CFBundleShortVersionString"] ?? "")"
    }
    

    Bundle.main.infoDictionary![“CFBundleShortVersionString”]

    Swift old syntax

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

    Swift 4, useful Extension for Bundle

    import Foundation
    
    public extension Bundle {
    
        public var shortVersion: String {
            if let result = infoDictionary?["CFBundleShortVersionString"] as? String {
                return result
            } else {
                assert(false)
                return ""
            }
        }
    
        public var buildVersion: String {
            if let result = infoDictionary?["CFBundleVersion"] as? String {
                return result
            } else {
                assert(false)
                return ""
            }
        }
    
        public var fullVersion: String {
            return "\(shortVersion)(\(buildVersion))"
        }
    }
    
  • 10
    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
        }
    
    }
    

    注意:如果你没有设置app版本或版本,你应该使用if here,如果你试图使用会导致崩溃!打开包装 .

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

    这是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)"
        }
    }
    
  • 25

    SWIFT 4

    //首先通过定义为可选的AnyObject来获取nsObject

    let nsObject: AnyObject? = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as AnyObject
    

    //然后将对象强制转换为String,但要小心,您可能需要仔细检查nil

    let version = nsObject as! String
    
  • 9

    对于任何感兴趣的人来说,有一个很好的,整洁的库叫做 SwifterSwift ,可以在github找到,并且每个版本的swift都有完整的文档(参见swifterswift.com) .

    使用这个库,阅读应用程序版本和内部版本号就像这样简单:

    import SwifterSwift
    
    let buildNumber = SwifterSwift.appBuild
    let version = SwifterSwift.appVersion
    
  • 25

    Bundle Extensions.swift

    import Foundation
    
    extension Bundle {
        var versionNumber: String? {
            return infoDictionary?["CFBundleShortVersionString"] as? String
        }
    
        var buildNumber: String? {
            return infoDictionary?["CFBundleVersion"] as? String
        }
    
        var bundleName: String? {
            return infoDictionary?["CFBundleName"] as? String
        }
    }
    

    用法:

    someLabel.text = Bundle.main.versionNumber
    
  • 55

    对于 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
    

相关问题