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

13

Mac上的UIKit

我正在探索使用Xcode 11和macOS Catalina创建iPad应用程序的Mac版本时,利用UIKit打造全新可能性。基本上按预期工作。

在macOS上,最好的方法是如何自定义NSWindow


超越复选框

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

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

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

尽管我尝试了最好的办法,但还是遇到了错误:

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

相反似乎更容易(排除代码)

#if !targetEnvironment(UIKitForMac)

override var prefersHomeIndicatorAutoHidden: Bool {
    return true
}

#endif

参考文献:

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


你在考虑什么样的定制?如果你想要自定义一个窗口,你必须通过UIWindow来实现。 - jvarela
自定义背景、演示等。 它绝对是像任何AppKit应用程序一样的“NSWindow”。 - Zelko
请查看我下面编辑过的答案。我希望能清楚地表明,NSWindow在适用于Mac的iOS应用程序中确实不可用。如果您想要访问NSWindow和AppKit等内容,您需要专门构建一个Mac应用程序,除非API像NSToolbar一样暴露给iOS应用程序。 - jvarela
1个回答

5
根据苹果公司的说法,如果您的应用程序依赖于为macOS构建的框架,则需要将其从任何iOS构建中排除,或者您需要重新构建它以适用于iOS和macOS,以便可以有条件地使用仅在iOS或macOS中可用的代码。为此,苹果公司建议将其转换为xcframework。因为您所依赖的框架指向NSAppNSWindow,这些符号在iOS上不可用,因此您会遇到所提到的错误。
因此,如果您拥有MacMan.framework的源代码,则需要对其进行处理,将其转换为xcframework,通过有条件地使用特定平台的依赖项来实现,因为它们引用了在其他平台上不可用的框架。
如果您没有拥有源代码,则需要与框架的供应商交谈,以提供这样的二进制文件。如果这不可能,那么您将不得不排除专门针对macOS平台构建的MacMan.framework

所有这些都在名为“介绍面向Mac的iPad应用程序”的WWDC 2019视频中解释。

此外,我还建议您检查同一页面上的相关视频以了解该怎么做。最后,要学习如何构建xcframework,请观看视频“Swift中的二进制框架”。不要被后一个视频的标题所迷惑:如果需要,您也可以使用Objective-C构建xcframeworks。

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

self.view.window.backgroundColor = .red

我将成为您的UIViewController的有益助手。

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

let toolbar = UIWindowScene.titlebar.toolbar

在UIKit应用程序中添加和自定义NSToolbar的详细解释和注意事项可以在这里找到。


谢谢,看起来一切都归结于新的 XCFramework。 - Zelko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接