如何在iOS应用程序中以编程方式显示目标的版本/内部版本号?

时间:2010-06-10 15:21:38

标签: iphone xcode ipad ios-simulator

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

如我的Xcode项目目标的Properties窗口中所示。我想在我的应用程序的启动画面中显示这个,所以我知道人们当前使用的是哪个版本?

5 个答案:

答案 0 :(得分:371)

2 数字!

营销版本号适用于客户,称为版本号。它从 1.0 开始,然后进行 2.0 3.0 的主要更新,以便对 1.1 进行微小更新,< em> 1.2 以及 1.0.1 1.0.2 的错误修复。此编号面向版本和新功能。它不必停在9, 1.11.23 是一个合理的版本号。

内部版本号主要是内部版本号,直到那时为止。但有些使用其他数字,如存储库的分支号或其提交号。此编号应为唯一,以区分不同的版本,这些版本只有少量的增量更改。


获取版本号码:

目标-C:

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

斯威夫特&lt; 3.0:

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

Swift 3.0+(用5.0测试):

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

获取构建号码:

目标-C:

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

斯威夫特&lt; 3.0:

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 = "\(versionNumber) (\(buildNumber))"

注意:

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

使用 Xcode Version 7.3(7D175)进行测试。内部版本号通常用括号/括号括起来。内部版本号为十六进制或十进制。

buildandversion


Xcode 中,您可以通过在Run script版本中添加以下内容,将版本号自动增加为十进制数项目设置中的阶段

#!/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步

step1

第2步

step2

第3步

step3

答案 1 :(得分:5)

这里的代码与 Swift 3 相同:

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

答案 2 :(得分: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) )"

答案 3 :(得分:1)

您也可以使用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)

答案 4 :(得分: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")"
    }
}