【问题标题】:Swift availability check for macCatalyst / iOS failingmacCatalyst / iOS 的 Swift 可用性检查失败
【发布时间】:2021-10-04 10:01:02
【问题描述】:

我在我的应用程序中添加了一个iOS 15+/macCatalyst 15.0+ 函数,现在它在通过Mac Catalyst (Designed for iPad) 在 M1 iMac 上运行时崩溃。

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

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

我了解Designed for iPad mac 催化剂作为 iOS 运行,我可以使用 print(UIDevice.current.systemVersion) 确认它作为 iOS 14.7 运行,那么为什么它运行的代码设置为仅在 iOS 15+ 上运行?

我的 macCatalyst 检查对吗?

【问题讨论】:

  • 也许可以试试#if targetEnvironment(macCatalyst) 进行 Mac 催化剂检测
  • 检查中的代码不运行!
  • 事实证明,macCatalyst 检查不起作用,因为它作为iOS 应用程序而不是完整的催化剂运行。但是,这并不能解释为什么 iOS 15 检查不起作用。
  • 在 macOS 11.4 上运行时环境检查工作正常。
  • 我在M1 mac 上运行iOS 应用程序,这显然与运行完整的macCatalyst 应用程序不同。该应用程序就像iOS 一样运行,因此targetEnvironment 失败。但我已经发布了我从 Apple 得到的答案。

标签: ios swift mac-catalyst availability


【解决方案1】:

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

使用 Apple 在 Mac 上检查 iPhone 和 iPad 应用程序的可用性 硅总是返回真。这会导致 iOS 应用在 macOS 11 中运行 Big Sur 看到 iOS 15 API 可用,导致崩溃。这 仅影响 Mac App Store 中使用“我的 Mac(专为 iPhone 设计)”或“我的 Mac(专为 iPad 设计)”运行 目的地。它不会影响 Mac Catalyst 应用程序。 (83378814)

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

if #available(iOS 15, *), ProcessInfo.processInfo.operatingSystemVersion.majorVersion >= 15 {

【讨论】:

    【解决方案2】:

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

    if ProcessInfo.processInfo.isiOSAppOnMac {
        // blah blah yada yada etc etc
    }
    

    还有一个isMacCatalystApp 值。

    【讨论】:

      猜你喜欢
      • 2020-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多