XCode 4.4捆绑版本更新在后续构建之前未获取

时间:2012-08-02 20:20:04

标签: xcode xcode4 xcode4.4

我可能在这里遗漏了一些简单的东西。我只是在归档我的应用程序时(为准备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阶段?

3 个答案:

答案 0 :(得分:1)

在Xcode 4.4.1中我创建新目标并添加到此目标构建阶段“运行自定义脚本”,它更新主目标Plist。此外,您应该将此目标添加到主目标的依赖关系

答案 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文件做了什么。