如何以编程方式在 iOS 应用程序中显示目标的版本/内部版本号?
Posted
技术标签:
【中文标题】如何以编程方式在 iOS 应用程序中显示目标的版本/内部版本号?【英文标题】:How to programmatically display version/build number of target in iOS app? 【发布时间】:2011-03-02 05:49:27 【问题描述】:如何以编程方式获取target version
的值,如下图所示?
在我的 Xcode 项目目标的“属性”窗口中可以看到。我想在我的应用程序的初始屏幕中显示它,以便我知道人们当前使用的是哪个版本?
【问题讨论】:
【参考方案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.0、3.0,对于 1.1 的次要更新、1.2 以及 1.0.1、1.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))"
注意事项:
主包中的值并不总是存在,例如在命令行应用程序中没有CFBundleShortVersionString
或CFBundleVersion
,因此这些方法将返回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)
包含预期值。以上是关于如何以编程方式在 iOS 应用程序中显示目标的版本/内部版本号?的主要内容,如果未能解决你的问题,请参考以下文章