文章目录
我写了一个名为 MermaidEditor 的 iOS App,这是一个用于编写 mermaid js 图表的编辑器,它使用 WKWebVIew 加载一个monaco 编辑器来编辑 mermaid js 图图的源代码,从而支持语法高亮和关键词自动完成。
在发布了 iOS 版本的 MermaidEditor 之后,我想把这个应用适配到 macOS 上,我认为在这里使用 Mac Catalyst 是一个很好的场景,这是苹果在 WWDC19 开始提供的一项技术,可以让我们的 iPad 应用在 macOS上 运行,只需要在 Xcode 中选中一个复选框就行了。
所以我用 Mac Catalyst 为 macOS 重新编译了 MermaidEditor,并向用户发布。但在一些版本之后,我决定用原生代码重写它。
为什么呢?
最低 macOS 版本要求
Mac Catalyst 要求的最低 macOS 部署目标版本是 macOS 10.15,所以如果我们的应用程序的目标版本早于 macOS 10.15,Mac Catalyst 就无法编译。
另外,Mac Catalyst 还有一个限制,如果我们想让应用程序使用体验更像一个原生桌面应用程序,我们需要在 Mac Catalyst 部署选项中选择 "为Mac优化界面"。
哈,最小的 macOS 部署目标版本升级到了 macOS 11 Big Sur!
因此,如果你想保持你的应用程序兼容更多的 macOS 版本,你不应该使用 Mac Catalyst。
缺失 Document-based 应用架构
MermaidEditor 是一个文档编辑应用,所以我使用 UIDocumentBrowser 作为基础应用架构,它在 iOS 上提供了很多文件管理功能。
当我把 MermaidEditor 适配到 macOS 时,面临的第一个问题是 UIDocumentBrowser 并没有像我预期的那样工作。它在启动时会先显示一个空白窗口,然后打开一个文件选择器,让用户选择要打开的文件,这与原生 NSDocument 类提供的能力使用起来有很大不同。
但这并不是最大的问题。
最大的问题是,基于Cocoa Document-based 的应用程序架构为应用程序提供了很多与文档打开、编辑等相关的功能,例如:
- NSDocument 提供了用于文档的打开、保存、版本管理等功能
- NSWindowController 具有重命名、复制、编辑状态指示器等功能
- NSWindowController 支持标签式窗口,可以将多个文档窗口以标签形式管理
因此,如果你的应用程序是面向文档编辑的,你可能不应该使用Mac Catalyst。
不一致的 SplitView
我在 MermaidEditor 中使用了 SplitView 来支持两个面板的编辑,这两个面板用来同步显示的 mermaid js 源代码编辑和图表预览图片。
在 iOS 上,我使用了 UISplitViewController,它在 iPad 上足够好用,但在 macOS 上,它有一些限制,不适合于原生的桌面应用程序。
在使用 NSSplitViewController 时,SplitView 的分割栏可以被调整到 SplitView 中的任何位置,但 UISplitViewController 会将主栏的大小限制在一定范围内,它不允许两个面板被调整到任何大小。
所以,如果你的应用程序需要使用 SplitView 来显示两个面板,你可能不太适合使用 Mac Catalyst。
WKWebView 中奇怪的表现
在 MermaidEditor 中,它使用了一个来自微软的 monaco 编辑器,以提供主要的编辑器功能,如语法高亮、关键词自动完成。
Monaco 编辑器是一个基于 Web 的编辑器,所以它需要 WebView 才能在 iOS Ap 中工作。
因为 Monaco 编辑器使用自定义代码渲染架构,编辑器的文本区不是 HTML 中典型的 textarea 标签。所以 monaco 编辑器在 iOS上 提供了一个按钮来手动获取键盘焦点。
但在 macOS 上,monaco 编辑器中没有这样的按钮,因为 monaco 编辑器把 WebView 的环境识别为桌面电脑。这将导致在 Mac Catalyst 中可能无法捕捉键盘事件,虽然它里面有一个正在闪烁的光标,但你不能在编辑器中做任何事情。
这意味着,如果你需要在你的应用程序中嵌入一个 monaco 编辑器,你可以不适合使用 Mac Catalyst。
难以控制鼠标事件
MermaidEditor 有一个图表渲染图片预览面板,可以即时检查渲染的图表,用户可以通过缩放或平移的手势来检查图表图像的内容,但在 macOS 上,用户通常使用鼠标来控制和操作。
Mac Catalyst 中的 UIScrollView 在 macOS 上会支持一些默认操作,比如用滚轮滚动内容,点击和拖动来移动内容,但如果我们想要一些不同的行为,比如用滚轮缩放图表图像?
这在 Mac Catalyst 中是不可能的,因为 iOS 上没有鼠标事件。
所以,如果你的应用程序需要使用鼠标事件,如滚轮事件或鼠标移动事件,你可能不太适合使用 Mac Catalyst。
结论
Mac Catalyst 有很多限制,如果你想构建一个具有更多原生应用体验的应用程序,你可能不太适合使用 Mac Catalyst。
然而,Mac Catalyst 是将 iOS 应用适配到 macOS 的一个捷径,如果你已经有一个 iOS App,想要提供给更多用户,并且不会碰到上述问题,你应该尝试一下 Mac Catalyst。
虽然 Mac Catalyst 目前还不能提供完整的桌面应用体验,但是还是有许多代码可以在 iOS 和 macOS 之间共享,我们只需要为应用框架和 UI 控件编写不同的代码就行了。
通过 Mac Catalyst,我们可以看到,苹果已经做了很多工作来抹平 iOS 和 macOS 之间的差异。也许在未来的某一天,iOS 会有一个更好的桌面使用体验,然后UIKit 也会提供更多的桌面功能。
希望此文对你有所帮助。
0 条评论。