Xcode 项目的"Build number"



什么是内部版本号,它有什么用途?它和版本号一样吗?

此外,如果您将CFBuildDate作为字符串和CFBuildNumber作为字符串添加到info.plist中,则以下shell脚本(添加到运行脚本构建阶段/bin/bash时(将自动更新您的构建编号和日期:

    # 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(,并通过以下步骤使构建号(CFBundleVersion(在每次构建时自动增加:

  1. 选择菜单项"产品/编辑方案…"。。。(命令+<(
  2. 扩展了构建阶段
  3. 选择预操作
  4. 单击加号添加"新建运行脚本操作">
  5. 输入"/bin/bash"作为"Shell">
  6. 在"从中提供生成设置"中选择一个目标
  7. 输入以下代码:

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

玩得开心!

许多人使用构建号来跟踪项目"构建"的总次数(只是为小项目编译,可能为大项目编译一些更复杂的过程(。

内部版本号是一个绝对值,每次生成都会递增。另一方面,版本号是一个任意的"标签"或"标记",用作特定内部版本号的简写。

假设你已经构建了123次项目,你的构建号是"123",但为了简单起见,你可能会决定将其称为"1.0版"。如果你再构建20次来修复一个错误,你的构建号是143,但你的版本是"1.01"或"1.1",或者你决定给它起什么名字。

我还见过一些项目,它们的内部版本号基于源代码管理。因此,CVS/SVN团队可能会使用修订号作为构建号。我也见过git项目使用最新提交的SHA作为构建号(尽管一些管理工具认为构建号是一个增量值——显然,在SHA的情况下,它不是(。

内部编号表示应用程序的当前状态。它与版本号的不同之处在于,它通常不面向用户,也不像版本号那样表示任何差异/功能/升级。

这样想:

  • Build(CFBundleVersion(:生成的编号。通常情况下,你从1开始,每次构建应用程序都会增加1。它可以快速比较哪个构建是最近的,并表示代码库的进度感。当与QA合作时,这些可能非常有价值,并且需要确保根据正确的构建记录错误
  • 市场营销版本(CFBundleShortVersionString(-面向用户的数字,用于表示应用程序的此版本。通常,这遵循Major.minor版本方案(例如MyAwesomeApp 1.2(,让用户知道哪些版本是较小的维护更新,哪些是重要的新功能

为了在项目中有效地使用它,苹果提供了一个名为agvtool的好工具。它允许您轻松设置内部版本号和营销版本。它在编写脚本时特别有用(例如,轻松地更新每个构建的内部版本号,甚至查询当前的内部版本编号(。它甚至可以做一些更奇特的事情,比如在更新内部版本号时为您标记SVN。

使用它:

  • 在版本控制下的Xcode中设置您的项目以使用"Apple Generic">
  • 在终端
    • agvtool新版本1(将内部版本号设置为1(
    • agvtool新市场营销版本1.0(将市场营销版本设置为1.0(

请参阅agvtool的手册页以获取大量好的信息

内部版本号用于小的更新(通常在开始时为1,可能在1000处结束(,例如:如果您更改了几行代码,但没有更改逻辑或在更新中创建新功能。版本号适用于较大的更新,例如:应用程序中的新功能。然后您可以将其从1.8更改为2.0。

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

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

顺便说一句,cdasher 的伟大提示

这对我在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信息字典,仅在存档时:

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

CFBundleVersion(捆绑版本(-也称为Marketing version,它将显示在Appstore上的产品页面上。

CFBundleShortVersionString(Bundleversionsstring,short(-捆绑包编号,通常用作次要版本,只有TestFlight用户才能看到

以下是如何以编程方式在Swift (4+)中获取它们:

let buildNumber = Bundle.main.infoDictionary?[kCFBundleVersionKey as String] as? String,
let appVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString")

我曾经在我的shell脚本中需要营销版本,下面是我如何使用xcode build tools:获得它的

xcodebuild -showBuildSettings -project ${SDK_PROJECT} | sed '1d;s/^ *//;s/"/\"/g;s/ = (.*)/="1"/;s/ = /=/;s/UID.*//' > xcodebuild-env.tmp
source xcodebuild-env.tmp
echo "${MARKETING_VERSION}"

最新更新