Answers:
有2个号码!
市场版本号是针对客户的,称为版本号。它从1.0和上升的主要更新到2.0,3.0,轻微的更新到1.1,1.2和bug修复1.0.1,1.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))"
主捆绑包中的值并不总是存在,例如,在命令行应用程序中不存在CFBundleShortVersionString
或CFBundleVersion
,因此方法将返回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
请执行以下操作:
Bundle.main.object(forInfoDictionaryKey: "...")
现在。
您无需在项目或Xcode中进行任何更改。这是两个版本的Swift版本:
let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String
它包含在此仓库中,请查看:
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)
包含期望值。
以编程方式显示版本和内部版本号-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) )"
您也可以使用
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)
我对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")"
}
}