我的iPhone应用程序如何检测自己的版本号?


254

我正在写一个iPhone应用程序。它已经发布,但是我想在其中显示其版本号的地方添加一个功能。

我宁愿不必在发布的每个版本中手动执行此操作...

在Objective-C中有没有办法找出我的应用程序的版本?


1
这个问题已经在这里stackoverflow.com/a/16888788/2890157回答。
2013年

1
..链接的问题是4年后,所以真正的问题是cmos从未接受答案。无论如何,链接问题的答案以及此处的答案都是有用的。在两个线程上,都将目光投向第一个答案以外的地方-有时在后一个答案中会有更多最新信息。
ToolmakerSteve

Answers:


222

正如我在这里描述的,我使用脚本用我当前的Subversion修订版号重写头文件。该修订号存储在kRevisionNumber常数中。然后,我可以使用类似于以下内容的方式访问版本和修订号:

[NSString stringWithFormat:@"Version %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"], kRevisionNumber]

它将创建格式为“版本1.0(51)”的字符串。


152
那返回了我的构建版本,所以我使用了这个版本。[[[[NSBundle mainBundle] infoDictionary] objectForKey:@“ CFBundleShortVersionString”]
jspooner 2012年

6
CFBundleVersion不正确,因为Xcode错误地用内部版本号而不是版本号填充了该plist条目。jspooner是正确的。
奥斯卡

4
有关版本号和内部版本号的详细说明,请参见stackoverflow.com/questions/6851660/version-vs-build-in-xcode-4。确认CFBundleShortVersionString您通常想要的“版本”和CFBundleVersion内部版本号。
罗里

3
kRevisionNumber似乎不适合我。为了获得指定的输出,我执行了此操作(使用@jspooner的修复程序):[NSString stringWithFormat:@"Version: %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]
亚当

147

基于布拉德·拉尔森(Brad Larson)的答案,如果您在信息plist中存储了主要和次要版本信息(就像我在特定项目中所做的那样),那么这对我来说效果很好:

- (NSString *)appNameAndVersionNumberDisplayString {
    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString *appDisplayName = [infoDictionary objectForKey:@"CFBundleDisplayName"];
    NSString *majorVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
    NSString *minorVersion = [infoDictionary objectForKey:@"CFBundleVersion"];

    return [NSString stringWithFormat:@"%@, Version %@ (%@)", 
                appDisplayName, majorVersion, minorVersion];
}

现在,手动修订次要版本可能很麻烦,因此使用源存储库修订号技巧是理想的选择。如果您尚未将其绑定(如我所没有),则以上代码段可能会很有用。它还会拉出应用程序的显示名称。


59

两者的Swift版本分别:

迅捷3

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

迅捷2

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

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

https://github.com/goktugyil/EZSwiftExtensions


42

这就是我在应用程序中所做的

NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

希望这个简单的答案可以对某人有所帮助。


1
对于我的需求,这很棒。谢谢。+1
大卫·德尔蒙特2014年

1
这将返回构建名称,而不是版本
chancyW14年

@ chancyWu,CFBundleShortVersionString似乎提供了版本。
Brian F Leighty


30

有两件事-构建版本和应用程序版本。

  1. 要获取应用版本:

    NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
  2. 要获得内部版本:

    NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

两者之间有什么区别吗?他们对我来说都是一样的。
jjnevis

是的,可能您的内部版本号和应用程序版本在设置中相同。
谢克·里亚兹

好的,我的RAKEFILE中只有一个设置-app.version(我正在使用RubyMotion)。我想两者都能满足我的需求。谢谢
jjnevis

谢了哥们。工作顺利。
费利佩

1
仅供参考,最好使用objectForInfoDictionaryKey:代替,infoDictionary] objectForKey:因为前者返回本地化的值(如果有的话)。虽然可能不会在这里
有所作为

17
// Syncs with App Store and Xcode Project Settings Input
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];

1
正是我需要的!
朱利叶斯

16

获取XYZ格式的版本字符串的简洁方法是:

[NSBundle mainBundle].infoDictionary[@"CFBundleVersion"]

或者,仅针对XY:

[NSBundle mainBundle].infoDictionary[@"CFBundleShortVersionString"]

这两个片段均返回您将分配给标签对象的text属性的字符串,例如

myLabel.text = [NSBundle mainBundle].infoDictionary[@"CFBundleVersion"];

7

您可以尝试将字典用作:-

NSDictionary *infoDictionary = [[NSBundle mainBundle]infoDictionary];

NSString *buildVersion = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]

4

读取应用程序的info.plist文件,并获取键CFBundleShortVersionString的值。阅读info.plist将为您提供NSDictionary对象


4

您可以使用infoDictionary从应用程序的info.plist获取版本详细信息。此代码适用于swift3。只需调用此方法,然后在任何首选的UI元素中显示版本。

Swift-3  

func getVersion() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as! String
    let build = dictionary["CFBundleVersion"] as! String
    return "v\(version).\(build)"
}

3

斯威夫特5:

有两件事-App版本和build版本

  • 要获取应用版本:

     if let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
          // present appVersion
    }
  • 要获得内部版本:

     if let buildVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
          // present buildVersion
     }

感谢@Brad Larson♦了很多


1

如果您需要版本 build num组合,这是使用Swift 3的一种简短方法:

let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"]!
let buildNum = Bundle.main.infoDictionary!["CFBundleVersion"]!
let versionInfo = "\(appVersion) (build \(buildNum))"
// versionInfo is now something like "2.3.0 (build 17)"

as! StringappVersionbuildNum行的末尾添加一个,以仅将该部分作为String对象。不需要,但是如果您正在寻找完整的versionInfo

我希望这有帮助!


1
func getAppVersion() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let versionValue = dictionary["CFBundleShortVersionString"] ?? "0"
    let buildValue = dictionary["CFBundleVersion"] ?? "0"
    return "\(versionValue) (build \(buildValue))"
}

基于@rajat chauhan的答案,无需强制转换为String


0

用修订控制系统来处理这是一件好事。这样,当您从用户那里获得错误报告时,您可以签出该代码的修订版,并(有希望)重现与用户运行完全相同的代码的错误。

这个想法是,每次执行构建时,您都将运行一个脚本,该脚本获取代码的当前修订号并更新项目中的文件(通常使用某种形式的令牌替换)。然后,您可以编写一个错误处理例程,该例程始终在错误输出中包含修订号,或者可以在“关于”页面上显示该修订号。


0

您可以尝试以下方法:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
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.