快速可用性检查 macCatalyst / iOS 失败

Dar*_*ren 6 ios swift availability mac-catalyst

我已经iOS 15+/macCatalyst 15.0+向我的应用程序添加了一个功能,现在在 M1 iMac 上通过Mac Catalyst (Designed for iPad).

我对我的函数进行了可用性检查,但是当在我的 Mac (macOS 11.6) 上运行时,可用性检查中的代码仍然运行并崩溃。

if #available(iOS 15.0, macCatalyst 15.0, *) {
    dataSource.applySnapshotUsingReloadData(fullSnapshot, completion: nil)
} else {
    dataSource.apply(fullSnapshot, animatingDifferences: false)
}
Run Code Online (Sandbox Code Playgroud)

我了解Designed for iPadmac Catalyst 在 iOS 上运行,并且我可以确认它正在使用运行,iOS 14.7那么print(UIDevice.current.systemVersion)为什么它运行设置为iOS 15+仅运行的代码?

我的 macCatalyst 检查正确吗?

Dar*_*ren 7

事实证明这是一个已知问题,并且在 Xcode 13 发行说明中实际提到过。

\n
\n

使用 Apple\nsilicon 在 Mac 上的 iPhone 和 iPad 应用程序中进行可用性检查始终返回 true。这会导致在 macOS 11\nBig Sur 中运行的 iOS 应用看到 iOS 15 API 可用,从而导致崩溃。这\仅影响 Mac App Store 中使用 \xe2\x80\x9cMy\nMac(专为 iPhone 设计)\xe2\x80\x9d 或 \xe2\x80\x9cMy Mac(专为 iPad 设计)\xe2\x80 构建的应用程序\x9d 运行\n目的地。它不会影响 Mac Catalyst 应用程序。(83378814)

\n
\n
\n

解决方法:使用以下代码检查 iOS 15 可用性:

\n
\n
if #available(iOS 15, *), ProcessInfo.processInfo.operatingSystemVersion.majorVersion >= 15 {\n
Run Code Online (Sandbox Code Playgroud)\n


cbi*_*gin 5

我需要检查这一点,但如果在 Mac 上作为 iOS 应用程序运行,我需要添加功能,这似乎可以解决问题:

if ProcessInfo.processInfo.isiOSAppOnMac {
    // blah blah yada yada etc etc
}
Run Code Online (Sandbox Code Playgroud)

还有一个isMacCatalystApp价值。