在App Store发布后,必须增加哪个iOS应用版本/内部版本号?


107

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

  • “ Version” CFBundleShortVersionString(字符串-iOS,OS X)指定捆绑软件的发行版本号,该编号标识应用程序的发行版本。发行版本号是一个由三个句点分隔的整数组成的字符串。

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

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

我的问题是:

将新版本的应用程序上载到iTunes Connect和/或发布到App Store时,需要增加哪个版本/内部版本号?

应用更新之间的“版本” CFBundleShortVersionString或“内部版本”可以CFBundleVersion保持不变吗?

在上传无效的版本/内部版本号时,Apple来源的加分或iTunesConnect会显示确切的错误消息。


Android / Google Play注意事项:

促使这个问题的讨论是,在谷歌的Android应用程序的公版“”玩不商店并不需要被递增,是没有办法验证。该android:versionName可以保持相同的版本之间,升级,降级,或为任何随机字符串,而不是东西,似乎是一个有效的“版本号”。

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

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

Android中的versionName和versionNumber之间的区别

而将android:versionCode强制为释放增量整数。


苹果文档

新接受的答案中所述,Apple最近发布了技术说明,其中详细说明了其版本和内部编号方案:

Apple技术说明TN2420-版本号和内部版本号


Answers:


115

Apple技术说明TN2420,版本号和内部版本号

摘要:

  • 该对(VersionBuild number)必须是唯一的。
    • 该序列有效:(1.0.1,12)->(1.0.1,13)->(1.0.2,13)->(1.0.2,14)...
  • VersionCFBundleShortVersionString)必须按升序排列。
  • Build numberCFBundleVersion)必须按升序排列。

版本号和内部版本号清单

将新的版本提交到App Store时,您可以检查以下几件事。确保正确设置了“版本号”和“内部版本号”,可以避免因配置不当而自动拒绝您的应用程序,从而为您提供帮助。

  1. 对于您的App的每个新版本,您需要发明一个新的版本号。该编号应比您使用的上一个版本号更大。尽管您可以为App的任何特定发行版提供许多构建,但是您只需为App的每个新发行版使用一个新的版本号。
  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)


我很困惑。条件之一是“您不能重复使用版本号”,但是在最后一个示例中,版本号保持不变,而内部版本号却在增加。我在误解什么吗?
埃米尔(Emil)

@Emil,我认为它(版本,内部版本号)对不能重复使用。
AechoLiu

6
@EmilParikh版本号可以在发行前多次上传到Apple ,每个版本号都有唯一的内部版本号。但是,一旦发布,您将无法重复使用该版本号。
pkamb

1
TN2420说:“版本号和内部版本号最多包含三个由句点分隔的组件 ”,然后提供以下非法示例1.10000.1.5。但是,看起来许多应用程序(包括chrome)都使用包含4个组件的版本号(例如68.0.3440.83)。我猜这可以由以下事实来解释:TN2420页面上提到“ 重要:此文档不再更新。 ”但是我找不到能够定义新规则的更新文档。其他人感到困惑吗?
catanman

@catanman我喜欢这个语义版本。让版本以(major, minor, patch)方式组成。我之前使用过4个组件,但App Store不接受包含4个组件的格式。
AechoLiu

38

CFBundleShortVersionString应与你给iTunes Connect中的版本号。它也是用户在App Store中查看您的App时显示的版本号。

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

资源

CFBundleVersion不会在App Store中显示,但使用的iTunes来决定的程序进行了更新。

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

资源

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

将新版本的应用程序上载到应用程序商店时,需要增加哪个版本/内部版本号?

都。一个显示在App Store中,另一个显示在iTunes上以更新App。

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

否。(问问题,这里的用例是什么?如果您以任何方式编辑了有效负载,则构造将有所不同,并且用户将想知道它)。如果尝试,您将看到以下错误消息:

错误讯息

还是将它们与之前的相应数字进行比较,以确保在新版本的应用中上传的数字更大?

是。使用semver.org标准。

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

没有。


2
是的,我知道如何使用这两个数字。问题是:发布新版本的应用程序时是否都需要将它们都增加?
pkamb 2014年

2
是的,如果你试图把一个应用进入App Store,而无需更新这两个,你会看到一个错误信息如stackoverflow.com/questions/19367893/...
安迪

谢谢,很棒的编辑。特别是对于该链接。对于CFBundleVersion和CFBundleShortVersionString,组织者的验证器显示“必须包含更高版本”错误。
pkamb

1
为SemVer链接+1 ...给定版本号MAJOR.MINOR.PATCH,请增加以下值:进行不兼容的API更改时,MAJOR版本;以向后兼容的方式添加功能时,MINOR版本;向后制作时的PATCH版本。兼容的错误修复。
jeet.chanchawat 2014年

关于这一点:用例在这里是什么?如果您以任何方式编辑了有效负载,构建都会有所不同,并且用户将想了解它。我的用例是我的应用程序已被Apple成功审查,但从未在App Store中发布过。我发现了一个错误,并且想对其进行错误修复-无需更改CFBundleShortVersionString。这可能吗?我想拒绝自己的应用。
测试

31

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

