WWDC Quick Look 💓 By SwiftGGTeam
Qualities of great iPad and iPhone apps on Macs with M1

Qualities of great iPad and iPhone apps on Macs with M1

观看原视频

Highlight

超过一百万款 iPad 和 iPhone app 已经可以在 M1 Mac 上运行,系统会自动桥接 iOS API 到 Mac 特性,开发者只需遵循少量最佳实践即可获得优质体验。

核心内容

M1 Mac 可以直接运行未修改的 iPad 和 iPhone app。这是扩展 app 覆盖范围的最简单方式。

系统做了大量兼容性工作。键盘输入、菜单栏、拖放、打印、设置面板等功能都会自动桥接到 Mac。Share Extension、WidgetKit、照片编辑扩展、VPN 网络扩展、Audio Unit 等也都能正常工作。

但”能运行”和”体验好”是两回事。Session 从 API 桥接、编码实践、系统改进、商店发布四个维度,讲解了如何让 iOS app 在 Mac 上真正出彩。

详细内容

键盘与菜单栏

Mac 的物理键盘可以直接用于文本输入和 UIKeyCommand 快捷键。如果需要更精细的按键处理,使用 UIPress API。

菜单栏结构在启动时确定,之后通过启用/禁用状态变化,而不是增删菜单项。系统会自动根据 app 功能生成菜单项,比如新建窗口、富文本操作、设备方向切换等。

使用 iOS 13 引入的 UIMenuBuilder API 可以为 UIKeyCommand 添加语义结构。这些自定义结构会反映在 Mac 的主菜单中。

// UIKeyCommands 通过 responder chain 寻找目标
// 这决定了菜单项是否可用

关键点:

  • 直接附加到 UIResponder 的 keyCommands 不会出现在菜单栏,但快捷键优先级高于菜单项(04:00)
  • UIMenuBuilder 的自定义结构在 Mac 主菜单中可见(04:37)
  • 菜单项的启用状态由 responder chain 中是否存在可执行目标决定(04:52)

拖放与打印

UIDragInteractionUIDropInteraction 自动桥接到 Mac。用户可以在 app 之间无缝拖放内容。

UIPrintInteractionController 自动映射到 Mac 打印对话框。添加 UIApplicationSupportsPrintCommand Info.plist 键并实现对应动作后,打印和导出 PDF 菜单项会自动出现在菜单栏中。

多场景与窗口尺寸

支持多场景的 app,每个场景在 Mac 上变成一个独立窗口。系统会自动添加”新建窗口”菜单项。

iPad 多任务支持自动转换为 Mac 上的可调整窗口。由于 app 已经支持 iPad 上的动态布局变化,Mac 上的实时调整窗口大小也能正常工作。

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    guard let windowScene = scene as? UIWindowScene, let sizeRestrictions = windowScene.sizeRestrictions else { return }
    sizeRestrictions.minimumSize = CGSize(width: 640, height: 480)
    sizeRestrictions.maximumSize = CGSize(width: 1920, height: 1080)
}

关键点:

  • 使用 UIWindowScene.sizeRestrictions 限制窗口尺寸范围(07:16)
  • 窗口调整时只有 scene size 会变化,UIScreen 尺寸保持设备尺寸不变
  • 不要用 UIScreen 尺寸做布局计算
  • 不支持多任务的 app 使用固定场景尺寸和宽高比,内容会自动缩放

编码最佳实践

一些编码习惯会影响跨平台兼容性。

只使用官方支持的 API。未文档化的方法可能在 Mac 上不存在。

不要硬编码文件系统路径。Mac 上的路径与 iOS 不同。使用 FileManager 的 API 在运行时确定路径。

不要对 UI 的屏幕位置做假设。Mac 上的视图层级和弹窗位置可能与 iOS 差异很大。

