2012-08-02 42 views
4

我可能在这里错过了一些简单的东西。我正在尝试在XCode 4.4中自动增加我的内部版本号(仅在存档我的应​​用程序时)(准备TestFlight部署)。我有一个运行在目标上的工作shell脚本,并成功更新每个构建的info.plist文件。我的存档配置是名称'Ad-Hoc'。XCode 4.4捆绑版本更新没有拿起,直到后来生成

下面是脚本:

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文件被处理为一体的第一个小号TEPS。它始终在我的脚本运行并更新内部版本号之前,我假设为什么内部版本号在.ipa文件中永远不会是最新的。

有没有办法在处理info.plist文件之前强制运行脚本阶段?

+0

我认识到那个脚本的一些部分;-)你没有说过你如何将这个脚本挂接到构建过程中?你是否编辑了项目方案并添加到“档案”阶段? – trojanfoe 2012-08-20 12:02:31

回答

1

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

0

Mark(et al),我相信我遇到了您面临的同一问题,我会尝试用一句话来描述它,然后解释:

我认为/ usr/libexec/PlistBuddy从Xcode内部运行时,对Info.plist数据的缓存版本起作用,因此最终写在设备或模拟器上执行的内容并不总是您想要的。

我曾尝试编写后期复制资源包“运行脚本”,以便以不会导致其在本地git回购库内发生更改的方式更改此信息,但只是发现该信息才能正常工作当PlistBuddy命令在Xcode旁边的terminal.app窗口中执行时,如果未完成,缓存值将被写入。

我终于忍不住要在Copy Bundle Resources阶段之前运行版本信息生成脚本,并且只是自动提交另一个Run Script中的更改,使用相同的标签作为git消息和获取git标签自动创建。对于Settings.bundle/Root.plist文件,而不是每次都提交,我更愿意运行一个执行'git checkout - $ {PROJECT} /Resources/Settings.bundle/Root.plist'的终结脚本。 (这是我的存在位置,但可能不是每个人放置他们自己的系统设置资源文件的地方)。

更改的检查,运行它的一部分,在每次安装和它的部分,并在年底具有完成脚本之间,有6个剧本对一些目标和7另...

...但对我来说最重要的事情是,它最终能够正常自动化......并且在Xcode内部处理时绕过PlistBuddy对我的plist文件做的任何事情。

1

的原因,出现这种情况是由被运行时你的“运行脚本”,Xcode的生成过程已经处理项目的plist文件解压包版本号等

你可以看到这个(可能更详细,你想要的),通过转到XCode(View/Navigators/Show Log Navigator)中的日志导航器,然后选择一个“存档”构建。

构建操作的详细列表应该出现在您的主窗口中,而顶部附近的应该是Process <projectname>-Info.plist。如果使用右侧的图标展开此图标,则可以看到已运行的实际构建命令。

我解决这个问题的方式是更新原始plist文件,也更新处理过的文件。通过这样做,您可以在当前版本中获得更新的版本版本,而不是下一版本。

下面是我用来做这个的脚本(这是Ruby,所以你需要在解释器框中放入“/ usr/bin/ruby​​”来使用它,但是这个概念和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文件。