CFBundleVersion是私有内部版本号。在AppStore上看不到它。您必须在每次上传时增加它。这意味着,如果您曾经在二进制文件在线之前拒绝它,并且想要上传新的二进制文件,它将具有相同的CFBundleShortVersionString,但必须具有更高的CFBundleVersion(例如:public“ 2.5”,private“ 2.5”,然后二进制拒绝,然后重新上传私有的“ 2.5.1”)

编辑于2016年11月16日:

/ \ NSURLConnection发送的标头中还使用了CFBundleVersion属性(以及CFBundleNameUser-Agent在您的代码中。

示例:如果CFBundleNameMyAppCFBundleVersion是2.21,则您的代码使用NSURLConnection直接发送的任何程序化HTTP查询都将嵌入标头:

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

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


2
上载/发布要求之间有很大区别。
pkamb 2014年

@gabriel,我尝试将内部版本号设置为XX-rc2,但是管理器验证器不允许我设置与XYZ不同的东西,其中X,Y和Z是整数:S。拥有-rc2内部版本号会很棒,您是否曾经能够提交过一个版本?
内斯托尔

1
@nestor你是对的,我错了。只允许输入数字。让我编辑我的答案。
加百利

@gabriel,我使用脚本解析X.X-rc2X.X.2,供CI系统生成buildNumber要上传到iTunesConnect的。
AechoLiu

5

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

当您尝试在管理器中验证应用程序时,如果其中两个都没有增加,则会抛出错误。昨晚发生在我身上。


我在问题中提到了这两个键。您在这里的回答是这两个值都必须增加吗?您能更好地支持您的答案吗?
pkamb

是的,两个都需要增加。昨晚,当我试图在增加它们之前提交时,它抱怨了两个密钥。
xoail 2014年

感谢您提供其他信息。您应该编辑答案以增加上载版本时的体验。
pkamb

6
“保持它们相同是一个好习惯”-不一定是正确的。如果您的测试人员正在处理您的应用,则您可能希望在应用更改时增加内部版本号,但保持版本号不变。例如,使用持续集成,您可以让它为您更新内部版本号,然后再部署到测试人员。
安迪

@安迪,你是对的,很有道理。感谢您指出用例。我只是在考虑单个开发人员/测试人员环境。
xoail 2014年

5

无论CFBundleVersionCFBundleShortVersionString MUST发布新版本在App Store时递增。

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

Xcode Organizer Validator错误:必须增加版本号。

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

  • 该捆绑包无效。CFBundleVersionInfo.plist文件中键[1.0] 的值必须包含比以前上传的版本[1.134]高的版本。

  • 该捆绑包无效。CFBundleShortVersionStringInfo.plist文件中键[1.0] 的值必须包含比以前上传的版本[1.134]高的版本。

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

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

2

当前的Apple技术说明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

你需要增加两个

上载新版本时,您将需要在iTunes Connect上创建一个新版本,该版本将自动高于以前的版本。iTunes Connect上的该版本将期望具有相同版本号的二进制文件,因此CFBundleShortVersionString需要递增。

如果您更新版本但忘记增加CFBundleVersion,则会在上传过程中遇到错误。请参阅pkamb的答案和屏幕截图。

有关详细信息CFBundleShortVersionString,并CFBundleVersion请参阅:https://stackoverflow.com/a/31921249/936957


1

经过两种方式的尝试,我可以确认一系列版本和内部版本号...

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

...将被iOS应用接受,但对于Mac(Catalyst)应用则返回此错误:

错误ITMS-90061:“此捆绑包无效。Info.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)应用程序时,Apple只接受三位数或更少位数的内部版本号:

错误ITMS-9000:“此捆绑包无效。Info.plist文件中的键CFBundleVersion [1.0.0.1]的值必须是一个由句点分隔的列表,该列表最多包含三个非负整数。”

因此,我更改为一个数字,该数字对于每个版本都会递增,并在各个版本号之间继续递增。


您有它给您的任何错误消息吗?如果是这样,请引用它们!
pkamb

0

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

我上传了几个版本:2020.0 (1),,2020.0 (2)等等。我终于提交2020.0 (8)了App Store评论。通过审核并处于待处理开发者版本状态

我想在发行前修复一些问题,因此我在同一发行版中增加了一个新版本:2020.0 (9)

导致错误:

App Store Connect操作错误

错误ITMS-90062:“此捆绑包无效CFBundleShortVersionString。Info.plist文件中的密钥[2020.0] 的值必须包含比先前批准的版本[2020.0]更高的版本。有关更多信息CFBundleShortVersionString,请访问https:// developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring

这很烦人,因为我的2020.0版本从未真正发布过。从这个问题的公认答案中,我得到的印象是,在App Store上可用之前,您可以继续发布具有相同版本的新版本。

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


-2

AFAIK,在我的头顶上,您只需要增加内部版本号CFBundleVersion。不一定需要增加短版本字符串,尽管您可能应该增加它,因为它确实告诉用户该应用程序是新的。苹果确实说编号应该遵循传统的软件版本约定,但是,如果您尝试重新上传现有版本,iTunes Connect可能会抱怨。

长话短说,它可能有效,但可能无效。


寻找有关必须增加键的权威性答案。如果CFBundleShortVersionString不需要增加,那么面向用户的“相同”版本可以多次上传到App Store?
pkamb
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.