6

我在我的项目中使用它作为构建阶段:

export PLISTBUDDY="/usr/libexec/PlistBuddy"

export INFO="${CODESIGNING_FOLDER_PATH}/Info.plist"
export RXREVISION=`git describe --tags | perl -pi -E "s/[^-]+\-([^-]+).*/\1/"`
export RXVERSION=`git describe --tags | perl -pi -E "s/([^-]+)\-[^-]+.*/\1/"`
$PLISTBUDDY $INFO -c "add CFBundleVersion string $RXREVISION"
$PLISTBUDDY $INFO -c "set :CFBundleVersion $RXREVISION"
$PLISTBUDDY $INFO -c "add CFBundleShortVersionString string $RXVERSION"
$PLISTBUDDY $INFO -c "set :CFBundleShortVersionString $RXVERSION"

这非常适合更新已构建应用程序的 Info.plist 中的构建修订版,并且不会改变我的源代码树。

我尝试将我的更新版本脚本放在最后和链接阶段之前。无论哪种方式,它都能够影响对已构建应用程序的更改,但 dSYM 是从原始源代码树构建的。

构建的应用程序和构建的 dSYM 之间的版本号不匹配是一个问题。(HockeyApp 在这里抛出错误。)

如果我在源代码树中更新 Info.plist,我需要处理它的变化。这给我留下了两个我可以看到的选择:

  1. 将 Info.plist 置于源代码管理之下,并让脚本直接对其进行编辑。但这意味着我需要在每次构建后检查更改。
  2. 忽略 Info.plist,让脚本直接编辑它。但是在 Info.plist 中还有很多我想要在源代码控制下的东西。

我怎样才能让 dSYM 中的版本也自动更新,而不必处理我的源代码树中的 Info.plist 更改每个构建?

另外,切线:我如何查看 dSYM 中的版本?

4

4 回答 4

4

接受的答案是正确的,但没有提供有关如何修改 dsym 的 plist 的实际详细信息。将以下行添加到构建脚本中修改 dsym 中的 plist:

cd "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app.dSYM/Contents"
$PLISTBUDDY -c "Set CFBundleVersion $RXREVISION" Info.plist  
于 2014-01-28T10:06:28.397 回答
2

这是我正在使用的“从 git 设置 CFBundleVersion”构建阶段的完整脚本:

APP_INFO_PLIST="${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
DSYM_INFO_PLIST="${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist"

BUILD_NUMBER=`git rev-list HEAD --count`

/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "$APP_INFO_PLIST"
if [ -f "$DSYM_INFO_PLIST" ] ; then
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "$DSYM_INFO_PLIST"
fi

(注意它必须在 Xcode 6+ 中的“Copy Bundle Resources”之后运行。在 Xcode 10 的新构建系统中,确保将 Info.plist 文件指定为其输入文件的一部分。)

于 2014-11-30T14:33:35.737 回答
1

dSYM 包在根文件夹中也有一个 info.plist,具有相似的值。你也可以用类似的方式修改它。

另一种选择是在额外.xcconfig文件中定义版本号,并将 info.plist 中的版本号包含在其中,请参见此处

info.plist然后,您还可以通过使用多个独立文件并在构建设置中引用不同文件来决定您想要哪种版本控制或发布或测试构建,.xcconfig并且不包括在源代码控制下用于测试构建的文件。

一般来说,我建议对每个版本更改进行提交,因为这使得代码真正可重现并且在源代码控制系统中唯一地标识它。

除此之外,Apple 指定设置CFBundleVersion为“单调增加的字符串,由一个或多个句点分隔的整数组成”,请参见此处CFBundleShortVersionString是您的营销版本,例如您的目标是在版本上工作3.0

那么如何为发布构建执行以下操作:CFBundleVersion使用新的构建号和CFBundleShortVersion新的营销版本进行更新,3.0 Beta 1并提交它们,然后标记该提交以进行发布。版本号与任何其他元数据一样是您的源的一部分,特别是如果版本号还用于触发特定代码以实现兼容性、数据库升级或其他事情(通常会这样做)。

于 2012-11-11T13:59:39.673 回答
0

我创建了一个脚本,我可以将其放入任何 Xcode 项目文件夹并从运行脚本调用,该脚本将更新应用程序的 Info.plist 和 dSYM,以便内部版本号匹配。然后可以将其上传到 HockeyApp 和 iTunes Connect for TestFlight 和 App Store 等服务。

我更喜欢在 Xcode 的 Run Script 之外管理脚本,因为我可以更轻松地编辑它并保持项目文件的内容更小。我还可以独立于项目文件对脚本进行版本控制。

Build Number脚本中的 仅使用当前日期设置。还有其他方法可以生成唯一的内部版本号。Jared Sinclair 的博客介绍了一种方法,该博客使用 Git 哈希进行最新提交。我正在使用的脚本使用的时间戳可以缩短到一分钟。我发现知道何时创建构建并将构建号加倍作为时间戳很有用,我可以立即看到日期。就我的目的而言,它足够独特。

http://blog.jaredsinclair.com/post/97193356620/the-best-of-all-possible-xcode-automated-build

#!/bin/sh
set -e

# Purpose: Updates Info.plist for app and dSYM to a unique value for each build.

# Usage:
# Add as a Run Script in Xcode Build Phases

# UPDATE_SCRIPT=${PROJECT_DIR}/update_build_number.sh
# if [ -f ${UPDATE_SCRIPT} ]; then
#     sh ${UPDATE_SCRIPT}
# fi

BUILD_NUMBER=`date "+%Y.%m.%d.%H%M"`
APP_INFO_PLIST=${TARGET_BUILD_DIR}/${INFOPLIST_PATH}
DSYM_INFO_PLIST=${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist

if [ -f ${APP_INFO_PLIST} ]; then
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "${APP_INFO_PLIST}"
    echo "Updated ${APP_INFO_PLIST}"
else
    echo "Could not find ${APP_INFO_PLIST}"
fi

# Only the Release Configuration creates the dSYM
if [ "${CONFIGURATION}" = 'Release' ]; then
    if [ -f ${DSYM_INFO_PLIST} ]; then
        /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "${DSYM_INFO_PLIST}"
        echo "Updated ${DSYM_INFO_PLIST}"
    else
        echo "Could not find ${DSYM_INFO_PLIST}"
    fi  
fi
于 2015-12-30T20:31:32.257 回答