ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

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

我的问题是:

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

“版本”CFBundleShortVersionString 或“内部版本”CFBundleVersion 能否在应用更新之间保持不变?

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

安卓/谷歌播放注意:

引发此问题的讨论是,Google Play 商店中 Android 应用程序的公共“版本”不需要需要增加,并且没有经过验证。 android:versionName 可以在发布、升级、降级之间保持不变,或者是任何随机字符串,而不是看似有效的“版本号”。

android:versionName — 一个字符串值,代表应用程序代码的发布版本,应该向用户显示。该值是一个字符串,因此您可以将应用程序版本描述为 .. 字符串,或任何其他类型的绝对或相对版本标识符。

Difference between versionName and versionNumber in Android

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

苹果文档

the newly accepted answer 中所述,Apple 最近发布了一份技术说明,详细说明了其版本和内部版本号方案:

Apple Technical Note TN2420 - Version Numbers and Build Numbers

屏幕截图的详细答案:stackoverflow.com/a/31921249/936957

A
AechoLiu

Apple Technical Note TN2420, Version Numbers and Build Numbers

概括:

对(版本、内部版本号)必须是唯一的。序列有效:(1.0.1, 12) -> (1.0.1, 13) -> (1.0.2, 13) -> (1.0.2, 14) ...

序列有效:(1.0.1, 12) -> (1.0.1, 13) -> (1.0.2, 13) -> (1.0.2, 14) ...

版本 (CFBundleShortVersionString) 必须按升序排列。

内部版本号 (CFBundleVersion) 必须按升序排列。

版本号和内部版本号核对表 以下是您在向 App Store 提交新版本时可以检查的一些事项。确保您正确设置了版本号和内部版本号,这将有助于避免您的应用因配置不当而被自动拒绝。对于您的应用程序的每个新版本,您需要发明一个新的版本号。此数字应大于您使用的最后一个版本号。尽管您可以为您的应用程序的任何特定版本提供多个构建版本,但您只需为应用程序的每个新版本使用一个新版本号。您不能重复使用版本号。对于您提交的每个新版本,您都需要创建一个新版本号,其值大于您使用的最后一个版本号(对于同一版本)。您可以在不同的发布序列中重复使用内部版本号,但不能在同一版本序列中重复使用内部版本号。对于 macOS 应用程序,您不能在任何发布序列中重复使用内部版本号。

根据清单,以下 (Version, Build Number) 序列也是有效的。

案例:在不同的发布序列中重用内部版本号。 (注意:不是 macOS 应用程序) (1.0.0, 1) -> (1.0.0, 2) -> ... -> (1.0.0, 11) -> (1.0.1, 1) -> (1.0 .1, 2)


我很困惑。条件之一是“您不能重复使用版本号”,但在最后一个示例中,版本号保持不变,而内部版本号正在增加。我误解了什么吗?
@Emil,我认为它的 (Version, Build Number) 对不能重复使用。
@EmilParikh 版本号可以在发布前多次上传到 Apple,每个版本号都有一个唯一的内部版本号。但是一旦发布,您就不能重复使用该版本号。
TN2420 说“版本号和内部版本号可能有最多三个组件,由句点分隔”,然后提供以下非法示例1.10000.1.5。然而,看起来很多应用程序,including chrome使用包含 4 个组件的版本号(例如 68.0.3440.83)。我想这可以通过 TN2420 页面提到“重要提示:此文档不再更新。”这一事实来解释,但是我无法找到定义新规则的更新文档.还有人困惑吗?
错误地提交了两个相同的 VersionBuild number 包两次。 App Connect 自动将第二次提交的 Build number 增加 1。因此,我最终将 1.3 (50) 变为 1.3 (50),而第二个 1.3 (50) 变为 1.3 (51)。我没有找到任何文档,在这种特殊情况下,App Connect 会自行增加内部版本号,因此会在输入的 Xcode 版本和 App Connect 版本之间产生不匹配。这是已知/记录在案的行为吗?
C
Community

CFBundleShortVersionString 应与您提供的 iTunes Connect 版本号相匹配。它也是用户在 App Store 中查看您的 App 时出现的版本号。

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

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

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

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

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

两个都。一个显示在 App Store 中,另一个由 iTunes 用于更新应用程序。

CFBundleShortVersionString 或 CFBundleVersion 能否在应用更新之间保持不变?

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

https://i.stack.imgur.com/TTQBm.png

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

是的。使用 semver.org 标准。

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

不。


