检索CFBundleVersion时的奇怪行为

时间:2013-01-21 19:55:51

标签: iphone ios xcode build build-automation

  

可能重复:
  Xcode project’s “Build number”

我正在使用此脚本在Xcode 4.5.2(适用于iOS的应用程序)中构建期间更新CFBundleVersion:

#!/bin/bash
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

它似乎工作正常,每次我构建我的应用程序“内部版本号”(CFBundleVersion)增加1。

当我尝试使用以下编程方式检索CFBundleVersion时会发生奇怪的行为:

[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]

[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]

这就是我得到的:

CFBundleVersion 1 -> I get 1
CFBundleVersion 2 -> I get 1 odd
CFBundleVersion 3 -> I get 3
CFBundleVersion 4 -> I get 3 odd
CFBundleVersion 5 -> I get 5
CFBundleVersion 6 -> I get 5 odd
CFBundleVersion 7 -> I get 7
CFBundleVersion 8 -> I get 7 odd
CFBundleVersion 9 -> I get 9
CFBundleVersion 10 -> I get 10
CFBundleVersion 11 -> I get 10 odd
CFBundleVersion 12 -> I get 12
CFBundleVersion 13 -> I get 13
CFBundleVersion 14 -> I get 14
CFBundleVersion 15 -> I get 14 odd
CFBundleVersion 16 -> I get 16
CFBundleVersion 17 -> I get 16 odd
CFBundleVersion 18 -> I get 18
CFBundleVersion 19 -> I get 18 odd
CFBundleVersion 20 -> I get 20
CFBundleVersion 21 -> I get 21
CFBundleVersion 22 -> I get 22
and so on...

每次输出都会改变,但奇怪的行为在模拟器和设备上仍然存在。 如果我删除脚本并手动放置CFBundleVersion,一切都会顺利进行。

有人知道为什么吗?我该如何解决? 感谢!!!

1 个答案:

答案 0 :(得分:2)

问题是Xcode在执行运行脚本后不再检查修改后的文件。因此,即使运行脚本更新Info.plist文件,Xcode也不会将更新的文件复制到应用程序包中。

作为一种变通方法,您可以为项目创建一个额外的目标(即“聚合”目标),并将运行脚本添加到该附加目标,而不是您的主目标。

未为其他目标定义$INFOPLIST_FILE环境变量,但您可以使用实际(项目相对)路径,即替换$INFOPLIST_FILE

YourMainTarget/YourMainTarget-Info.plist

然后将其他目标拖动到主目标的“目标依赖关系”中,以便始终首先构建其他目标。

编辑:我刚刚在这里找到了一个更优雅的解决方案:https://stackoverflow.com/a/11112042/1187415,使用“预操作”脚本而不是其他目标。