How do I get the App version and build number using Swift?

前端 未结 30 853
暖寄归人
暖寄归人 2020-12-22 15:21

I have an IOS app with an Azure back-end, and would like to log certain events, like logins and which versions of the app users are running.

How can I return the ver

相关标签:
30条回答
  • 2020-12-22 15:46

    Here's an updated version for 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)"
        }
    }
    
    0 讨论(0)
  • 2020-12-22 15:47

    Swift 4

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

    Bundle.main.infoDictionary!["CFBundleShortVersionString"]

    Swift old syntax

    let appVer: AnyObject? = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"]
    
    0 讨论(0)
  • 2020-12-22 15:49

    Updated for Swift 3.0

    The NS-prefixes are now gone in Swift 3.0 and several properties/methods have changed names to be more Swifty. Here's what this looks like now:

    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

    I've been working with Frameworks a lot since my original answer, so I wanted to update my solution to something that is both simpler and much more useful in a multi-bundle environment:

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

    Now this extension will be useful in apps to identify both the main bundle and any other included bundles (such as a shared framework for extension programming or third frameworks like AFNetworking), like so:

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

    Original Answer

    I wanted to improve on some of the answers already posted. I wrote a class extension that can be added to your tool chain to handle this in a more logical fashion.

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

    as? String { return version } return "Version Number Not Available" }

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

    So now you can access this easily by:

    let versionNumber = NSBundle.applicationVersionNumber
    
    0 讨论(0)
  • 2020-12-22 15:50

    Xcode 8, Swift 3:

    let gAppVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "0"
    let gAppBuild = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "0"
    
    0 讨论(0)
  • 2020-12-22 15:51

    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))"
        }
    }
    
    0 讨论(0)
  • 2020-12-22 15:51

    SWIFT 4

    //First get the nsObject by defining as an optional AnyObject

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

    //Then just cast the object as a String, but be careful, you may want to double check for nil

    let version = nsObject as! String
    
    0 讨论(0)
提交回复
热议问题