对,我知道这两个数字是怎么用的。问题是:在发布新版本的应用程序时,它们是否都需要递增?
是的,如果您尝试将应用程序推送到应用程序商店而不更新两者,您将看到一条错误消息,例如 stackoverflow.com/questions/19367893/…
谢谢,很好的编辑。特别是对于那个链接。组织者的验证器显示 CFBundleVersion 和 CFBundleShortVersionString 的“必须包含更高版本”错误。
+1 用于 SemVer 链接...给定版本号 MAJOR.MINOR.PATCH,增加:当您进行不兼容的 API 更改时的 MAJOR 版本,当您以向后兼容的方式添加功能时的 MINOR 版本,以及向后兼容时的 PATCH 版本- 兼容的错误修复。
“CFBundleShortVersionString 应该与您提供给 iTunes Connect 的版本号相匹配。它也是用户在 App Store 中查看您的应用时出现的版本号。”我认为这些说法都不是真的。你可以随心所欲地使用它,只要它是增加的和唯一的,它与 App Store Connect 中的版本号无关。它不会出现在 iOS 或应用商店的任何地方,除非您手动设置。
G
Gabriel

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

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

2016 年 11 月 16 日编辑:

/!\ 在您的代码中由 NSURLConnection 发送的 User-Agent 标头中也使用了 CFBundleVersion 属性(与 CFBundleName 一起)。

示例:如果 CFBundleNameMyApp 并且 CFBundleVersion 是 2.21,那么您的代码使用 NSURLConnection 直接发送的任何编程 HTTP 查询都将嵌入标头:

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

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


上传/发布要求之间的巨大区别。
@gabriel,我尝试将内部版本号设置为 XX-rc2 但管理器验证器不允许我设置与 XYZ 不同的任何东西,其中 X,Y 和 Z 是整数 :S 。拥有一个 -rc2 内部版本号会很棒,你曾经能够提交一个版本吗?
@nestor你是对的,我错了。只允许数字。让我编辑我的答案。
@gabriel,我使用脚本将 X.X-rc2 解析为 X.X.2,以便 CI 系统生成 buildNumber 以上传到 iTunesConnect。
x
xoail

CFBundleVersion 和 CFBundleShortVersionString 必须大于应用的最后一个版本号。保持它们相同是一个好习惯。您应该在您的 -info.plist 中找到它们。

当您尝试在管理器中验证应用程序时,如果其中任何一个都没有增加,它将引发错误。昨晚发生在我身上。


我在我的问题中提到了这两个键。您在这里的答案是必须增加这两个值吗?你能更好地支持你的答案吗?
是的,两者都需要增加。昨晚当我尝试在增加它们之前提交时,它抱怨两个键。
感谢您提供更多信息。您应该编辑您的答案以在上传构建时添加您的体验。
“保持它们相同是一个好习惯” - 这不一定是真的。如果您有测试人员在您的应用程序上工作,您可能希望在应用更改时增加您的内部版本号,但保持您的版本号相同。例如,使用持续集成,您可以让它在部署到测试人员之前为您更新内部版本号。
@Andy你是对的,有道理。感谢您指出用例。我只考虑单个开发人员/测试人员环境。
C
Community

将新版本发布到 App Store 时,CFBundleVersionCFBundleShortVersionString 必须都增加。

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

https://i.stack.imgur.com/V9mxp.png

This question 包括上述 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'] 中设置的应用程序版本不匹配。


p
pkamb

当前的 Apple Technical Note TN2420, Version Numbers and Build Numbers 说(我的粗体字):

对于 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,如果我需要在给定版本中更改内部版本号,则以小数点递增。


a
arlomedia

我可以确认,刚刚尝试了两种方式,一系列版本和内部版本号,如......

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] 的值必须是最多三个非负整数的句点分隔列表。”

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


你有它给你的任何错误信息吗?如果有,请引用他们!
C
Community

你需要增加两者。

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

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

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


p
pkamb

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

我上传了几个版本:2020.0 (1)2020.0 (2) 等。我最终将 2020.0 (8) 提交给 App Store Review。已通过审核并处于等待开发者发布状态。

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

这导致错误:

App Store Connect Operation Error ERROR ITMS-90062: "This bundle is invalid. The value for key CFBundleShortVersionString [2020.0] in the Info.plist file must contain a higher version than that of the previous approved version [2020.0]. Please find more information关于 https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring 上的 CFBundleShortVersionString”

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

错误 ITMS-90062:键 CFBundleShortVersionString 的值必须包含比先前批准的版本更高的版本

应用程序加载程序错误 ITMS-90062:键 CFBundleShortVersionString 的值必须包含更高版本

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


如果它对上下文有帮助,我在 2015 年左右开发了一个应用程序,我认为我们使用了与您相同的构建策略,并且是允许的。当我在 2018 年左右管理另一个应用程序时,我得到了你所犯的错误,所以我认为规则已经改变为你所描述的。
S
SevenBits

AFAIK,在我的脑海中,您只需要增加内部版本号 CFBundleVersion。不一定需要增加短版本字符串,尽管您可能应该增加它,因为它确实告诉用户应用程序是新的。但是,Apple 确实表示编号应该遵循传统的软件版本控制约定,如果您尝试重新上传已经存在的版本,iTunes Connect 可能会抱怨。

长话短说,它可能会起作用,但可能不会。


寻找关于哪些键必须增加的权威答案。如果不需要增加 CFBundleShortVersionString,那么“相同”的面向用户的版本可以多次上传到 App Store 吗?