Swift中iOS/macCatalyst可用性检查在M1 Mac运行iPad应用时失效
问题根因
你遇到的是「Designed for iPad」模式特有的系统可用性校验bug,和你校验写法的语法无关,核心原因有两个:
- 「Mac Catalyst」和「Designed for iPad」是完全独立的两种iPad应用运行在Mac上的模式:
#available中的macCatalyst平台校验仅对通过Mac Catalyst编译打包的应用生效,「Designed for iPad」模式本质是Apple Silicon Mac直接运行原生iOS/iPad应用包,理论上应匹配iOS平台的校验规则。 - macOS 11.x(Big Sur)系统对「Designed for iPad」应用的可用性校验存在逻辑缺陷:即使实际运行环境的
UIDevice.current.systemVersion返回iOS 14.x,#available(iOS 15.0, *)仍会错误返回true,导致高版本限定的代码块被执行。
修复方案
你可以任选以下一种方案解决问题:
方案1:增加运行时版本兜底判断
在原有可用性校验的基础上,增加对UIDevice.current.systemVersion的真实版本判断,避免系统校验bug的影响:
if #available(iOS 15.0, macCatalyst 15.0, *) { // 兜底判断,规避Designed for iPad模式下的系统校验bug guard (UIDevice.current.systemVersion as NSString).floatValue >= 15.0 else { dataSource.apply(fullSnapshot, animatingDifferences: false) return } dataSource.applySnapshotUsingReloadData(fullSnapshot, completion: nil) } else { dataSource.apply(fullSnapshot, animatingDifferences: false) }
方案2:简化可用性校验(仅适用不需要兼容原生Mac Catalyst的场景)
如果你的应用不需要单独适配原生Mac Catalyst模式,直接移除校验中的macCatalyst参数即可,减少平台识别冲突的概率:
if #available(iOS 15.0, *) { dataSource.applySnapshotUsingReloadData(fullSnapshot, completion: nil) } else { dataSource.apply(fullSnapshot, animatingDifferences: false) }
内容的提问来源于stack exchange,提问作者Darren
相关产品推荐
相关产品推荐

