iOS:在构建阶段更改info.plist

时间:2011-08-02 13:19:51

标签: ios xcode build

我正在尝试执行以下操作:

  1. 在构建阶段,打开纯文本文件并阅读文本
  2. 将info.plist中的属性值更改为步骤1中获取的值。
  3. 我可以为此编写一个shell脚本吗?

    如果有人可以指导我实现这一点,那就太好了。

4 个答案:

答案 0 :(得分:19)

可能最简单的方法是使用PlistBuddy。我有一个Run Script阶段,如下所示:

BUILD_NUMBER=`git rev-list HEAD --count`
INFO_PLIST="$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH"
if [ -f "$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH" ] ; then
    oldversion=`/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "$INFO_PLIST"`
fi
if [ "$BUILD_NUMBER" != "$oldversion" ] ; then
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "$INFO_PLIST"
fi

(请注意,从Xcode 6开始,您必须在复制包资源阶段之后运行此,因为在此之前Info.plist未复制到目标位置并且PlistBuddy将失败。)

编辑01/17:已更新,以避免不必要的复制或目标签名。你不想触摸Info.plist,除非真的发生了变化,否则Xcode会将它(以及目标)视为已修改。检查先前的值CFBundleVersion可以显着加快构建速度 - 它在noop构建上节省了几秒钟。

答案 1 :(得分:13)

是的,你可以。我会分三步完成:

  1. 编写在第一个构建阶段之前运行的shell脚本。让这个脚本设置一个环境变量。
  2. 为您的项目启用“展开Info.plist中的构建设置”
  3. 在plist文件中使用环境变量,例如${MY_COOL_SETTING}

答案 2 :(得分:7)

@PeyloW提供了一种方法。另一种方法是添加Run Script构建步骤。在该步骤中,您可以随意重写Info.plist。我一直这样做来设置svnversion。

我建议将脚本放在一个文件中,然后将. myscript.sh放入Run Script阶段。这比将整个脚本直接放在Xcode中更容易理解和维护。

答案 3 :(得分:2)

我有一个脚本文件,它将内部版本号放入我的info.plist中的字段中。我在项目的info.plist中放了一些占位符文本,然后脚本就会替换它。它仅增加发布版本上的内部版本号。在开发构建时,它只是说它们是一个开发构建。

   if [ "$BUILD_STYLE" = "Release" ] 
   then
   if [ ! -f build-number ]; then
        echo 0 > build-number
   else
        expr  `cat build-number` + 1 > build-number.new
        mv build-number.new build-number
   fi

    perl -pi -e s/BUILD_NUMBER_PLACEHOLDER/`cat build-number`/ $BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app/Contents/Info.plist
   else
    perl -pi -e s/BUILD_NUMBER_PLACEHOLDER/`echo Development`/ $BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app/Contents/Info.plist
   fi