相机分辨率和方向在 Mac 上可能不同。iPhone 竖屏拍照时,Mac 上可能返回横屏图像,因为摄像头是横向放置的。使用 AVCaptureDeviceDiscoverySession 查询可用摄像头的真实属性。

部分硬件特性在 Mac 上不可用。ARKit 不支持 Mac。如果 ARKit 是可选功能,检查 ARConfiguration.isSupported。如果依赖 CoreMotion 或多点触控,考虑为 Mac 键盘和触控板提供替代方案。

Touch Alternatives

macOS 11.3 引入了 Touch Alternatives,将键盘和触控板映射到多种触摸交互方式:点击、滑动、滚动、倾斜、触控板捕获。

App 可以自动启用 Touch Alternatives,首次启动时显示引导对话框。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>defaultEnablement</key>
    <true/>
    <key>version</key>
    <real>1</real>
    <key>requiredOnboarding</key>
    <array>
        <string>Tap</string>
        <string>Arrow Swipe</string>
        <string>Scroll Drag</string>
        <string>Tilt</string>
        <string>Trackpad Capture</string>
    </array>
</dict>
</plist>

关键点:

  • 文件命名为 com.apple.uikit.inputalternatives.plist(15:03)
  • requiredOnboarding 只包含对 app 有用的功能,避免显示无关引导
  • 演示中的赛车游戏使用 WASD 模拟设备倾斜,触控板点击油门按钮

macOS Monterey 新特性

Apple Pay 现在支持 M1 Mac 上的 iPad 和 iPhone app。使用与 Mac Catalyst 相同的跨平台 API。

optional func paymentAuthorizationController(
    _ controller: PKPaymentAuthorizationController,
    didRequestMerchantSessionUpdate
    handler: @escaping (PKPaymentRequestMerchantSessionUpdate) -> Void)

关键点:

  • 必须实现 didRequestMerchantSessionUpdate 委托方法(17:17)
  • 一套代码覆盖所有支持 Apple Pay 的平台

AVKit 全屏视频现在使用独立窗口播放。即使 app 窗口有固定尺寸限制,视频全屏时也能充分利用 Mac 显示屏。支持 HDR 播放和流媒体。

SiriKit Shortcuts 在 macOS Monterey 上支持 M1 Mac 的 iPad 和 iPhone app。

Mac App Store 发布

大多数 app 会自动出现在 Mac App Store 上。如果之前选择退出,可以在 App Store Connect 中重新勾选”Make this app available”。

验证兼容性后,“Not verified for macOS” 标签会变为”Designed for iPad”,给用户更好的信任信号。

可以设置自定义最低 macOS 版本。例如,视频 app 可能需要 Monterey 的 AVKit 全屏改进。两种方式:在 App Store Connect 的 Pricing and Availability 页面设置(无需重新提交),或在 Info.plist 中设置 LSMinimumSystemVersion(随下次更新提交)。

测试方式与 iPad 相同。在 Xcode 中选择”My Mac (Designed for iPad)“作为运行目标。macOS Monterey 支持 TestFlight,可以向使用 M1 Mac 的测试者分发 beta 版本。

核心启发

  1. 零成本扩展用户群:已有 iPad app 的开发者,只需验证兼容性并勾选发布选项,即可触达 Mac 用户。

  2. 键盘优先设计:为 iPad 添加物理键盘支持(UIKeyCommand、UIMenuBuilder)的同时,也改善了 Mac 上的体验。

  3. 游戏移植捷径:使用 Touch Alternatives 和虚拟游戏控制器(键盘/触控板映射),iOS 游戏可以在 M1 Mac 上获得可玩的体验,无需重写输入逻辑。

  4. 统一支付体验:一套 Apple Pay 代码覆盖 iOS、iPadOS、macOS,简化跨平台商业逻辑。

  5. 视频 app 的 Mac 体验:AVKit 全屏改进让 iOS 视频播放器在 Mac 上也能提供专业级的观看体验。

关联 Session

评论

GitHub Issues · utterances