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


135

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

如Xcode项目目标的“属性”窗口中所示。我想在我的应用程序的初始屏幕中显示此内容,以便知道人们当前正在使用哪个版本?

Answers:


392

2个号码!

市场版本号是针对客户的,称为版本号。它从1.0和上升的主要更新到2.03.0,轻微的更新到1.11.2和bug修复1.0.11.0.2。该数字与发行版和新功能有关。它不必停在9,1.11.23是一个合理的版本号。

版本号是大多是内部号码的建立已取得直到那时。但是有些使用其他编号,例如存储库的分支编号或其提交编号。该编号应该唯一,以区别仅具有较小增量更改的不同内部版本。


要获取版本号:

目标C:

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

斯威夫特<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"];

斯威夫特<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];

斯威夫特(测试到5.0):

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

笔记:

主捆绑包中的值并不总是存在,例如,在命令行应用程序中不存在CFBundleShortVersionStringCFBundleVersion,因此方法将返回nil并且将崩溃,因为在代码中进行了错误的向下转换。但是在普通的Cocoa iOS和Mac应用程序中,这些值是已定义的,不会被删除。

这已通过Xcode 7.3版(7D175)进行了测试。内部版本号通常写在括号/大括号中。内部版本号为十六进制或十进制。

构建和版本


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步

第1步

第2步

第2步

第三步

第三步


4
仅添加上述示例,“ CFBundleVersion”是Build = 300,“ CFBundleShortVersionString”是Version = 0.41。维克多的答案应该是正确的答案。
justinkoh 2013年

1
我曾经遇到过十六进制数字的问题。苹果公司声明使用整数:developer.apple.com/library/ios/documentation/general/Reference/…–
hashier

您是否知道@“ CFBundleShortVersionString”和@“ CFBundleVersion”是否有任何字符串常量?
igrek

既然CI / CD系统非常普遍,您可能要指出使用构建脚本来设置版本号的陷阱。
Sam Ballantyne

1
事情已经为Swift 3.0改名:Bundle.main.object(forInfoDictionaryKey: "...")现在。
拉斐尔

13

您无需在项目或Xcode中进行任何更改。这是两个版本的Swift版本:

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

它包含在此仓库中,请查看:

https://github.com/goktugyil/EZSwiftExtensions


哪个答案?我看不到
Esqarrouth,2015年

只有一个答案,在他的第二段中
Daniel Galasko,2015年

3
是的,1.他的回答太多了,信号也没有太多。2.这是迅速的,即目标c。3.那是ios5时代的内容
Esqarrouth,2015年

事情已经为Swift 3.0改名:Bundle.main.object(forInfoDictionaryKey: "...")现在。
拉斐尔

5

这是Swift 3的相同代码:

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

Bundle.maininfoDictionary为我空了 也许是因为我是从框架而不是可执行文件或应用程序中进行的?Bundle(for: MyClass.self)包含期望值。
拉斐尔

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) )"

1

您也可以使用

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)

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")"
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.