我应该为 CFBundleVersion 和 CFBundleShortVersionString 使用什么值?

这是我第一次提交 iOS 应用程序,我不希望我的应用程序被拒绝。

这是来自苹果文档:

CFBundleVersion (String-iOS,OS X)指定 bundle 的构建版本号,它标识 bundle 的迭代(已发布或未发布)。构建版本号应该是由三个非负的、以周期分隔的整数组成的字符串,其中第一个整数大于零。字符串应该只包含数字(0-9)和句点(.)角色。每个整数的前导零都被截断,并将被忽略(即1.02.3等于1.2.3)。此密钥不可本地化。

CFBundleShortVersionString (String-iOS,OS X)指定 bundle 的发布版本号,它标识应用程序的已发布迭代。发布版本号是由三个以句点分隔的整数组成的字符串。第一个整数表示对应用程序的主要修订,例如实现新特性或主要更改的修订。第二个整数表示实现不太突出的特性的修订。第三个整数表示维护发布。

此键的值不同于“ CFBundleVersion”的值,后者标识应用程序的迭代(已发布或未发布)。可以通过将此键包含在 InfoPlist.string 文件中来对其进行本地化。

但这似乎有点奇怪,我对此的解释是把两种价值观放在一起,即:

CFBundleVersion: 1.0.0
CFBundleShortVersionString: 1.0.0

谁能百分之百确认一下我应该写什么?

81372 次浏览

可以这样想: “ short version”(CFBundleShortVersionString)是公共版本号。“版本”(CFBundleVersion)更多的是一个内部版本号,它可能比公开的“短版本”更频繁地更改。就个人而言,我使用相同的两个,但许多人更新的“版本”在每个构建。无论哪种方式,你通常更新“短版本”,当你发布到苹果。你更新“版本”的频率取决于你自己和你的需要。

Rmaddy 回答是正确的,我再加两点想法。

第三版编号

注意 iTunesConnect 网站上指定的第三个版本号,它是应用程序定义的一部分。如果这个数字与 Xcode 的不同,苹果会给你一个警告。您可以忽略这个警告,因为它不是一个 show-stop (不是一个“错误”)。

日期-时间为版本

另外,你不需要使用三个带标点符号的数字。这可能对某些应用程序有意义,在这些应用程序中,传统上第一个数字的变化表明某种戏剧性的变化通常会影响兼容性。

对于其他应用程序,您可能只想使用 ISO 8601标准格式样式的日期时间值(YYYYMMDDHHMM)。例如,201606070620。年-月-日-小时-分钟的顺序呈现出一个不断增长的数字,由于填充0的缘故总是相同的长度,按字母顺序排序时也是按时间顺序排列的。

我已经成功地在 iOS7、8和9中的一个正在运行的 iOS 应用程序上使用了这种版本号。

你甚至可以自动生成这个值。在你的项目的 Target > Build Phases > Run Script面板中:

  1. Shell字段中指定: /bin/sh
  2. 粘贴如下5行脚本。
  3. (可选)选中 Show environment variables in build log复选框。
  4. 取消选中 Run script only when installing复选框。

每次构建时,将捕获 协调世界时时区中的当前日期时间。脚本中的 -u标志使用 UTC 而不是当前默认时区。一般来说,程序员和系统管理员最好使用 UTC 而不是本地时区来思考问题。

#!/bin/bash
buildNumber=$(date -u "+%Y%m%d%H%M")
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $buildNumber" "$INFOPLIST_FILE"  # Version number
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"  # Build number
echo "DateTime for app version number: $buildNumber"

或者混合使用常规的 1.2.3作为版本号,日期时间作为构建号。要进行混合操作,只需在 CFBundleShortVersionString行前面注释掉 #

CFBundleShortVersionString 为您提供应用程序的 版本。每次将应用程序发布到应用程序商店时,它通常都会增加。这是在应用程序的 AppStore 页面的“ Version”部分中可见的版本。

CFBundleVersion 提供了用于开发和测试的 建筑编号,即“技术”用途。最终用户很少对构建数感兴趣,但是在开发过程中,您可能需要了解正在开发的内容和每个构建的固定内容。这通常是在内部版本的每次迭代中增加的。并且您可以使用像 Jenkins 这样的持续集成工具来自动增加每个构建上的构建数。

Version and Build numbers

这两个数字并不相互依赖,但保持它们平行以避免混淆是一个好主意。记住,一旦你的应用程序通过了 App Store 的审查,你需要像 Phil 和 TheSky 所说的那样增加构建数量,不管你是否发布它。

用例: 比方说,您有一个经过良好测试的构建,可以提交了。它的版本号是 1.0,构建号是 1.0.0.32。一旦您提交您的应用程序,您需要更新的版本为 1.0.1和构建编号为 1.01.0

