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

256

我正在编写一款iPhone应用,它已经发布了,但我希望添加一个功能,显示其版本号。

我不想每次发布新版本都手动添加这个信息...

在objective-C中有没有一种方法可以找出我的应用程序的版本号?


1
这个问题已经在这里得到了回答 https://dev59.com/g2Qn5IYBdhLWcg3wXGKr#16888788。 - Akshat Singhal
1
链接的问题是4年前的,所以真正的问题在于cmos从未“接受”答案。尽管如此,链接问题的答案很有用,这里的答案也是如此。在两个线程上,不要只看第一个答案-有时后面的答案会提供更多最新信息。 - ToolmakerSteve
16个回答

224

就像我在这里描述的那样,我使用一个脚本来重写带有当前Subversion修订号的头文件。该修订号存储在kRevisionNumber常量中。然后我可以使用类似以下内容的方式访问版本和修订号:

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

这将创建一个格式为“ Version 1.0(51)”的字符串。


154
那个命令返回了我的构建版本,所以我使用了它。[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"] - jspooner
6
CFBundleVersion不正确,因为Xcode错误地将该plist条目填充为构建号而不是版本号。 jspooner是正确的。 - Oscar
4
请参考 https://dev59.com/IWw15IYBdhLWcg3wD3np 这个网址,它很好地解释了版本号和构建号的区别。这证实了 CFBundleShortVersionString 通常用于表示版本号,而 CFBundleVersion 用于表示构建号。请注意,对原文意思不要做任何改动。 - Rory
3
“kRevisionNumber” 对我来说似乎不起作用。为了获得指定的输出,我使用了以下代码(使用 @jspooner 的修复方法):[NSString stringWithFormat:@"版本:%@(%@)",[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"],[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]] - Adam

151

在Brad Larson的回答基础上,如果您在info.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];
}

现在手动升级小版本可能很麻烦,因此使用源代码仓库版本号技巧是理想的。如果你没有集成它(就像我一样),上面的片段可能很有用。它还提取了应用程序的显示名称。


60

分别为两个版本提供的 Swift 代码:

Swift 3

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

Swift 2

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

这个仓库已经包含在里面了,看看吧:

https://github.com/goktugyil/EZSwiftExtensions


43

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

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

希望这个简单的回答能够帮助到某些人...


1
对于我的需要来说,这非常棒。谢谢。+1 - ICL1901
1
这将返回构建名称,而不是版本。 - chancyWu
@chancyWu,CFBundleShortVersionString 似乎提供了版本号。 - Brian F Leighty

31
你可以在plist.info中指定CFBundleShortVersionString字符串,并使用提供的API以编程方式读取它。

30

有两个东西——构建版本和应用程序版本。

  1. 获取应用程序版本:

NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
  • 获取构建版本:

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

    这两个有什么区别吗?对我来说它们都返回相同的结果。 - jjnevis
    是的,也许您的构建号和应用程序版本在设置中是相同的。 - Shaik Riyaz
    好的,我的RAKEFILE中只有一个设置 - app.version(我正在使用RubyMotion)。我想对于我的需求任何一个都可以。谢谢。 - jjnevis
    谢谢,伙计。运行得很顺利。 - Felipe
    1
    FYI最好使用objectForInfoDictionaryKey:而不是infoDictionary] objectForKey:,因为前者返回本地化的值(如果有的话)。虽然在这里可能没有什么区别;) - deanWombourne

    18

    获得版本字符串 X.Y.Z 格式的简洁方法是:

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

    或者,只需X.Y:

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

    这两个代码段返回的是字符串,你可以将它们分配给标签对象的文本属性,例如:

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

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

    1
    正是我所需要的! - Julius

    7
    您可以尝试使用字典,如下所示:
    NSDictionary *infoDictionary = [[NSBundle mainBundle]infoDictionary];
    
    NSString *buildVersion = infoDictionary[(NSString*)kCFBundleVersionKey];
    NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]
    

    6

    Swift 5:

    有两个概念 - 应用版本和构建版本。

    • To get App version:

       if let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
            // present appVersion
      }
      
    • To get Build version:

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

    非常感谢 @Brad Larson♦


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接