【问题标题】:How to programmatically display version/build number of target in iOS app?如何以编程方式在 iOS 应用程序中显示目标的版本/内部版本号?
【发布时间】:2011-03-02 05:49:27
【问题描述】:

如何以编程方式获取target version 的值,如下图所示?

在我的 Xcode 项目目标的“属性”窗口中可以看到。我想在我的应用程序的初始屏幕中显示它,以便我知道人们当前使用的是哪个版本?

【问题讨论】:

    标签: iphone xcode ipad ios-simulator


    【解决方案1】:

    我为 Bundle 做了一个扩展,所以它会很容易使用

    extension Bundle {
        var releaseVersionNumber: String? {
            return infoDictionary?["CFBundleShortVersionString"] as? String
        }
    
        var buildVersionNumber: String? {
            return infoDictionary?["CFBundleVersion"] as? String
        }
    
        var applicationName: String {
            return infoDictionary?["CFBundleDisplayName"] as? String ?? "ADKATech"
        }
    
        var applicationReleaseDate: String {
            return infoDictionary?["ApplicationReleaseDate"] as? String ?? Date().description
        }
    
        var applicationReleaseNumber: Int {
            return infoDictionary?["ApplicationReleaseNumber"] as? Int ?? 0
        }
    
        var releaseVersionNumberPretty: String {
            return "\(releaseVersionNumber ?? "1.0.0")"
        }
    
        var buildVersionNumberPretty: String {
            return "\(buildVersionNumber ?? "1")"
        }
    }
    

    【讨论】:

      【解决方案2】:

      你也可以用like

      var appVersion: String {
        //versionNumber
        let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"
      
        //buildNumber
        let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"
      
        return "Version: #\(versionNumber) (#\(buildNumber))"
      }
      

      然后你可以在全局声明时在任何地方使用。

      print(appVersion)
      

      输出:

      Version: #1.0 (#1.0.3)
      

      【讨论】:

        【解决方案3】:

        2 个数字!

        营销版本号是针对客户的,称为版本号。它从 1.0 开始,主要更新到 2.03.0,对于 1.1 的次要更新、1.2 以及 1.0.11.0.2 的错误修复。这个数字是面向版本和新功能的。不一定要停在9,1.11.23是一个合理的版本号。

        内部版本号主要是在此之前完成的内部版本号。但是有些使用其他数字,例如存储库的分支号或其提交号。这个数字应该是唯一的,以区分不同的构建,它们只有微小的增量变化。


        获取版本号:

        目标-C:

        NSString * appVersionString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
        

        斯威夫特

        let appVersionString: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
        

        Swift 3.0+(用 5.0 测试):

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

        要获得 build 编号:

        目标-C:

        NSString * appBuildString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
        

        斯威夫特

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

        Swift 3.0+(测试到 5.0):

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

        如果您希望两者合二为一:

        先用上面几行,再用下面几行。

        目标-C:

        NSString * versionBuildString = [NSString stringWithFormat:@"Version: %@ (%@)", appVersionString, appBuildString];
        

        Swift(测试到 5.0):

        let versionAndBuildNumber: String = "\(appVersionString) (\(buildNumber))"
        

        注意事项:

        主包中的值并不总是存在,例如在命令行应用程序中没有CFBundleShortVersionStringCFBundleVersion,因此这些方法将返回nil,它会崩溃,因为它在代码中不正确的沮丧。 但在普通的 Cocoa iOS 和 Mac 应用程序中,这些值是已定义的,不会被删除。

        这是使用 Xcode 版本 7.3 (7D175) 测试的。内部版本号通常写在括号/大括号中。内部版本号为十六进制或十进制。


        Xcode 中,您可以将 build number 自动递增为 decimal number,方法是将以下内容放在 Run script build 阶段项目设置

        #!/bin/bash    
        buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
        buildNumber=$(($buildNumber + 1))
        /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
        

        十六进制版本号使用这个脚本

        buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
        buildNumber=$((0x$buildNumber)) 
        buildNumber=$(($buildNumber + 1)) 
        buildNumber=$(printf "%X" $buildNumber)
        /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
        

        对于Xcode,请执行以下操作:

        步骤 1

        第二步

        第三步

        【讨论】:

        • 只是为上面的例子添加,“CFBundleVersion”是Build=300,“CFBundleShortVersionString”是Version=0.41。维克托的答案应该是正确的答案。
        • 我曾经遇到过十六进制数字的问题。 Apple 声明使用整数:developer.apple.com/library/ios/documentation/general/Reference/…
        • Swift 3.0 的内容已重命名:现在是 Bundle.main.object(forInfoDictionaryKey: "...")
        • @AlexZavatone,您是否仍然在 XCode 12 中看到相同的问题,即 CFBundleVersion 没有被复制到字典中?在 XCode 12.4 中它对我有用,并且通过我的应用程序项目,我能够成功检索 CFBundleShortVersionString。 XCode12 是我使用的第一个版本,所以这可能与从 CFBundleVersion 到 CFBundleShortVersionString 的更改有关?
        • @Rethunk,我得去看看。感谢您的提醒。
        【解决方案4】:

        以编程方式显示版本和内部版本号 - Swift 4.0

        let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"
        
        let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"            
        
        let versionAndBuildNumber = "Ver #\(versionNumber) ( Build #\(buildNumber) )"
        

        【讨论】:

          【解决方案5】:

          您无需更改项目或 Xcode 中的任何内容。以下是两者的 Swift 版本:

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

          它已包含在此 repo 中,请查看:

          https://github.com/goktugyil/EZSwiftExtensions

          【讨论】:

          • 哪个答案?我没看到
          • 只有一个答案,在他的第二段
          • 是的,1. 他的回答噪音太大,信号不多。 2. 这是swift,即objective-c。 3.那是ios5时代的
          • Swift 3.0 的内容已重命名:现在是 Bundle.main.object(forInfoDictionaryKey: "...")
          【解决方案6】:

          这里 Swift 3 的代码相同:

          let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
          let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String
          

          【讨论】:

          • Bundle.main 给我一个空的infoDictionary;也许是因为我是在一个框架内做的,而不是一个可执行文件或应用程序? Bundle(for: MyClass.self) 包含预期值。
          猜你喜欢
          • 1970-01-01
          • 2016-07-23
          • 2014-07-29
          • 2015-06-06
          • 2017-02-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-12
          相关资源
          最近更新 更多