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

iOS:在构建阶段更改info.plist,ios,xcode,build,Ios,Xcode,Build,我正在努力做到以下几点: 在构建阶段,打开一个纯文本文件并读取文本 将info.plist中属性的值更改为步骤1中获得的值 我可以为此编写一个shell脚本吗 如果有人能指导我实现这一目标,那就太好了。是的,你可以。我会分三步来做: 编写在第一个构建阶段之前运行的shell脚本。让此脚本设置一个环境变量 为您的项目启用“在Info.plist中展开生成设置” 在plist文件中使用环境变量,如${MY\u COOL\u SETTING} @PeyloW提供了一种方法。另一种方法是添加运行脚本构建

我正在努力做到以下几点:

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


    如果有人能指导我实现这一目标,那就太好了。

    是的,你可以。我会分三步来做:

  • 编写在第一个构建阶段之前运行的shell脚本。让此脚本设置一个环境变量
  • 为您的项目启用“在Info.plist中展开生成设置”
  • 在plist文件中使用环境变量,如
    ${MY\u COOL\u SETTING}

  • @PeyloW提供了一种方法。另一种方法是添加运行脚本构建步骤。在这一步中,您可以随意重写Info.plist。我一直这样做是为了设置svreversion


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

    我有一个脚本文件,它将内部版本号放在我的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
    

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

    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会将其(以及目标)视为已修改。检查以前的值
    CbundLeverVersion
    可以显著加快构建速度-它在noop构建时为我节省了几秒钟。

    +1用于将脚本放在单独的文件中。我以前也重写过plist文件。但这样做往往会对源代码管理中的plist文件进行不必要的修改。因此,我改为使用env变量解决方案。env变量解决方案很好,如果我构建另一个版本控制脚本,为了简单起见,我可能会切换到该方法。脚本更灵活。谢谢!但是在这个阶段,我如何打开一个文件并从中读取文本呢?如果键是布尔值呢?那么它将不接受环境变量名称占位符。关于如何让脚本设置环境变量,有什么指导吗?另外,它不是应该是${MY_COOL_SETTING}吗?有人能确认这在最新的Xcode 4中是有效的吗?似乎对我不起作用(听起来确实不应该,毕竟这是一个次shell),我不明白这是如何被接受的答案。如何从脚本阶段导出环境变量。(步骤#1)我花了很长时间才弄明白为什么我的脚本适用于常规版本,但在存档版本上失败了。它必须在复制包资源之后运行。非常感谢。您不需要plist buddy,您可以使用带有自定义plist路径的标准
    defaults write
    命令来设置plist值