应用程序商店发布时,哪个 iOS 应用程序版本/版本号必须增加?

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

  • “ Version”短版本字符串(String-iOS,OS X)指定捆绑包的发布版本号,它标识应用程序的已发布迭代。发布版本号是由三个以句点分隔的整数组成的字符串。

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

  • “ iTunes Connect Version Number” : 在 iTunes Connect 上创建应用程序的新版本时指定的版本号。

我的问题是:

当应用程序的新版本被上传到 iTunes Connect 并/或发布到 App Store 时,哪个版本/构建编号是 需要增加

在应用程序更新之间,“版本”CFBundleShortVersionString或“构建”CFBundleVersion是否保持不变?

在上传无效的版本/构建编号时,iTunesConnect 会显示 Apple 源代码的额外分数或确切的错误消息。


Android/Google Play 备注:

提出这个问题的讨论是,Google Play Store 中的 Android 应用程序的公共“版本”确实需要增加 没有,并且在 不可能中进行了验证。在发布、升级、降级之间,android:versionName可以保持不变,也可以是任何随机字符串,而不是看起来是有效的“版本号”。

android:versionNameー一个字符串值,表示应用程序代码的发布版本,因为它应该显示给用户。

该值是一个字符串,以便您可以将应用程序版本描述为 <major>.<minor>.<point>字符串、 或任何其他类型绝对或相对版本标识符。

Android 中版本名和版本号的区别

android:versionCode被强制为一个发布时递增的整数。


苹果文档

正如 新近接受的答案中提到的,苹果公司最近发布了一份技术说明,详细介绍了他们的版本和构建编号方案:

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

126155 次浏览

AFAIK,根据我的想法,你只需要增加构建编号 CFBundleVersion。增加短版本字符串不是必需的,尽管您可能应该增加它,因为它确实告诉用户该应用程序是新的。不过,苹果确实表示,编号应遵循传统的软件版本号约定,如果你试图重新上传已有版本,iTunes Connect 可能会抱怨。

长话短说,它可能有用,但可能没用。

CFBundleVersion 和 CFBundleShortVersionString 必须大于应用程序的最新版本号。让他们保持不变是个好习惯。你应该在你的-info.plist 中找到它们。

当您尝试在组织者中验证应用程序时,如果它们中的任何一个没有增加,它将抛出一个错误。昨晚发生在我身上的事。

CFBundleShortVersionString应该匹配您给 iTunes Connect 的版本号。它也是用户在应用程序商店中查看应用程序时出现的版本号。

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

来源

CFBundleVersion不会显示在应用程序商店中,而是由 iTunes 用来确定应用程序何时更新。

如果您更新了构建字符串,如“设置版本号和构建字符串”中所述,iTunes 识别出构建字符串发生了更改,并且正确地将新的 iOS 应用程序商店软件包与测试设备同步。

来源

更具体地回答你的问题。

当应用程序的新版本上传到应用程序商店时,需要增加哪个版本/构建编号?

两者都有。一个显示在应用程序商店,另一个被 iTunes 用来更新应用程序。

CFBundleShortVersionString 或 CFBundleVersion 在应用程序更新之间是否保持相同?

没有。(元问题,这里的用例是什么?如果您以任何方式编辑了有效负载,那么构建将是不同的,并且用户将希望了解它)。如果您尝试,您将看到如下错误消息:

Error messages

或者它们是否与之前的相应数字相比较,以确保随着新版本的应用程序一起上传的数字更大?

是的,使用 Semver.org标准。

CFBundleShortVersionString 和 CFBundleVersion 编号是否以任何方式相互比较?

没有。

在向 App Store 发布新版本时,CFBundleVersionCFBundleShortVersionString必须的都会增加。

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

Xcode Organizer Validator error: must increment the version number.

这个问题 包括上面的截图,当 CFBundleVersionCFBundleShortVersionString没有增加时,Xcode Organizer 的 Validator 拒绝验证应用程序。

  • 此包无效。Plist 文件中键 CFBundleVersion[1.0]的值必须包含比之前上载的版本[1.134]更高的版本。

  • 此包无效。Plist 文件中键 CFBundleShortVersionString[1.0]的值必须包含比之前上载的版本[1.134]更高的版本。

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

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

CFBundleShortVersionString 是版本的公共“名称”(例如: “2.5”或“3.8.1”)。 你必须在每个 释放增加它。

