我可能在这里遗漏了一些简单的东西。我只是在归档我的应用程序时(为准备TestFlight部署)尝试在XCode 4.4中自动增加我的内部版本号。我有一个在目标上运行的工作shell脚本,并成功更新每个构建的info.plist文件。我的归档构建配置名称为“Ad-Hoc”。
这是脚本:
if [ $CONFIGURATION == Ad-Hoc ]; then
echo "Ad-Hoc build. Bumping build#..."
plist=${PROJECT_DIR}/${INFOPLIST_FILE}
buildnum=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${plist}")
if [[ "${buildnum}" == "" ]]; then
echo "No build number in $plist"
exit 2
fi
buildnum=$(expr $buildnum + 1)
/usr/libexec/Plistbuddy -c "Set CFBundleVersion $buildnum" "${plist}"
echo "Bumped build number to $buildnum"
else
echo $CONFIGURATION " build - Not bumping build number."
fi
此脚本会相应地更新plist文件,并在每次归档时反映在XCode中。问题是归档过程中出现的.ipa文件仍然显示以前的内部版本号。我尝试了以下解决方案但没有成功:
无论我做什么,当我查看构建日志时,我发现info.plist文件正在作为最初的步骤之一进行处理。它始终在我的脚本运行和更新构建号之前,我认为,为什么构建号在.ipa文件中永远不会是最新的。
有没有办法在处理info.plist文件之前强制运行Run Script阶段?
答案 0 :(得分:1)
答案 1 :(得分:1)
发生这种情况的原因是,当你的"运行脚本"运行后,XCode构建过程已经处理了项目的plist文件以提取包版本号等。
您可以通过转到XCode中的日志导航器(查看/导航器/显示日志导航器),然后选择"存档"来查看(可能更详细,您想要)。建立。
构建操作的详细列表应显示在主窗口中,顶部附近的一个应该是名为Process <projectname>-Info.plist
的内容。如果使用右侧的图标展开它,则可以看到已运行的实际构建命令。
我解决这个问题的方法是更新原始的plist文件以及处理过的文件。通过这样做,您可以在当前版本中获得更新的版本版本而不是下一版本。
这是我用来执行此操作的脚本(这是Ruby,因此您需要在解释器框中放置&#34; / usr / bin / ruby&#34;以使用它,但是概念与shell脚本或任何其他脚本语言相同):
def incrementBundleVersion(file)
oldVersion = `/usr/libexec/Plistbuddy -c "print :CFBundleVersion" #{file}`.strip
components = oldVersion.split('.')
newBuild = components.pop.to_i + 1
version = components.push(newBuild).join('.')
print "Updating version: #{oldVersion} -> #{version} : #{file}\n"
system("/usr/libexec/PlistBuddy -c \"Set :CFBundleVersion #{version}\" #{file}")
end
incrementBundleVersion("#{ENV['PROJECT_DIR']}/#{ENV['INFOPLIST_FILE']}")
incrementBundleVersion("#{ENV['CODESIGNING_FOLDER_PATH']}/Info.plist")
请注意,已处理的文件#{ENV['CODESIGNING_FOLDER_PATH']}/Info.plist
是二进制plist文件,因此您无法使用简单的文本工具处理它 - 使用plistbuddy是处理此问题的最简单方法,它会自动生效同时包含文本和二进制plist文件。
答案 2 :(得分:0)
马克(等),我相信我遇到了你所面临的同样问题,我将尝试用一句话来描述它然后解释:
我认为/ usr / libexec / PlistBuddy,当从Xcode内部运行时,可以处理Info.plist数据的缓存版本,因此最终编写的在设备或模拟器上执行的内容并不总是你想要的。
我曾尝试编写帖子复制资源包“运行脚本”,以便以不会导致它在我的本地git repo中更改的方式更改此信息,只发现这一点,而信息可以正常工作时PlistBuddy命令在Xcode旁边的terminal.app窗口中执行,如果没有完成,缓存的值就会被写入。
我终于辞职了,在Copy Bundle Resources阶段之前运行版本信息生成脚本,只是在另一个Run Script中自动提交更改,使用相同的git消息标签和获取auto的git标签-created。对于Settings.bundle / Root.plist文件,而不是每次都提交,我更喜欢只运行一个执行'git checkout - $ {PROJECT} /Resources/Settings.bundle/Root.plist'的终结脚本(这是我的存在,但可能不是每个人都放置自己的系统设置资源文件)。
检查更改,每次安装时运行部分内容以及部分内容,最后都有完成脚本,一些目标有6个脚本,另一个目标有7个脚本...
...但对我来说最重要的是它最终是自动化的...并且在Xcode中处理PlistBuddy时对我的plist文件做了什么。