Xcode项目的“内部版本号”

什么是内部版本号及其用途? 它是否与版本号相同?

另外,如果将CFBuildDate作为string,并将CFBuildNumber作为string添加到info.plist中,则以下shell脚本(在添加到运行脚本构build阶段/ bin / bash时将自动更新您的构build编号和date:

# Auto Increment Version Script buildPlist=${INFOPLIST_FILE} CFBuildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBuildNumber" $buildPlist) CFBuildNumber=$(($CFBuildNumber + 1)) /usr/libexec/PlistBuddy -c "Set :CFBuildNumber $CFBuildNumber" $buildPlist CFBuildDate=$(date +%Y%m%d%H%M%S) /usr/libexec/PlistBuddy -c "Set :CFBuildDate $CFBuildDate" $buildPlist 

我使用的Xcode 4.3.3(4E3002),并设法build立号码(CFBundleVersion)自动增加每一个build设与以下步骤:

  1. select菜单项Product / Edit Scheme …(Command + <)
  2. 展开构build阶段
  3. select预执行
  4. 点击加号添加“新build脚本运行”
  5. input“/ bin / bash”作为“Shell”
  6. 从“提供构build设置”中select一个目标
  7. input以下代码:

     buildPlist=$SRCROOT/$INFOPLIST_FILE PlistBuddy="/usr/libexec/PlistBuddy" CFBundleVersion=`$PlistBuddy -c "Print CFBundleVersion" $buildPlist` CFBundleVersion=$(($CFBundleVersion + 1)) $PlistBuddy -c "Set :CFBundleVersion $CFBundleVersion" $buildPlist 

玩的开心!

许多人使用构build编号来跟踪一个项目“构build”的总次数(简单地编译为小型项目,也许更多涉及更大的项目)。

内部版本号是每个版本增加一个绝对值。 另一方面,版本号是用作特定版本号的简写的任意“标签”或“标签”。

所以说你已经build立了你的项目123次,你的内部版本号是“123”,但是为了简单起见,你可能会决定把它称为“1.0版本”。 如果你再build20次来修正一个bug,你的内部版本号是143,但是你的版本是“1.01”或者“1.1”,或者你决定命名它。

我也看到了基于源代码控制的构build编号的项目。 所以CVS / SVN团队可能会使用版本号作为版本号。 我也看到了使用最新提交的SHA作为内部版本号的git项目(尽pipe一些pipe理工具假设内部版本号是一个增量值 – 显然在SHA的情况下,不是这样)。

如果您想为CFBuildDate使用DATE字段,请使用:

 # get UTC date CFBuildDate=$(date -u +"%a %b %d %T GMT %Y") 

顺便说一句,伟大的提示从CDASHER

内部版本号是用于较小的更新(通常在开始的时候会变得非常高1,最终可能会是1000),例如:如果你改变了几行代码,但是没有改变逻辑或者在更新中创build新的特性。 版本号是相当大的更新,例如:在您的应用程序中的新function。 那么你可以把它从1.8更改为2.0。

内部编号是一个内部编号,表示应用程序的当前状态。 它不同于版本号,因为它通常不是面向用户的,并且不象版本号通常那样表示任何差异/特征/升级。

像这样想:

  • 构build(CFBundleVersion):构build的数量。 通常你从1开始,每增加一个应用程序就增加1。 它可以快速地比较哪个版本更新,它代表了代码库的进度感。 在使用QA进行工作时,这些可能是非常有价值的,而且需要确保在正确的构build中logging错误。
  • 营销版本(CFBundleShortVersionString) – 用于表示您的应用程序的此版本的用户正在使用的号码。 通常这遵循Major.minor版本计划(例如MyAwesomeApp 1.2),以便让用户知道哪些发行版是较小的维护更新,哪些是很大的新function。

为了在您的项目中有效地使用它,Apple提供了一个称为agvtool的强大工具。 它使您可以轻松设置内部版本号和市场营销版本。 在编写脚本时(例如,轻松更新每个版本的内部版本号,甚至查询当前内部版本号是什么),该function特别有用。 它甚至可以做更多的奇特的事情,如更新内部版本号时为您添加SVN标签。

要使用它:

  • 在版本控制下的Xcode中将项目设置为使用“Apple Generic”。
  • 在terminal
    • agvtool新版本1(将版本号设置为1)
    • agvtool新的营销版本1.0(设置营销版本为1.0)

查看agvtool的手册页获取大量信息

这在Xcode 6中适用于我:

 cd ${SOURCE_ROOT} buildPlist=${SOURCE_ROOT}/${PROJECT_NAME}/${PROJECT_NAME}-Info.plist PlistBuddy="/usr/libexec/PlistBuddy" buildNumber=`git rev-list HEAD --count` buildNumber=$(($buildNumber + 1)) $PlistBuddy -c "Set :CFBundleVersion $buildNumber" $buildPlist 

这可以在Xcode 6中使用,并且只在归档时才修改dSYM info字典:

 if [ "${CONFIGURATION}" = "Release" ]; then buildPlist="${SOURCE_ROOT}/${PROJECT_NAME}/${PROJECT_NAME}-Info.plist" PlistBuddy="/usr/libexec/PlistBuddy" CFBundleVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}") CFBundleVersion=$(($CFBundleVersion + 1)) $PlistBuddy -c "Set :CFBundleVersion $CFBundleVersion" "$buildPlist" $PlistBuddy -c "Set :CFBundleVersion $CFBundleVersion" "$INFOPLIST_FILE" $PlistBuddy -c "Set :CFBundleVersion $CFBundleVersion" "${DWARF_DSYM_FOLDER_PATH}/${WRAPPER_NAME}.dSYM/Contents/Info.plist" fi