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
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)
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 数字是否以任何方式相互比较?
不。
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 一起)。
示例:如果 CFBundleName 是 MyApp 并且 CFBundleVersion 是 2.21,那么您的代码使用 NSURLConnection 直接发送的任何编程 HTTP 查询都将嵌入标头:
User-Agent: MyApp/2.21 CFNetwork/... Darwin/...
(这不适用于 UIWebView 自动发出的请求)。
X.X-rc2
解析为 X.X.2
,以便 CI 系统生成 buildNumber
以上传到 iTunesConnect。
CFBundleVersion 和 CFBundleShortVersionString 必须大于应用的最后一个版本号。保持它们相同是一个好习惯。您应该在您的 -info.plist 中找到它们。
当您尝试在管理器中验证应用程序时,如果其中任何一个都没有增加,它将引发错误。昨晚发生在我身上。
将新版本发布到 App Store 时,CFBundleVersion
和 CFBundleShortVersionString
必须都增加。
此外,其中一个字符串必须与 iTunes Connect 中指定的版本匹配。
https://i.stack.imgur.com/V9mxp.png
This question 包括上述 Xcode Organizer 的验证器在 CFBundleVersion
和 CFBundleShortVersionString
未递增时拒绝验证应用程序的屏幕截图。
此捆绑包无效。 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'] 中设置的应用程序版本不匹配。
当前的 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,如果我需要在给定版本中更改内部版本号,则以小数点递增。
我可以确认,刚刚尝试了两种方式,一系列版本和内部版本号,如......
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] 的值必须是最多三个非负整数的句点分隔列表。”
因此,我更改为单个数字,每次构建都会递增,并在版本号之间继续递增。
你需要增加两者。
上传新版本时,您需要在 iTunes Connect 上创建一个新版本,它会自动高于以前的版本。 iTunes Connect 上的这个版本需要一个具有相同版本号的二进制文件,因此 CFBundleShortVersionString
需要递增。
如果您更新版本但忘记增加 CFBundleVersion
,您将在上传过程中遇到错误。请参阅 pkamb 的答案和屏幕截图。
有关 CFBundleShortVersionString
和 CFBundleVersion
的详细信息,请参阅:https://stackoverflow.com/a/31921249/936957
我正准备发布一个新的 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 中取消此发布以允许进一步上传此发布系列。
AFAIK,在我的脑海中,您只需要增加内部版本号 CFBundleVersion
。不一定需要增加短版本字符串,尽管您可能应该增加它,因为它确实告诉用户应用程序是新的。但是,Apple 确实表示编号应该遵循传统的软件版本控制约定,如果您尝试重新上传已经存在的版本,iTunes Connect 可能会抱怨。
长话短说,它可能会起作用,但可能不会。
CFBundleShortVersionString
,那么“相同”的面向用户的版本可以多次上传到 App Store 吗?
Version
和Build number
包两次。 App Connect 自动将第二次提交的Build number
增加 1。因此,我最终将 1.3 (50) 变为 1.3 (50),而第二个 1.3 (50) 变为 1.3 (51)。我没有找到任何文档,在这种特殊情况下,App Connect 会自行增加内部版本号,因此会在输入的 Xcode 版本和 App Connect 版本之间产生不匹配。这是已知/记录在案的行为吗?