CFBundleVersion和CFBundleShortVersionString应该使用什么值?


98

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

这来自Apple Docs:

CFBundleVersion(String-iOS,OS X)指定捆绑软件的内部版本号,该版本号标识捆绑软件的迭代(已发行或未发行)。内部版本号应该是由三个非负的,由句点分隔的整数组成的字符串,并且第一个整数大于零。该字符串应仅包含数字(0-9)和句点(。)字符。每个整数前导零将被截断,并且将被忽略(即1.02.3等于1.2.3)。该密钥不可本地化。

CFBundleShortVersionString(String-iOS,OS X)指定捆绑软件的发行版本号,该发行版标识应用程序的发行版本。发行版本号是一个由三个句点分隔的整数组成的字符串。第一个整数表示应用程序的主要修订,例如实现新功能或重大更改的修订。第二个整数表示实现次要特征的修订。第三个整数表示维护版本。

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

但这似乎有些奇怪。我对此的解释是将两个值设置为相同,即:

CFBundleVersion: 1.0.0
CFBundleShortVersionString: 1.0.0

有人可以确认100%那是我应该放的吗?


1
据此,可以对CFBundleShortVersionString进行本地化。但是,如果必须是三个由句点分隔的整数,则可以进行哪种定位?
瑞克

@Rick我想这意味着您可以将其转换为实际上具有不同数字的语言,例如阿拉伯语?
shiser 2015年

@shiser只是为了学究,“阿拉伯数字”实际上是我们在西方世界以及大多数其他地方使用的数字。但是我明白了您的意思,并且阿拉伯世界的某些地方不使用“阿拉伯数字”。en.wikipedia.org/wiki/Arabic_numerals
RenniePet

1
这里的另一个答案。stackoverflow.com/q/21125159/419348
AechoLiu

Answers:


77

这样想:“短版本”(CFBundleShortVersionString)是公共版本号。“版本”(CFBundleVersion)更多是内部版本号,它比公共“简短版本”更频繁地更改。就我个人而言,我对两者都使用相同的东西,但是很多人在每次构建时都会更新“版本”。无论哪种方式,通常在发布到Apple时都更新“简短版本”。更新“版本”的频率取决于您和您的需求。


14
请注意,捆绑软件版本(CFBundleVersion)必须在数值上超过您先前应用程序的捆绑软件版本,否则在提交到App Store时会出现错误。参见stackoverflow.com/questions/4933093/…
Phil

3
与上述Phil相似,如今,如果您重新提交失败的(未经App Store批准)的版本,则现在似乎需要在每次提交时更改CFBundleVersion,因此除非您总是很完美,否则这些数字可能会有所不同,或您不介意在成功提交到App Store所需的任何更改后更改公开(CFBundleShortVersionString)版本号。
likethesky

106

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

CFBundleVersion为您提供了用于开发和测试的内部版本号,即“技术”目的。最终用户很少对内部版本号感兴趣,但是在开发过程中,您可能需要了解每个内部版本正在开发和修复的内容。通常在内部发行版的每次迭代中增加。而且,您可以使用Jenkins之类的持续集成工具来自动增加每次构建的内部版本号。

版本号和内部版本号

这两个数字并不相互依赖,但是最好将它们保持平行以避免混淆。请记住,一旦您的应用通过了App Store的审查,无论您是否发布,都需要像Phil和LikeTheSky所说的那样增加内部版本号。

用例:假设您有一个经过良好测试的构建,可以提交了。它的版本号是1.0.0,内部版本号是1.0.0.32。提交应用后,您需要将版本更新为1.0.1并将内部版本号更新为1.0.1.0


4
因此,是否可以忽略文档(在问题中引用)中关于CFBundleVersion为“ 三个 ”句点分隔值的那一点?
big_m

我认为取决于您。如果您不经常发布发行版,或者不需要通过频繁的测试周期严格遵循错误修复程序,那么请执行以下步骤:您最好同时使用3位数字。
尤努斯·尼迪姆·梅赫尔

那么CFBundleVersion对于应用商店构建可以为0吗?苹果会拒绝吗?
kraftydevil

3
是的,您可以在标点符号中使用3个数字以外的值。我已经使用了日期时间值,例如201606070620在发货的iOS应用程序中。
罗勒·布尔克

3
@BasilBourque,如果您不遵循准则,则使用应用内购买可能会遇到问题。参见技术说明2413
DanSkeel

16

rmaddy答案是正确的。我将再添加两个想法。

第三版本号

请注意在iTunesConnect网站上作为应用程序定义的一部分指定的第三个版本号。如果该数字不同于Xcode中的两个数字,Apple会警告您。您可以忽略警告,因为它不是停止显示的对象(不是“错误”)。

日期时间作为版本

