46

在 Xcode 中手动设置构建和版本号很容易,我学习了如何在构建时使用宏来增加它们。但是我如何在代码中引用它们的值呢?

4

7 回答 7

97
NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary];
NSString *appVersion = [infoDict objectForKey:@"CFBundleShortVersionString"]; // example: 1.0.0
NSString *buildNumber = [infoDict objectForKey:@"CFBundleVersion"]; // example: 42 
于 2012-04-04T16:31:39.510 回答
83

当然,您可以向主包询问 info 目录,其中包含 info.plist 的所有键和值,包括版本号:

NSDictionary *info = [[NSBundle mainBundle] infoDictionary];
NSString *version = [info objectForKey:@"CFBundleShortVersionString"];
于 2012-04-04T16:29:44.850 回答
13
NSBundle *bundle = [NSBundle mainBundle];   
NSString *appVersion = [bundle objectForInfoDictionaryKey:(NSString *)@"CFBundleShortVersionString"];
NSString *appBuildNumber = [bundle objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey];
于 2012-04-04T16:31:41.490 回答
13

@robo我确实关注了有关如何自动增加内部版本号(不是版本号,但非常相似)的文章,但现在我找不到它。我会试着解释我做了什么。我希望它足够清楚。

在 Xcode 4 中查看 Navigator 窗格,它是 Xcode 屏幕左侧的窗格。它的顶部有 7 个图标。选择最左边的图标(看起来像一个文件夹)以获取 Project Navigator 窗格。

现在单击该窗格中的第一项,即项目本身。这会在中间打开一个大窗口,左侧有一个狭窄的柱子。

窄列有 2 个部分:“项目”和“目标”。在“目标”部分中单击您的项目名称。现在中心窗格顶部有 5 个选项卡:“摘要”、“信息”、“构建设置”、“构建阶段”和“构建规则”。

单击“构建阶段”选项卡。如果您的配置与我的相同,您现在将在主窗口中看到 4 个部分:“Target Dependencies”、“Copy Bundle Resources”、“Compile Sources”和“Link...”。单击“添加构建阶段”(在右下角)并选择“添加运行脚本”。第五部分现在出现在中心窗格中,标题为“运行脚本”。向上拖动“运行脚本”部分,使其成为从顶部算起的第二个部分,就在“目标依赖项”下方。

现在单击“运行脚本”部分的显示三角形。这将打开一个窗口,您可以在其中放置脚本。将以下脚本复制并粘贴到该窗口中。

#!/bin/bash    
bN=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
bN=$((0x$bN)) 
bN=$(($bN + 1)) 
bN=$(printf "%X" $bN)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $bN" "$INFOPLIST_FILE"

确保未选中“仅在安装时运行脚本”。

就是这样!现在,每次构建项目时,您的内部版本号都会自动增加。

此脚本假定您的 info.plist 文件中有一个普通的十六进制内部版本号,并将其递增为十六进制。如果缺少内部版本号,我不确定它会做什么。但是输入起始值很容易——只需转到您在上面使用的同一个中心窗格中的“摘要”选项卡,然后在“构建”框中输入“1”(或您喜欢的任何值)(但不是格式化的)像 1.0 这样的字符串)。


我认为我首先给出的十六进制脚本对于提交到 App Store 无效。这是使用十进制算术的相同脚本。

#!/bin/bash    
bN=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE") 
((bN += 1))
bN=$(printf "%d" $bN)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $bN" "$INFOPLIST_FILE"
于 2012-04-08T17:25:07.533 回答
4

您可以使用这段代码获取 info.plist 值(替换CFBundleShortVersionString为您想要的 info.plist 键,参见推荐的 Info.plist 键

[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]
于 2012-04-04T16:31:22.910 回答
4

由于这些值存储在您的应用程序中,Info.plist您可以通过以下提供的方法读取NSBundle

NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: CFBundleShortVersionString];

请参阅访问捆绑包内容作为从 Info.plist 文件中获取数据的权威参考,以及获取可用 Info.plist 键的Core Foundation键。

于 2012-04-04T16:35:47.863 回答
0

在斯威夫特:

let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String
于 2014-12-02T12:42:18.780 回答