发布到App Store时,必须增加哪些iOS应用程序版本/构建号码?

155

iOS应用程序的版本/构建字段包括:

  • "Version"(String-iOS、OS X)CFBundleShortVersionString 指定捆绑包的发布版本号,该版本号标识应用程序的发布迭代。发行版本号是由三个点分隔的整数字符串组成。

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

  • "iTunes Connect版本号":创建新版本时在iTunes Connect中指定的版本号。

我的问题是:

在将新版本的应用程序上传到iTunes Connect并/或发布到App Store时,哪些版本/构建号需要递增

“版本”CFBundleShortVersionString或“构建”CFBundleVersion中可以保持不变吗?

如果有苹果源或iTunes Connect上传无效版本/构建号时显示的确切错误消息,则额外得分。


Android / Google Play注意事项:

引发此问题的讨论是,在Google Play商店中,Android应用程序的公共“版本”android:versionName 不需要递增,并且以任何方式也未经过验证。可以在发布、升级、降级或任意随机字符串之间保持android:versionName相同。

android:versionName — 一个字符串值,代表应用程序代码的发布版本,应该展示给用户。

这个值是一个字符串,可以使用 <major>.<minor>.<point> 字符串,或者使用任何其他类型 的绝对或相对版本标识来描述应用程序版本。

Android 中 versionName 和 versionNumber 的区别

android:versionCode 则被强制规定为递增的整数。


苹果文档

正如最新接受的答案中所指出的,苹果最近发表了一篇技术说明文档,详细介绍了他们的版本和构建号方案:

苹果技术说明 TN2420 - 版本号和构建号


一个详细的答案,附有截图:https://dev59.com/_GIj5IYBdhLWcg3w95Yc#31921249 - Yunus Nedim Mehel
10个回答

166

苹果技术笔记TN2420,版本号和构建号

摘要:

  • 配对的(版本构建号)必须是唯一的。
    • 序列有效:(1.0.1、12)->(1.0.1、13)->(1.0.2、13)->(1.0.2、14)...
  • 版本 (CFBundleShortVersionString) 必须按升序排列。
  • 构建号 (CFBundleVersion) 必须按升序排列。

版本号和构建号检查清单

以下是在向App Store提交新版本时可以检查的一些事项。确保您正确设置了版本号和构建号将帮助您避免因其配置不当而自动拒绝您的应用程序。

  1. 每个新版本的应用程序都需要发明一个新的版本号。这个数字应该比您使用的上一个版本号大。虽然您可以为任何特定发布的应用程序提供许多构建版本,但每个新发布的应用程序只需要使用一个新版本号。
  2. 您不能重复使用版本号。
  3. 对于每个提交的构建版本,您将需要发明一个新的构建号,其值大于您使用的上一个构建号(针对同一版本)。
  4. 您可以在不同的发布系列中重复使用构建号,但是您不能在同一发布系列中重新使用构建号。 对于macOS应用程序,您不能在任何发布系列中重新使用构建号。

根据检查清单,以下的 (版本,构建号) 序列也是有效的。

  • 案例: 在不同的发行版本中重复使用构建编号。(注意: 不是macOS应用程序)

    (1.0.0, 1) -> (1.0.0, 2) -> ... -> (1.0.0, 11) -> (1.0.1, 1) -> (1.0.1, 2)