CFBundleVersion 是私有的 建造号码。在 AppStore 上看不到它。你必须在每个 上载增加它。这意味着如果你在二进制文件上线之前拒绝它,并且你想上传一个新的二进制文件,它将拥有相同的 短版本字符串,但是必须有一个更高的 CFBundleVersion(例如: public“2.5”,private“2.5”,然后二进制文件拒绝,并重新上传 private“2.5.1”)

Edit on Nov 16,2016编辑于2016年11月16日:

/在代码中 NSULConnection发送的 User-Agent报头中也使用 CFBundleVersion属性(与 CFBundleName一起)。

示例: 如果 CFBundleNameMyAppCFBundleVersion是2.21,那么使用 NSULConnection的代码直接发送的任何编程 HTTP 查询都将嵌入标题:

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

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

你需要增加 都有

上传新版本时,您需要在 iTunes Connect 上创建一个新版本,该版本将自动高于以前的版本。ITunes Connect 上的这个版本需要一个版本号相同的二进制文件,因此需要增加 CFBundleShortVersionString

如果您更新了版本,但是忘记递增 CFBundleVersion,那么在上传过程中将会遇到一个错误。见 pkamb 的答案和截图。

有关 CFBundleShortVersionStringCFBundleVersion的详情,请参阅: https://stackoverflow.com/a/31921249/936957

苹果技术注释 TN2420,版本号和版本号

摘要:

  • 该对(VersionBuild number)必须是唯一的。
    • 序列是有效的: (1.0.1,12)-> (1.0.1,13)-> (1.0.2,13)-> (1.0.2,14) ..。
  • Version(短版本字符串)必须按升序排列。
  • Build number(CFBundleVersion)必须按升序排列。

版本号和版本号检查表

在向 AppStore 提交新版本时,您可以检查以下内容。确保您的版本号和构建号设置正确,将有助于您避免您的应用程序由于配置不当而被自动拒绝。

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

根据检查表,以下 (Version, Build Number)序列也是有效的。

  • 案例: 在不同的发行版中重用 Build Number(注意: 没有 macOS 应用程序)

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

目前的 苹果技术注释 TN2420,版本号和版本号表示(我的粗体字) :

  1. 对于 iOS 应用程序,你可以在不同的发行版中重复使用构建编号,但是你不能在同一个发行版中重复使用构建编号。对于 MacOS 应用程序,您不能在任何发布列车中重用构建编号.

不幸的是,这意味着当您试图在 Mac Catalyst 上发布相同的版本时,您不能重用跟踪到 iOS 上发布列车号的版本号。

例如,在我的例子中,由于一些早期的问题,我最终发布了1.0.2(4)作为一个 Mac Catalyst 应用程序,对应于 iOS 上的1.0.2(1)。现在,当试图在两个版本上都发布1.0.3(1)时,由于版本号,应用程序在 MacOS 上无法通过验证,而在 iOS 上通过验证。

我想既然我已经在 iOS 和 MacOS 上定期发布了同一个应用程序,我会采用与日期相对应的编译号,比如20200111,如果我需要在给定的版本中更改编译号,我会用小数点来递增。

我可以确认,已经尝试了两种方式,一个版本序列和构建数字像..。

1.0.0 (1)
1.0.1 (1)
1.0.2 (1)

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

错误 ITMS-90061: “此包无效。Plist 文件中的关键 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]的值必须是一个最多包含三个非负整数的句点分隔列表。”

因此,我更改为一个单一的数字,每次构建都递增,并且在不同版本号之间继续递增。

我准备发布一个新的苹果应用程序商店应用程序。使用 CalVer格式的 YEAR.release (build)

我上传了几个版本: 2020.0 (1)2020.0 (2)等等。我最终提交了 2020.0 (8)应用程序商店审查。已经通过审查,现在在 挂起的开发人员版本州。

我想在发布之前修复一些东西,所以我在同一个发布列车上添加了一个新版本: 2020.0 (9)

这导致了错误:

应用程序商店连接操作错误

ERROR ITMS-90062 : “此包无效。Plist 文件中键 CFBundleShortVersionString[2020.0]的值必须包含比之前批准的版本[2020.0]更高的版本。请在 https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring找到更多关于 CFBundleShortVersionString的信息

这是恼人的,因为我的 2020.0版本从来没有实际上是 释放。从这个问题被接受的答案,我的印象是,直到应用程序在应用程序商店上可用,你可以继续发布新的构建与相同的版本。

解决方案似乎是,如果应用程序状态为 挂起的开发人员版本,则不能更新“发布列车”(相同版本 + 新版本)。要么发布您现有的版本,然后增加版本,或者应用程序商店连接中的 取消此版本,以允许进一步上传这个发布列车。