"NSApp"在 UIKit for Mac 中不可用:如何在 macOS 上的 iOS 应用程序中嵌入仅限 Mac 的框架?



UIKit for Mac

我正在探索Xcode 11和macOS Catalina使用UIKit创建iPad应用程序的Mac版本的新可能性。通常按预期工作。

在macOS 上的 iOS 应用中自定义NSWindow的最佳方法是什么?


超越复选框

https://developer.apple.com/documentation/uikit/creating_a_mac_version_of_your_ipad_app

您可以使用这些相同的方法来包含仅在 macOS 中可用的框架和代码。对于框架,请选择 macOS 作为平台设置,并使用 #if 目标环境 (UIKitForMac) 语句将代码括起来。

作为起点,我创建了一个基本的macOS框架(例如MacMan.framework)来配置Mac特定的行为。

尽管我尽了最大的努力,但我还是遇到了错误:

  • "NSApp"在 UI for Mac 中不可用
  • "NSWindow" 在 UI for Mac 中不可用
  • 为 UIKit for Mac 构建,但链接框架"MacMan.framework"是为 macOS 构建的。您可能需要配置"MacMan.framework"以构建适用于Mac的UIKit,或限制应在目标编辑器中链接此框架的平台。

情况似乎正好相反(易于排除代码)

#if !targetEnvironment(UIKitForMac)
override var prefersHomeIndicatorAutoHidden: Bool {
return true
}
#endif

引用:

https://www.highcaffeinecontent.com/blog/20190607-Beyond-the-Checkbox-with-Catalyst-and-AppKit

根据Apple的说法,如果您的应用程序依赖于为macOS构建的框架,则需要将其从任何iOS版本中排除,或者需要为iOS和macOS重新构建它,以便您可以对仅在iOS或macOS中可用的代码进行条件化。为此,Apple建议您将其转换为xcframework。因为您依赖的框架指向NSAppNSWindow,这是 iOS 上不可用的符号,因此您会收到提到的错误。

因此,如果您有MacMan.framework的源代码 ,您需要对其进行处理,通过对依赖于特定平台的代码进行条件化,将其转换为xcframework,因为它们指的是在其他平台上不可用的框架。

如果您不拥有源代码,则需要与框架的供应商交谈,为您提供这样的二进制文件。如果无法做到这一点,那么您将不得不排除MacMan.framework,这是专门为macOS平台构建的。

所有这些都在WWDC 2019视频中进行了解释,该视频名为"介绍适用于Mac的iPad应用程序"。

此外,我还建议您在同一页面上查看相关视频以了解该怎么做。最后,要了解如何构建 xcframework,请观看视频"Binary Frameworks in Swift"。不要被后一个视频的标题所迷惑:如果需要,你也可以在Objective-C中构建xcframeworks。

如果您需要自定义窗口背景,则无法通过NSWindow执行此操作;正如我上面解释的,此API不可用,但是您需要使用其iOS对应项:UIWindow。在这种情况下,您可以像这样更改窗口背景:

self.view.window.backgroundColor = .red

自己是你的UIViewController。

另一种可能的自定义是添加工具栏,因为 NSToolbar 现在通过以下方式导出:

let toolbar = UIWindowScene.titlebar.toolbar

此处解释了在适用于 Mac 的 UIKit 应用程序中添加和自定义 NSToolbar 的更全面的解释和注意事项。

最新更新