1
@Emil,我认为它的(版本、构建号)配对不能被重复使用。 - AechoLiu
22
在发布之前,可以上传带有唯一构建号的版本号到苹果多次。但是一旦发布了,就不能再重复使用该版本号。 - pkamb
3
TN2420表明“版本号和构建号可以由最多三个部分组成,用句点分隔”,然后提供以下非法的示例_1.10000.1.5_。然而,似乎许多应用程序,包括Chrome(例如_68.0.3440.83_),使用包含4个部分的版本号。我猜这可以解释为TN2420页面提到“重要提示:此文档不再更新。”,但我无法找到定义新规则的更新文档。还有其他人感到困惑吗? - el_tigro
@catanman,我谷歌了一下并且找到了这个链接(https://www.chromium.org/developers/version-numbers)。版本号由4位数字组成,格式为 主版本号.次版本号.构建版本号.修复版本号。而iOS则将 构建版本号 单独作为一个属性。希望这可以帮到你。 - AechoLiu
2
错误地提交了两个相同的“版本”和“构建号”包。App Connect自动将第二次提交的“构建号”增加1。因此,我最终得到了1.3(50)仍然是1.3(50),而第二个1.3(50)变成了1.3(51)。我没有找到任何文档,说明在这种特殊情况下,App Connect会自动增加构建号,从而导致输入的Xcode构建和App Connect构建之间不匹配。这是已知/记录的行为吗? - geohei
显示剩余8条评论

39

CFBundleShortVersionString应该与您在iTunes Connect中提供的版本号匹配。它也是用户查看App Store中您的应用程序时显示的版本号。

版本号显示在商店中,该版本号应与您稍后在iTunes Connect中输入的版本号相匹配。

来源

CFBundleVersion不会显示在App Store中,但由iTunes用于确定您的应用程序何时已更新。

如果按照“设置版本号和构建字符串”中所述更新构建字符串,则iTunes会识别构建字符串已更改,并正确将新的iOS App Store包同步到测试设备。

来源

更具体地回答您的问题...

当新版本的应用程序上传到应用商店时,需要增加哪个版本/构建号码?
两个都需要增加。一个显示在App Store中,另一个由iTunes用于更新应用程序。
CFBundleShortVersionString或CFBundleVersion在应用程序更新之间是否可以保持不变?
不行。(元问题:这里的使用情况是什么?如果您以任何方式编辑了有效负载,则构建将不同,用户将想要了解此信息)。如果您尝试,您将看到以下错误消息:

Error messages

或者它们与先前的相应数字进行比较,以确保新版本的应用程序上传了一个数值更大的数字?

是的。使用 semver.org 标准。

CFBundleShortVersionString 和 CFBundleVersion 数字是否以任何方式相互比较?

不是。


2
我知道这两个数字是如何使用的。问题是:在发布应用程序的新版本时,它们是否都需要被递增? - pkamb
2
是的,如果您尝试将应用程序推送到App Store而不更新两者,您将看到一个错误消息,例如https://dev59.com/LXfZa4cB1Zd3GeqPYPdZ。 - Andy
谢谢,编辑得很好。特别是那个链接。组织者的验证器显示CFBundleVersion和CFBundleShortVersionString都有“必须包含更高版本”的错误。 - pkamb
1
给 SemVer 链接点赞... 给定版本号 MAJOR.MINOR.PATCH,当你进行不兼容的 API 更改时增加:MAJOR 版本,当你进行不兼容的 API 更改时, MINOR 版本,当你以向后兼容的方式添加功能时, PATCH 版本,当你进行向后兼容的错误修复时。 - jeet.chanchawat
关于这个问题:这里的使用情况会是什么?如果您以任何方式编辑了有效载荷,则构建将不同,用户将想要知道它。 我的使用情况是我的应用程序已经通过Apple成功审核,但在App Store中从未发布过。我发现了一个错误,我想修复它 - 而不更改CFBundleShortVersionString。这可能吗?我想拒绝自己的应用程序。 - testing
1
"CFBundleShortVersionString 应该与您在 iTunes Connect 中提供的版本号匹配。这也是用户查看您的应用程序时出现的版本号。我认为这些陈述都不正确。您可以使用任何适合您的版本号,只要它是递增且唯一的,它与 App Store Connect 中的版本号无关。除非您手动设置,否则它不会出现在 iOS 或应用商店中的任何位置。" - O'Rooney

34

CFBundleShortVersionString是版本的公共“名称”(例如:“2.5”或“3.8.1”)。每次发布都必须将其增加。

CFBundleVersion是私有的构建编号,不会在AppStore上显示。每次上传时都必须将其增加。这意味着,如果您在应用上线之前拒绝了二进制文件,并且您想上传一个新的二进制文件,则它将具有相同的CFBundleShortVersionString,但必须具有更高的CFBundleVersion(例如:公共“2.5”,私有“2.5”,然后拒绝二进制文件并重新上传私有“2.5.1”)。

编辑于2016年11月16日:

/\ CFBundleVersion属性也与代码中的NSURLConnection一起用于User-Agent头。

例如:如果CFBundleNameMyApp,而CFBundleVersion为2.21,则通过使用NSURLConnection直接发送的任何编程式HTTP查询都将嵌入以下标题:

User-Agent: MyApp/2.21 CFNetwork/... Darwin/...

(这不适用于由UIWebView自动发布的请求)。


2
上传/发布的要求有很大的区别。 - pkamb
@gabriel,我试图将构建号设置为X.X-rc2,但组织验证器不允许我设置与X.Y.Z不同的任何内容,其中X、Y和Z是整数 :S。有一个-rc2构建号将会很棒,你是否曾经能够提交一个带有它的版本? - Néstor
1
@nestor 你是对的,我错了。只允许输入数字。让我编辑我的答案。 - Gabriel
@gabriel,我使用一个脚本将X.X-rc2解析为X.X.2,用于CI系统生成buildNumber以上传到iTunesConnect。 - AechoLiu

6

CFBundleVersion和CFBundleShortVersionString必须大于应用程序的上一个版本号。将它们保持一致是一个好的做法。您应该在-info.plist中找到它们。

当您尝试在组织者中验证应用程序时,如果它们中的任何一个未被递增,它将抛出错误。昨晚发生了这种情况。


我在我的问题中提到了这两个键。你的答案是这两个值都必须增加吗?你能更好地支持你的答案吗? - pkamb
是的,两个都需要递增。昨晚在我尝试在递增它们之前提交时,它会抱怨这两个键。 - xoail
感谢提供额外信息。您应该编辑您的答案,添加上传构建时的经验。 - pkamb
8
“将它们保持一致是个好习惯” - 这未必正确。如果你有测试人员在开发你的应用程序,你可能希望随着应用程序的更改逐步增加版本号,但同时保持主版本号不变。例如,使用持续集成工具,你可以在部署到测试人员之前自动更新构建编号。 - Andy
@Andy 你说得对,很有道理。感谢指出这个用例。我一直只考虑单个开发者/测试环境的情况。 - xoail
保持它们相同可能是一个好的做法,但如果你这样做,并且使用苹果的TestFlight,你会发现每个构建都需要进行beta审核,然后才能发布到外部beta测试。该审核比App Store审核快得多,但仍可能需要一天左右的时间。此外,每天只有两次beta审核的限制可能成为主要瓶颈。 - Tony Adams

5

当前的Apple Technical Note TN2420, Version Numbers and Build Numbers(我的加粗)如下:

  1. 对于iOS应用程序,您可以在不同的发布系列中重复使用构建号,但是您不能在相同的发布系列中重新使用构建号。对于macOS应用程序,您不能在任何发布系列中重新使用构建号。

不幸的是,这意味着当您尝试在Mac Catalyst上发布相同的构建时,无法重复使用跟踪到发布系列编号的构建号。

例如,在我的情况下,由于一些早期问题,我将1.0.2(4)作为与iOS上的1.0.2(1)对应的Mac Catalyst应用程序发布。现在,当尝试在两者上发布1.0.3(1)时,该应用程序在MacOS上因为构建号而未能通过验证,而在iOS上则通过了验证。

我猜现在我正在定期在iOS和MacOS上发布同一应用程序,我将采用与日期对应的构建号,例如20200111,并在给定发布中需要更改构建号时递增小数点。


5

发布新版本到App Store时,必须同时增加CFBundleVersionCFBundleShortVersionString的值。

此外,其中一个字符串必须与在iTunes Connect中指定的版本号匹配。

Xcode Organizer Validator error: must increment the version number.

这个问题包括上述Xcode Organizer验证器拒绝验证应用程序的截图,当CFBundleVersionCFBundleShortVersionString未被增加时。

  • 此包无效。Info.plist文件中键CFBundleVersion [1.0]的值必须比先前上传版本[1.134]的值高。

  • 此包无效。Info.plist文件中键CFBundleShortVersionString [1.0]的值必须比先前上传版本[1.134]的值高。

验证器还会抛出错误,证明其中一个字符串必须与在iTunes Connect中创建的应用程序版本匹配。

  • 版本不匹配。Info.plist中的CFBundleVersion ['1.0']和CFBundleShortVersionString ['1.0']均不匹配在iTunes Connect中设置的应用程序版本['1.4']。

4
我可以确认,在尝试过两种方式后,版本和构建号的序列如下:...
1.0.0 (1)
1.0.1 (1)
1.0.2 (1)

对于 iOS 应用程序,将会被接受,但是对于 Mac(Catalyst)应用程序,它会返回以下错误:

ERROR ITMS-90061:“该捆绑包无效。Info.plist 文件中 key CFBundleVersion [1] 的值必须比先前上传版本 [2] 的值更高。”

Mac 版本和构建号需要如下设置...

1.0.0 (1)
1.0.1 (2)
1.0.2 (3)

对于iOS, 我以前会将版本号和第四个数字作为构建号,例如...

1.0.0 (1.0.0.1)
1.0.1 (1.0.1.1)
1.0.2 (1.0.2.1)

但这也不适用于Mac应用程序。当我第一次尝试提交我的Mac(Catalyst)应用程序时,苹果只接受三位或更少数字的版本号:

错误 ITMS-9000:"此捆绑包无效。Info.plist文件中CFBundleVersion [1.0.0.1]密钥的值必须是最多三个非负整数的点分隔列表。"

因此,我改为使用单个数字,每个构建都会增加该数字,并在版本号上继续增加。


你有它给你的任何错误消息吗?如果有,请引用它们! - pkamb

2

我正在准备发布一个新的Mac App Store应用程序。使用CalVer格式YEAR.release (build)

我上传了几个版本:2020.0 (1)2020.0 (2)等等。最终我提交了2020.0 (8)进行App Store审核。通过审核后,状态为待开发者发布

在发布之前,我想修复一些问题,所以我在同一版本中添加了一个新的构建:2020.0 (9)

这导致了错误:

应用商店连接操作错误 ERROR ITMS-90062: "此捆绑包无效。Info.plist 文件中的键 CFBundleShortVersionString 的值 [2020.0] 必须包含高于先前已批准版本 [2020.0] 的版本。请在 https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring 查找有关 CFBundleShortVersionString 的更多信息。" 这很烦人,因为我的 2020.0 版本实际上从未被发布。从这个问题的接受答案中,我印象中直到应用程序在应用商店上可用之前,可以继续使用相同版本号发布新版本。

解决方案似乎是,如果应用程序状态为待开发者发布,则无法更新“发布列车”(相同版本+新构建)。要么发布现有构建,然后增加版本,要么在App Store Connect中取消此发布,以允许此发布列车进行进一步上传。


1
如果需要上下文,我大约在2015年左右开发了一个应用程序,我认为我们使用了与您相同的构建策略,并且是允许的。当我在2018年管理另一个应用程序时,我遇到了与您相同的错误,因此我认为规则已更改为您所描述的方式。 - benc

1
你需要同时递增两个版本号。
上传新版本时,需要在iTunes Connect上创建一个新版本,这个版本号会自动高于之前的发布版本。在iTunes Connect上的这个版本需要期望与相同版本号的二进制文件一起使用,因此需要递增CFBundleShortVersionString。
如果更新了版本但忘记递增CFBundleVersion,则在上传过程中会遇到错误。请参见pkamb的答案和截图。
有关CFBundleShortVersionString和CFBundleVersion的详细信息,请参见:https://dev59.com/_GIj5IYBdhLWcg3w95Yc#31921249

-4
据我所知,你只需要增加构建号CFBundleVersion。增加短版本字符串并不一定需要,但你可能应该增加它,因为它会告诉用户这个应用是新的。然而,苹果公司确实说编号应该遵循传统的软件版本约定,如果你尝试重新上传一个已经存在的版本,iTunes Connect可能会抱怨。
长话短说,这样做可能有效,但可能也不行。

寻找权威答案,了解哪些键必须被递增。如果不需要递增CFBundleShortVersionString,那么“相同”的用户界面版本可以多次上传到应用商店吗? - pkamb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接