我使用 CFBundleVersion来指示 短版本字符串的内部构建。我使用测试飞行为我的测试人员提交构建,因此他们之间的差异是非常有用的。

苹果公司的文档说 CFBundleVersion“应该是一个由 3非负数、周期分隔的整数组成的字符串”,但实际上它可以是 不止3个部分(如上面的答案所示)。我使用它来指示我的开发构建,比如我的 CFBundleShortVersionString 是1.0.0,我可以使用 CFBundleVersion 的1.0.0.11来指示这是我的1.0.0版本的第11个构建

提交到应用程序商店的每个 CFBundleVersion 都应该比以前更大,否则你将得到 错误项目 -90478: “无效版本。不能导入版本为“ xxx”的版本,因为新版本已经因为新版本提交而关闭。选择一个不同的版本号。”

CFBundleShortVersionString 只能有3个部分,否则将得到 ERROR ITMS-90060: Info.plist 文件中关键 CFBundleShortVersionString‘ xxx’的值必须是一个以句点分隔的 最多三个非负整数的列表。”

Basil Bourque 提到的 第三个号码,也就是在 ITunesConnect上显示的版本号,是事情可能变得复杂的地方。

我使用与 短版本字符串不同的 iTunesConnect 号码,因为当我第一次向应用程序商店提交我的应用程序时,我们已经发布了多轮内部版本。所以我用1.0表示 iTunesConnect 号码,用5.x 表示 CFBundleShortVersionString。在应用程序商店的下一个版本中,我提供了一个函数来检查应用程序商店中是否有更新的版本,并意识到我现在有麻烦了,因为我只能得到 iTunesConnect 号码(使用 http://itunes.apple.com/lookup?bundleId=) ,所以我需要做一些计算,然后再与 CFBundleShortVersionString 号码进行比较。

我试图通过使用 iTunesConnect 号码作为我的 CFBundleShortVersionString 来解决这个问题,但是得到了错误 错误 ITMS-90062: “这个 bundle 是无效的。在 Info.plist 文件中,关键字 CFBundleShortVersionString [ x.x.x ]的值必须包含比之前批准的版本[ x.x.x ]更高的版本。”

所以我建议你们还是一样的。

我从未在任何地方讨论过 CFBundleVersion 中每个字段的最大值是多少?

通过将应用程序中的 CFBundleVersion 设置为1.1.1,并查看“ lsregister-dump”中版本的十六进制值,我确定第一个字段的最大值是(2 ^ 22)-1或4194303,第二个和第三个字段的最大值是(2 ^ 21)-1或2097151。

这3个字段加起来是64位。

对于那些基于日期和时间使用 CFBundleVersion 的人来说,这意味着什么。

我将第一个字段设置为 YYYYMMDD。这总是大于允许的最大版本,并导致不可预测的结果,至少可以说,当启动服务决定运行哪个版本的应用程序时,你已经安装了多个版本,并使用类似“打开-一个应用程序名称”从命令行。

请把这个广泛传播开来,我相信很多人都会因为这个而不能坚持下去。

对我来说,最合理的方案是使用版本号(即。CFBundleShortVersionString)为实际版本号,然后使用构建号(即。CFBundleVersion)表示提交到应用程序商店。因此,除非有任何问题,并因此重新提交,这个数字始终是1。对于一个新版本,如果之前的版本在 TestFlight 测试或评审中出现问题,我会将其重置为1。

构建编号提供了一种方法来命名您为特定版本提供的每个提交。正如上面的定义所描述的,为应用程序的特定版本提供的所有构建的集合称为该版本的“发布列车”。对于 iOS 应用程序,版本号必须在每个版本列车 但是它们不需要在不同的发布列车上是独一无二的(我的重点)中是唯一的。也就是说,对于 iOS 应用程序,如果愿意的话,你可以在不同的发行版中再次使用相同的构建编号。

来自 技术注释 TN2420: 版本号和构建号

到目前为止,CFBundleVersion的苹果文档指出[强调我的] :

标识捆绑包迭代的构建版本。

...

此键是由 一到三个周期分隔的整数组成的机器可读字符串,例如10.14.1。字符串只能包含数字字符(0-9)和句点。

...

您可以包含更多的整数,但系统会忽略它们。

对于 CFBundleShortVersionString[强调我的] :

捆绑包的发行版或版本号。

...

这个键是这个包的 版本的用户可见字符串。所需的格式是 三个周期分隔的整数,比如10.14.1。字符串只能包含数字字符(0-9)和句点。

我建议对于每个构建(或 TestFlight 的每个版本)自动增加 CFBundleVersion,并且在您更改 CFBundleShortVersionString时将其重置为0。

您应该显式地计划或设计一种一致的方法来更新 CFBundleShortVersionString中的用户可见版本。