Highlight
macOS Big Sur 在 Apple Silicon Mac 上复用 Mac Catalyst 基础设施,让已经上架 iOS App Store 的 iPad 和 iPhone app 以同一个二进制在 Mac App Store 提供,并由开发者在 App Store Connect 控制是否上架。
核心内容
过去,想把 iPad app 带到 Mac,开发者通常要选择 Mac Catalyst。这个选择有价值,因为它让 UIKit 成为 Mac 上的一等 UI 框架,也给开发者留下了大量 Mac 专属优化空间。但它仍然意味着要用 macOS SDK 构建,要在 Xcode 里打开对应能力,要专门考虑 Mac 版本的行为和分发。
Apple Silicon Mac 改变了入口。macOS Big Sur 可以直接运行现有 iPad 和 iPhone app。演讲强调这里的 as-is 是字面意思:用户从 Mac App Store 购买或下载的,是开发者已经放在 iOS App Store 上的同一个二进制。开发者不需要先重新编译,用户也不需要等待一个单独的 Mac 版本。
这个能力的代价是边界变清楚了。App 可以自动获得很多 Mac 行为,但它还在 iOS app 的运行模型里,不能访问完整 Mac app 能力。演讲把适配风险分成三类:硬件差异、UI 差异、系统软件差异。触摸、传感器、摄像头、可调整窗口、文件路径、设备属性,都可能暴露旧代码里关于 iPhone 或 iPad 的假设。
这场 session 的真正交付物是一张迁移检查表:先判断 app 能否原样在 Mac 上运行,再用 Xcode 真实跑起来测试,最后决定分发策略。App 适合直接上架,就让它进入 Mac App Store;需要完整 Mac 体验,就改做 Mac Catalyst;已经有 Mac app 或产品体验不适合桌面,就在 App Store Connect 里退出 Mac 分发。
详细内容
同一个二进制如何来到 Mac
(00:19)macOS Big Sur 在 Apple Silicon Mac 上运行 iOS app,底层复用的是 Mac Catalyst 基础设施。演讲提到同一套 unified frameworks 和被带到 Mac 并集成的 iOS frameworks,因此 iPad 和 iPhone app 能自动获得大量 Mac 行为。
原样运行路径
1. 开发者把 iPad 或 iPhone app 提交到 iOS App Store。
2. 兼容的 app 会自动进入 Mac App Store。
3. Apple Silicon Mac 下载同一个 app binary。
4. app 基于 Mac Catalyst 基础设施和 iOS frameworks 在 macOS Big Sur 上运行。
5. 如果需要更完整的 Mac 能力,开发者再创建 Mac Catalyst 版本。
关键点:
- 演讲明确说 Mac 用户下载的是 exact same binary。
- 原样运行只覆盖 Apple Silicon Mac;Mac Catalyst 版本可以分发到所有 Mac。
- Mac Catalyst 仍然是进一步优化行为、扩展 Mac 能力的路径。
- 兼容性不是发布后的附加项,系统、硬件和 UI 假设都要提前测试。
兼容性检查从硬件假设开始
(03:18)Apple 把运行环境差异拆成硬件、UI 和系统软件三组。第一组最容易被忽略:iOS 围绕直接多点触控设计,macOS 围绕间接的 cursor-based interaction model 设计。系统会映射很多多点触控手势,但自定义触摸处理仍然需要在 Mac 上验证。
// 这场 session 点名的硬件与框架检查项
// - custom touch handling: 在 Mac 上验证鼠标和触控板行为
// - keyboard entry: 作为自定义触摸操作的替代路径
// - sensors: 动态确认 accelerometer、gyroscope、magnetometer、depth camera、GPS 是否存在
// - Core Location: Mac 可以提供位置,但精度可能低于 GPS
// - AVCaptureDeviceDiscoverySession: 用发现会话选择合适摄像头
关键点:
- 不要假设每台运行 iOS app 的设备都有 iPhone 或 iPad 的传感器组合。
- 自定义触摸逻辑最好有键盘输入作为替代路径。
- Mac 没有 GPS 接收器,但 Core Location 仍可能返回位置信息,只是精度不同。
- Mac 可能有内建摄像头、外接显示器摄像头或 USB 摄像头,演讲建议使用
AVCaptureDeviceDiscoverySession。
UI 和系统软件差异会放大硬编码假设
(05:28)iOS app 会自动获得很多 macOS 系统行为,但表现位置和交互形式会变。alerts、pop-ups、Open panel、Save panel 在 Mac 上可能出现在不同窗口或位置。如果代码硬编码了系统 UI 的位置,运行到 Mac 上就容易出错。
Mac 运行检查清单
- iPad app 支持 multitasking: 在 macOS 上窗口可以完全 resize。
- iPhone app 或不支持 multitasking 的 iPad app: 在固定尺寸窗口运行。
- Auto Layout: 用来覆盖更多窗口尺寸。
- Foundation file-system APIs: 用系统 API 查找文件和容器路径。
- device properties: 不要只接受 iPhone、iPod touch、iPad 这些固定值。
关键点:
- 支持 iPad multitasking 的 app,在 macOS 上会面对比 iPad 更多的窗口尺寸。
- live resize 会持续触发布局更新,布局性能会直接影响 Mac 窗口拖拽体验。
- macOS 用户可以移动 app,数据容器位置也不同,文件路径要交给 Foundation API。
- 服务端和客户端都要能处理未知设备值,不能只把运行设备枚举成 iPhone 或 iPad。
用 Xcode 在 Apple Silicon Mac 上真实测试
(08:02)演讲的测试路径是在 Xcode 里选择新的 run destination:My Mac, Designed for iPad。构建仍然基于 iOS SDK,app 原生运行在 Apple Silicon Mac 上,可以像调试 iPhone 或 iPad app 一样调试。
Xcode 测试路径
1. 在 run destination 里选择 My Mac, Designed for iPad。
2. build and run,确认 app 仍然使用 iOS SDK。
3. 用 debug gauges 观察 CPU、memory、network、disk I/O。
4. 设置 breakpoint,检查变量并 evaluate expressions。
5. 使用 Memory debugger、View debugger 和 Instruments。
6. 运行 XCTest unit tests,确认测试也原生跑在 Apple Silicon Mac 上。
关键点:
- 这个流程用于发现运行时行为和 UI glitch,不只是检查能否启动。
- breakpoints、变量检查和表达式求值都可以直接用于这类 iOS app。
- Memory debugger、View debugger、Instruments 对定位 Mac 上的 UI 和性能问题很关键。
- 演讲明确说 XCTest unit tests 可以在 Apple Silicon Mac 上原生运行。
分发流程沿用 iOS,但 TestFlight 和可用性控制要单独处理
(12:00)分发是这场 session 的另一半。Apple 把 Mac 加进 app 支持的设备家族后,开发者熟悉的 iOS 分发流程会延伸到 Mac。签署新的 Developer Agreement 后,兼容 app 会在当年晚些时候进入 Mac App Store。
分发相关能力
- App Store Connect: 用于导出、提交和控制 Mac App Store 可用性。
- Xcode Organizer: 可以导出到 App Store Connect,也可以做 ad hoc、enterprise、development 分发。
- StoreKit: iPad 和 iPhone app 在 Mac 上仍支持内购和订阅。
- On-demand resources: 在 Mac 上体验保持一致。
- App thinning: 新增 Mac virtual thinning destination。
- OTA installation: Mac 会从 manifest 中选择合适 variant。
- Managed devices: iPad 和 iPhone app 可以推送到 enrolled Macs。
关键点:
- TestFlight 当时不支持 Mac,预发布测试要用 ad hoc 或 development distribution。
- Xcode 会提示硬依赖的不可用 symbol 或 framework,但用户体验仍要在 Apple Silicon Mac 硬件上测。
- App Store Connect 的 Pricing and Availability 页面提供 Mac App Store 开关。
- 关闭 Mac 可用性后,Mac 用户不能重新下载已有版本,直到开发者再次开启。
核心启发
-
做一张 Mac 原样运行验收表:把
My Mac, Designed for iPad加进每个版本的手工测试流程。为什么值得做:这场 session 的风险集中在运行环境假设,启动成功不代表体验正确。怎么开始:先覆盖窗口 resize、自定义触摸、键盘输入、调试 gauges 和 XCTest。 -
给自定义触摸操作补桌面入口:为拖拽、绘制、复杂手势提供键盘或指针替代路径。为什么值得做:macOS 是间接 cursor-based interaction model,系统只能自动映射一部分多点触控行为。怎么开始:列出所有 custom touch handling,逐个在 Mac 上验证鼠标、触控板和键盘路径。
-
审计传感器和摄像头依赖:把 accelerometer、gyroscope、magnetometer、depth camera、GPS、camera 的使用点都改成运行时检查。为什么值得做:Mac 的硬件组合和 iPhone、iPad 不同,缺失能力会让功能失效。怎么开始:为位置能力准备低精度结果,为相机选择改用
AVCaptureDeviceDiscoverySession。 -
为 Mac 预发布分发准备替代 TestFlight 的路径:把 ad hoc、development 或 enterprise 分发写进团队测试计划。为什么值得做:演讲明确指出 TestFlight 当时不支持 Mac。怎么开始:用 Xcode Organizer 导出 Mac 测试版本,并让团队成员在 Apple Silicon Mac 上运行验收。
-
把是否进入 Mac App Store 做成产品决策:不是所有 iOS app 都适合直接出现在桌面商店。为什么值得做:已经有 Mac app、正在规划 Mac app、或体验不适合桌面的产品,都可能需要退出自动上架。怎么开始:在 App Store Connect 的 Pricing and Availability 页面检查 Mac 可用性,并记录关闭后的重新下载影响。
关联 Session
- What’s new in Mac Catalyst — 了解 macOS Big Sur 中 Mac Catalyst 的新能力,以及 iPad app 走向 Mac 的优化路径。
- Optimize the interface of your Mac Catalyst app — 学习使用 Mac Catalyst 的 Mac 优化界面,让 iPad app 更接近原生 Mac 体验。
- Port your Mac app to Apple silicon — 面向已有 macOS app,讲解如何为 Apple Silicon 构建、调试和测试 Universal app。
- Handle trackpad and mouse input — 深入处理 iPad 和 Mac Catalyst app 的触控板、鼠标、滚动和指针输入。
- What’s new in App Store Connect — 了解 App Store Connect 在上传、提交、内购、订阅和管理流程上的更新。
评论
GitHub Issues · utterances