【发布时间】:2011-03-02 05:49:27
【问题描述】:
如何以编程方式获取target version 的值,如下图所示?
在我的 Xcode 项目目标的“属性”窗口中可以看到。我想在我的应用程序的初始屏幕中显示它,以便我知道人们当前使用的是哪个版本?
【问题讨论】:
标签: iphone xcode ipad ios-simulator
如何以编程方式获取target version 的值,如下图所示?
在我的 Xcode 项目目标的“属性”窗口中可以看到。我想在我的应用程序的初始屏幕中显示它,以便我知道人们当前使用的是哪个版本?
【问题讨论】:
标签: iphone xcode ipad ios-simulator
我为 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")"
}
}
【讨论】:
你也可以用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)
【讨论】:
有 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
目标-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,请执行以下操作:
【讨论】:
Bundle.main.object(forInfoDictionaryKey: "...")。
以编程方式显示版本和内部版本号 - 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) )"
【讨论】:
您无需更改项目或 Xcode 中的任何内容。以下是两者的 Swift 版本:
let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String
它已包含在此 repo 中,请查看:
【讨论】:
Bundle.main.object(forInfoDictionaryKey: "...")。
这里 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) 包含预期值。