DEV Community

Ting
Ting

Posted on

MacOS 和 iOS app 的版本号冲突

最近新发布了一个由原先iOS代码库改动而来的Mac Catalyst macOS app。自从登上Mac App Store以来,daily build就上传不了了,提示如下的错误:

This bundle is invalid. The value for key CFBundleVersion [4001] in the Info.plist file must contain a higher version than that of the previously uploaded version [20240719]. Please find more information about CFBundleVersion at https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleversion With error code STATE_ERROR.VALIDATION_ERROR.90061 for id [redacted] Asset validation failed (-19208)

刨根问底一路搜查下来,发现问题的根源在于 iOS 和 macOS app 共享了CFBundleVersion这个键值。在 iOS app 中,这个键值对应着Xcode项目文件主页面里的build输入框中的值;而因为历史原因,在 macOS app 中,这个键值代表了该程序当前的版本号,也就是常见的major.minor.patch三部分版本。

这就造成了一个未曾预料的问题:我们的app最初是iOS app,当苹果推出了Mac Catalyst以后才想着顺便支持macOS,发布在MAS上的。因此,从来都是把build number填写为当天的daily build的序数。对于iOS来讲,当version number相同时,TestFlight比较build number;当version number改变后,build number可以重置,因此build number无需严格递增。但这个数在macOS上则被视作一个单独的major版本号,因此相当于我们每天的daily build都是一个新的大版本。如果不关心版本号语义的话,倒也没啥大问题;问题出在我们手动发布新版本时,手动填写了build的数值,导致接下来所有的macOS build的版本号都必须大于这个数值。好嘛,一下子从一个四位数的版本变成了八位数的版本,遥遥领先!

解决方法就是在第一次发布macOS版本前,一定一定和团队内确定好,如何设计一个build number格式,使其既适合当作iOS的build number,又适合当作macOS的version number。至于如何设计,我母鸡呀?🤷

归根到底,这是苹果的锅——没有处理好iOS和macOS版本号规则的差异,导致跨平台程序屡屡受挫。

相关阅读

Important: For macOS apps, build numbers must monotonically increase even across different versions. In other words, for macOS apps you cannot use the same build numbers again in different release trains. iOS apps have no such restriction and you can re-use the same build numbers again in different release trains.

Top comments (0)