另外,您无需在标点符号中使用三个数字。对于某些应用程序来说,这可能是有意义的,传统上,第一个数字的更改表示通常会影响兼容性的某种戏剧性更改。

对于其他应用,您可能只想使用ISO 8601标准格式样式(YYYYMMDDHHMM)中的日期时间值。例如,201606070620。年,月,日,小时,分钟的顺序表示一个不断增加的数字,由于填充零而导致其长度始终相同,并且按字母顺序排序也是按时间顺序排列的。

我已经在运行iOS 7、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复选框。

每次进行构建时,都会捕获UTC时区中的当前日期时间。-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行即可#


7

对我而言,最明智的方案是使用版本号(即CFBundleShortVersionString)作为实际版本号,然后使用内部版本号(即CFBundleVersion)代表提交到App Store的提交。因此,除非有任何问题,然后重新提交,否则该数字始终为1。对于新发行版,如果以前的版本在TestFlight测试或审查中有问题,我将重置为1。

内部编号提供了一种命名您为特定版本提供的每个提交的方式。如上述定义所述,您为应用程序的特定版本提供的所有构建的集合称为该版本的“发行版”。对于iOS应用,内部版本号在每个发行版中必须唯一,但是在不同发行版中不需要唯一。也就是说,对于iOS Apps,如果需要,您可以在不同的发行版中再次使用相同的内部版本号。

摘自TN2420技术说明:版本号和内部版本号


1
很高兴看到提供官方参考的答案,以确认此页面上其他答案中给出的解释。
user2067021

6

我用CFBundleVersion来指示内部构建CFBundleShortVersionString。我使用试飞为测试人员提交构建版本,因此它们之间的区别非常有用。

苹果的文件说CFBundleVersion“应该是由一串3非负,期间隔开的整数”但实际上,它可以MORE THAN 3个部分(如上面的回答所示)。我用它来表示我的开发版本,比如说我的CFBundleShortVersionString是1.0.0,我可以使用1.0.0.11来表示CFBundleVersion,这是我的第1.0.0版发布。

提交给应用程序商店的每个CFBundleVersion应该大于以前,否则您将收到错误ITMS-90478:“无效版本。由于新版本的提交已关闭更高版本,因此无法导入版本为“ xxx”的版本。选择一个不同的版本号。”

CFBundleShortVersionString只能包含3个部分,否则会出现错误ITMS-90060:Info.plist文件中的CFBundleShortVersionString'xxx'键的值必须是一个由句点分隔的列表,最多为三个非负整数。”

Basil Bourque提到的第三个数字,即iTunesConnect上显示的版本号,可能会使事情变得复杂。

我使用与CFBundleShortVersionString不同的iTunesConnect编号,因为当我第一次将我的应用程序提交到应用程序商店时,我们已经进行了许多轮内部发行。因此,我将1.0用于iTunesConnect编号,将5.x用于CFBundleShortVersionString。在App Store的下一个发行版中,我提供了一个功能来检查App Store中是否有较新版本,并意识到我现在遇到了麻烦,因为我只能获取iTunesConnect编号(使用http://itunes.apple.com/lookup?bundleId=),因此在比较之前我需要做一些计算CFBundleShortVersionString编号。

我试图通过将iTunesConnect编号用作CFBundleShortVersionString来解决此问题,但收到错误消息ERROR ITMS-90062:“此捆绑包无效。Info.plist文件中的CFBundleShortVersionString [xxx]键值必须包含比该版本更高的版本。以前批准的版本[xxx]。”

因此,我建议始终使它们相同。


5

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

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

3个字段总计为64位。

这对我们这些根据日期和时间使用CFBundleVersion的人有影响。

我将第一个字段设置为YYYYMMDD。这总是大于允许的最大版本,并且至少在启动服务决定要运行哪个版本的应用程序时,至少安装了多个版本并且使用了诸如'open -a Appname之类的东西,这至少导致了无法预测的结果。从命令行。

请广泛传播。我相信很多人对此都不会感到困惑。


您还记得添加了第四个字段(1.1.1.20191201)时会执行什么操作,以及最终使用了什么?我真的希望Apple能够使用与android相同的数值。PS感谢您查找此!
spacesuitdiver

我相信这里记录了限制并且比这里提到的限制要严格得多。
saagarjha

3

到目前为止,Apple的CFBundleVersion文档 [强调我的]:

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

...

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

...

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

对于 CFBundleShortVersionString [强调我的]:

捆绑软件的发行版或版本号。

...

该密钥是捆绑软件版本用户可见字符串。所需格式为三个句点分隔的整数,例如10.14.1。该字符串只能包含数字字符(0-9)和句点。

我建议只是自动递增 CFBundleVersion针对每个构建(或TestFlight的每个发行版),并在每次更改时将其重置为0 CFBundleShortVersionString

您应该明确计划或设计一致的方法来更新中的用户可见版本CFBundleShortVersionString

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.