1e844e68219de99fd7938ca820928d3a
WWDC20 10143 - Mac Catalyst 的新功能

Mac Catalyst 是苹果在 2019 年的 WWDC 大会上宣布的一种新的技术,这种技术的目的是让我们能够非常简单的将已有的 iPad App 快速转为一个 macOS App。

这种技术的简单原理就是,在 macOS 上等价提供 UIKit 等 SDK 的 API 或者实现,让原本使用 UIKit 以及其他 iOS SDK 开发的 iPad App,在 macOS 上也能正常使用。.

这种技术推出后,有很多 App 就使用了这些技术来实现,例如大名鼎鼎的 GoodNotesPDF Viewer 等,少数派也有对这些 App 的一个实际 测评,总体来看,这项技术是有很不错的实际价值的。那么今年 WWDC,苹果在这项技术上做了哪些更新呢?

Catalyst 有哪些更新?

简单来说,今年的 Catalyst 的更新算是一次比较常规的能力提升,主要体现在这几个方面:

  • 更好的系统 SDK 兼容性
  • 更多的 API 支持
  • Optimized for Mac 方案
  • 与 SwiftUI 的结合更为紧密
  • Catalyst Extension 生命周期优化
  • 开箱即用的 Universal Purchase
  • 无缝对接的 macOS Big Sur 的样式变更

更好的系统 SDK 兼容性

TLDR: 支持了更多 iOS SDK,同时提供了运行时代码隔离方案

在今年的 Catalyst 中,我们可以使用更多的 iOS SDK,他们包括:

尽管苹果的工程师做了很多的努力,但是在 macOS 依旧有很多 SDK 是无法使用的:

不过针对这些 SDK,在新的 Catalyst 中,开发者可以不再使用 targetEnvironment 来区分使用这些使用这些 SDK 的代码了,而是可以通过运行时判断的方式来让代码更具有可移植性。

例如 ARKit,在之前的 Catalyst 中,由于 macOS 并没有 ARKit,开发者们只能通过这种方式来区分代码:

现在,借助在 Catalyst 14.0 中新增的 supported 属性,开发者可以不再使用 targetEnvironment 来区分代码了:

更多类似的判断性接口都会在苹果的 API 文档中体现,利用这些接口,我们就能写出更好的具有 API

更多的 API 支持

TLDR: 新的 Catalyst 中引入了一些新的 AppKit 的 API,同时原有的一些 UIKit 的 API 在 macOS 会有更好的表现

在 API 支持这一部分,苹果工程师提到两部分的 API 更新,一部分是在 Catalina 中就可以使用的,另一部分则是在 Big Sur 中才可以使用的。

我们先来看看在 Catalina 中就可以使用的这部分 API,主要包括:

  • pressBeganpressEnded 这两个方法的 UIPress 参数在 Catalyst 13.4 支持了 key 这个属性,让我们可以在响应者链中处理来自键盘的 press 事件,更多详细的内容可以参见 Session 10094 Support hardware keyboards in your app
  • 在 tvOS 被广泛使用的 Focus Engine(可以简单理解为在 tvOS 上决定哪个控件是当前用户选中的控件的事件体系) 现在在 Catalyst 中也可以被使用,使用 Focus Engine 可以更好的辅助用户用键盘操作基于 Catalyst 的 App
  • 来自 AppKit 的NSCursor,使用 NSCursor ,开发者就可以控制 macOS 上光标的行为,例如利用 hide 或者 unhide 在播放视频是隐藏或者显示光标,或者是利用 image 属性来修改光标的样式

接下来是在 Big Sur 中才可以使用的这部分 API,主要包括:

UITablView.selectionFollowsFocusUICollectionView.selectionFollowsFocus 让用户在TableView 和 CollectionView 的 Cell 之间使用键盘的上下键来切换当前选中的 Cell:

!https://forelax.space/assets/images/2020-07-11-wwdc-2020-what-is-new-in-catalyst/2020-07-12 13-49-36.2020-07-12 13_50_18.gif" target="_blank">

使用 UISceneActivationRequestOptions.collectionJoinBehavior 可以改变用户尝试创建新的 Tab 时的默认行为,目前提供了四种行为:

使用在 iOS 14 上新增的 UIColorWell 和 UIColorPickerViewController,可以分别在 iOS 和 macOS 上展示对应平台的默认样式:

得益于 iPadOS 14 与 macOS Big Sur 在整体样式上的统一,原本可能样式完全不同的 UIKit 组件在 macOS 下也有了更好的表现,例如现在在 iOS 14、iPadOS 14 上日期选择器有了如下的变化:

原本我们所习惯的 ActionSheet 也变成了 Pull Down Menu 的形式:

而在 API 上,iOS 14 也为所有的 UIButton 添加了非常方便的展示 Pull Down Menu 的 API—— init(frame: CGRect, primaryAction: UIAction?),使用了这个 API 的 UIButton 在 macOS Big Sur 上也能得到良好的表现:

如果想知道更多的类似这样的 UIControl 的变化,可以查看 Session 10205 Design with iOS pickers, menus and actions

另外,在 Big Sur 中,开发者所弹出的 ModalViewController 以及 PopoverPresentationController 都将会以独立的 Window 形式存在。这意味着,我们通过 prensentViewController:animated 所弹出的 ModalViewController 在 macOS 是可以单独被拉伸缩放窗口大小的:

top Created with Sketch.