2012-04-04 107 views
34

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

+0

你有关于如何AUTOCREATE版本#分别引用/链接? – phlebotinum 2012-04-04 16:27:44

+0

@robo在下面看到我的“回复”。 – RobertL 2012-04-08 17:22:10

回答

67

当然,你可以问你的主束的信息目录,其中包括您的info.plist的所有键和值,包括版本号:

NSDictionary *info = [[NSBundle mainBundle] infoDictionary]; 
NSString *version = [info objectForKey:@"CFBundleShortVersionString"]; 
+1

发布这个问题12分钟内有5个好答案!所有人都值得一个绿色的支票,但我只能接受一个,所以我采取了最早的时间戳。 – RobertL 2012-04-08 16:24:44

+0

@RobertL在这种情况下,你可以提高他们的答案,给他们一些声誉。 – JustSid 2012-04-08 16:50:42

+0

是否做到了。直到现在我才知道我可以这样做。谢谢。 – RobertL 2012-04-08 17:39:12

3

你可以得到的info.plist值这片代码(与要比照Recommended Info.plist Keys Info.plist中的主要替代CFBundleShortVersionString

[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"] 
77
NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary]; 
NSString *appVersion = [infoDict objectForKey:@"CFBundleShortVersionString"]; // example: 1.0.0 
NSString *buildNumber = [infoDict objectForKey:@"CFBundleVersion"]; // example: 42 
+0

这是否记录在Apple文档的任何位置?谢谢! – snowbound 2014-10-02 03:10:34

+0

https://developer.apple.com/library/ios/documentation/general/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html记录了可以在应用程序(实际上是任何包)中Info.plist的密钥,包括这些二。 – 2014-10-02 03:31:19

10
NSBundle *bundle = [NSBundle mainBundle]; 
NSString *appVersion = [bundle objectForInfoDictionaryKey:(NSString *)@"CFBundleShortVersionString"]; 
NSString *appBuildNumber = [bundle objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey]; 
3

由于这些值存储在应用程序的Info.plist你可以通过设置在NSBundle方法读取,然后:

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

Accessing bundles contents作为权威参照从你的Info.plist文件和Core Foundation keys可用的Info.plist获取数据键。

13

@robo 我确实按照如何自动增加内部版本号(不是版本号,但是非常相似)写了一篇文章,但现在我找不到它了。我会尽力解释我做了什么。我希望已经足够清楚了。

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

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

窄栏包含2个部分:“PROJECT”和“TARGETS”。在“TARGETS”部分点击您的项目名称。现在中间窗格顶部有5个选项卡:“摘要”,“信息”,“生成设置”,“生成阶段”和“生成规则”。

点击“Build Phases”标签。如果您的配置与我的配置相同,您现在将在主窗口中看到4个部分:“目标相关性”,“复制束资源”,“编译源”和“链接...”。点击“添加生成阶段”(在右下角)并选择“添加运行脚本”。第5部分现在出现在中心窗格中,标题为“运行脚本”。将“运行脚本”部分向上拖动,使其位于“目标相关性”下方的第二部分。

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

#!/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" 
+0

非常感谢。 (10char) – phlebotinum 2012-04-09 11:02:25

+0

令我惊讶的是,我已经了解到,十六进制版本号未通过App Store的验证。我在下面发布了一个回复,其中包含一个修改后的十进制算术脚本。见下文。 – RobertL 2013-01-26 17:41:34

+0

我继续前进,并在您的小数点脚本中对此答案的底部进行了编辑。这样,其他答案可以删除,减少一些杂乱无章。 – thegrinner 2013-06-28 18:33:07

0

在斯威夫特:

let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String