【发布时间】:2011-11-28 08:20:31
【问题描述】:
我希望能够将我的 iOS 项目/应用程序的当前版本作为NSString 对象获取,而不必在某个文件中定义常量。我不想在 2 个地方更改我的版本值。
当我在项目目标摘要中更新我的版本时,需要更新该值。
【问题讨论】:
标签: ios objective-c iphone swift
我希望能够将我的 iOS 项目/应用程序的当前版本作为NSString 对象获取,而不必在某个文件中定义常量。我不想在 2 个地方更改我的版本值。
当我在项目目标摘要中更新我的版本时,需要更新该值。
【问题讨论】:
标签: ios objective-c iphone swift
您可以通过以下方式获取版本号和内部版本号:
let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let build = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String
或在 Objective-C 中
NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"];
NSString * build = [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey];
我在UIApplication 的一个类别中有以下方法:
extension UIApplication {
static var appVersion: String {
return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
}
static var appBuild: String {
return Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String
}
static var versionBuild: String {
let version = appVersion, build = appBuild
return version == build ? "v\(version)" : "v\(version)(\(build))"
}
}
要点: https://gist.github.com/ashleymills/6ec9fce6d7ec2a11af9b
这是 Objective-C 中的等价物:
+ (NSString *) appVersion
{
return [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"];
}
+ (NSString *) build
{
return [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey];
}
+ (NSString *) versionBuild
{
NSString * version = [self appVersion];
NSString * build = [self build];
NSString * versionBuild = [NSString stringWithFormat: @"v%@", version];
if (![version isEqualToString: build]) {
versionBuild = [NSString stringWithFormat: @"%@(%@)", versionBuild, build];
}
return versionBuild;
}
要点: https://gist.github.com/ashleymills/c37efb46c9dbef73d5dd
【讨论】:
(NSString *)kCFBundleVersionKey 而不是@"CFBundleVersion"。即使键入时间较长(自动完成在这里会有所帮助),因为它是一个常量,它会在编译时进行检查。
NSBundle 而不是UIApplication 上进行此扩展会更准确,这也将允许用实例调用替换静态调用。
UIApplication,因为返回的信息是关于应用程序的。此外,这仅适用于 main 包 - 将其作为任何包上的实例方法是没有意义的。
appBundle(在你的代码的第二行)时,你是说build吗?
以下是 Xcode 8、Swift 3 的工作原理:
let gAppVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "0"
let gAppBuild = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "0"
print("Version: \(gAppVersion)")
print("Build: \(gAppBuild)")
【讨论】:
在目标 C 中:
1)要获取应用版本,您必须使用:
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
2) 要获取 Build 版本,您必须使用:
NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
【讨论】:
[Swift 版本:5.2]
所有 iOS 应用都必须在其 Info.plist 文件中存储应用版本号,但没有内置方法可以将其作为可在代码中使用的字符串。
我为 UIApplication 创建了一个小扩展,它读取 Info.plist 文件并自动返回版本号。
代码如下:
extension UIApplication {
static var appVersion: String? {
return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String
}
}
在你的控制器内部
@IBOutlet weak var tv_version: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
//Display Version
setUpCurrentVersion()
}
func setUpCurrentVersion(){
tv_version.text = "v" + UIApplication.appVersion!
}
【讨论】:
在 Swift 中,您可以通过以下方式获取 bundle 版本:
let info:NSDictionary = NSBundle.mainBundle().infoDictionary!
let version:String = info.objectForKey("CFBundleShortVersionString") as! String
versionLabel.text = "Version:" + version
【讨论】:
我的一个开源项目App Update Tracker以类方法的形式提供了这个功能(以及更多):
+ (NSString *)getShortVersionString+ (NSString *)getLongVersionString你会这样使用它:
#import "AppUpdateTracker.h"
NSLog(@"short version: %@", [AppUpdateTracker getShortVersionString]);
NSLog(@"long version: %@", [AppUpdateTracker getLongVersionString]);
【讨论】:
所以这里有一个分别用于这两个的 Swift 版本:
let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String
它包含在这个 repo 中,检查一下:
【讨论】:
仅供参考
要获取任何键的本地化值,您应该使用CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)
【讨论】: