【问题标题】:How do I get the current version of my iOS project in code?如何在代码中获取我的 iOS 项目的当前版本?
【发布时间】:2011-11-28 08:20:31
【问题描述】:

我希望能够将我的 iOS 项目/应用程序的当前版本作为NSString 对象获取,而不必在某个文件中定义常量。我不想在 2 个地方更改我的版本值。

当我在项目目标摘要中更新我的版本时,需要更新该值。

【问题讨论】:

    标签: ios objective-c iphone swift


    【解决方案1】:

    您可以通过以下方式获取版本号和内部版本号:

    let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
    let build = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String
    

    或在 Objective-C 中

    NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"];
    NSString * build = [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey];
    

    我在UIApplication 的一个类别中有以下方法:

    extension UIApplication {
    
        static var appVersion: String {
            return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
        }
    
        static var appBuild: String {
            return Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String
        }
    
        static var versionBuild: String {
            let version = appVersion, build = appBuild            
            return version == build ? "v\(version)" : "v\(version)(\(build))"
        }
    }
    

    要点: https://gist.github.com/ashleymills/6ec9fce6d7ec2a11af9b


    这是 Objective-C 中的等价物:

    + (NSString *) appVersion
    {
        return [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"];    
    }
    
    + (NSString *) build
    {
        return [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey];
    }
    
    + (NSString *) versionBuild
    {
        NSString * version = [self appVersion];
        NSString * build = [self build];
    
        NSString * versionBuild = [NSString stringWithFormat: @"v%@", version];
    
        if (![version isEqualToString: build]) {
            versionBuild = [NSString stringWithFormat: @"%@(%@)", versionBuild, build];
        }
    
        return versionBuild;
    }
    

    要点: https://gist.github.com/ashleymills/c37efb46c9dbef73d5dd

    【讨论】:

    • 你可以使用这个 [[NSBundle mainBundle]objectForInfoDictionaryKey:@"CFBundleVersion"] 而不是 [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey]。前者似乎与 [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"];所以现在它变得很容易记住了
    • @Duraiamuthan 我建议使用(NSString *)kCFBundleVersionKey 而不是@"CFBundleVersion"。即使键入时间较长(自动完成在这里会有所帮助),因为它是一个常量,它会在编译时进行检查。
    • 顺便说一句,在NSBundle 而不是UIApplication 上进行此扩展会更准确,这也将允许用实例调用替换静态调用。
    • @Zapko - 我不同意。从概念上讲,这符合UIApplication,因为返回的信息是关于应用程序的。此外,这仅适用于 main 包 - 将其作为任何包上的实例方法是没有意义的。
    • 当你说appBundle(在你的代码的第二行)时,你是说build吗?
    【解决方案2】:

    以下是 Xcode 8、Swift 3 的工作原理:

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

    【讨论】:

      【解决方案3】:

      在目标 C 中:

      1)要获取应用版本,您必须使用:

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

      2) 要获取 Build 版本,您必须使用:

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

      【讨论】:

        【解决方案4】:

        [Swift 版本:5.2]

        所有 iOS 应用都必须在其 Info.plist 文件中存储应用版本号,但没有内置方法可以将其作为可在代码中使用的字符串。

        我为 UIApplication 创建了一个小扩展,它读取 Info.plist 文件并自动返回版本号。

        代码如下:

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

        在你的控制器内部

        @IBOutlet weak var tv_version: UILabel!
        override func viewDidLoad() {
            super.viewDidLoad()
           
            //Display Version
            setUpCurrentVersion()
        }
        
        
        func setUpCurrentVersion(){
            tv_version.text = "v" + UIApplication.appVersion!
        }
        

        【讨论】:

          【解决方案5】:

          在 Swift 中,您可以通过以下方式获取 bundle 版本:

          let info:NSDictionary = NSBundle.mainBundle().infoDictionary!
          
          let version:String = info.objectForKey("CFBundleShortVersionString") as! String
          
          versionLabel.text = "Version:" + version
          

          【讨论】:

            【解决方案6】:

            我的一个开源项目App Update Tracker以类方法的形式提供了这个功能(以及更多):

            • + (NSString *)getShortVersionString
            • + (NSString *)getLongVersionString

            你会这样使用它:

            #import "AppUpdateTracker.h"
            
            NSLog(@"short version: %@", [AppUpdateTracker getShortVersionString]);
            NSLog(@"long version: %@", [AppUpdateTracker getLongVersionString]);
            

            【讨论】:

              【解决方案7】:

              所以这里有一个分别用于这两个的 Swift 版本:

              let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
              let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String
              

              它包含在这个 repo 中,检查一下:

              https://github.com/goktugyil/EZSwiftExtensions

              【讨论】:

              【解决方案8】:

              仅供参考

              要获取任何键的本地化值,您应该使用CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)

              【讨论】:

                猜你喜欢
                • 2013-04-22
                • 1970-01-01
                • 2015-09-08
                • 2013-08-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-11-01
                相关资源
                最近更新 更多