Use Xcode to develop a multiplatform app
Developer Tools 进阶 20m

使用 Xcode 开发多平台应用

Use Xcode to develop a multiplatform app

2022年6月6日

在 Apple 官方观看视频

一句话判断

Xcode 14 的多平台应用目标(Multiplatform App Target)让一个 Target 同时支持 iPhone、iPad、Mac 和 Apple TV 成为现实——如果你用 SwiftUI 开发,这是最省力的跨平台方案。

这场 Session 讲了什么

Xcode 团队的设计师 Jake 详细讲解了 Xcode 14 中多平台应用目标的工作方式。在 Xcode 14 之前,如果你的应用要同时支持 iOS 和 macOS,需要创建两个独立的 Target。Xcode 14 允许单个应用 Target 声明支持多个目标平台。

Session 用一个 Food Truck 示例应用贯穿始终,演示了如何从现有的 iOS 应用添加 Mac 支持。内容覆盖三种 Mac 运行模式的选择(原生 Mac、Mac Catalyst、Designed for iPad)、项目配置、条件化编译、签名配置,以及与 Xcode Cloud 的集成。

值得深挖的点

三种 Mac 模式的选择。 Designed for iPad 让 Apple Silicon Mac 运行未修改的 iOS 应用,零工作量但体验受限。Mac Catalyst 将 iPad 应用转化为 Mac 兼容版本,适合大量使用 UIKit/Storyboard 的项目。原生 Mac 模式使用完整的 macOS SDK,适合 SwiftUI 项目——可以在 iOS 端用 UIKit,Mac 端用 AppKit,灵活度最高。

条件化设置。 Xcode 14 的 Target 编辑器支持按条件设置值。你可以在不同构建配置(Debug/Release/Beta)和不同 SDK 之间设置不同的应用名称、最低部署版本等。设置界面直接展示所有可能的值组合,一目了然。

Universal Purchase 的自动实现。 添加 Mac 目标后,iOS 和 macOS 应用默认共享同一个 Bundle Identifier。这意味着发布到 App Store 时自动支持通用购买——买过 iOS 版的用户无需再次购买 Mac 版。

代码条件化编译。 并非所有 API 在所有平台都可用。使用 #if os(iOS)if #available(macOS 13, *) 等条件编译来处理平台差异。Xcode 不会自动修改你的代码,需要手动处理不兼容的 API 调用。

代码片段

// 条件化编译:根据平台使用不同的 API
#if os(iOS)
import UIKit
#elseif os(macOS)
import AppKit
#endif

struct ContentView: View {
    var body: some View {
        List(items) { item in
            ItemRow(item: item)
        }
        #if os(iOS)
        .navigationTitle("Food Truck")
        #else
        .navigationTitle("Food Truck")
        .frame(minWidth: 600, minHeight: 400)
        #endif
    }
}

// 运行时可用性检查
if #available(macOS 13, *) {
    // 使用 macOS 13 新增的 API
} else {
    // 降级处理
}

最佳实践

  • 新项目直接使用 Xcode 14 的多平台应用模板,默认支持 iPhone、iPad 和 Mac
  • SwiftUI 是多平台开发的最佳选择,能直接访问每个平台的完整 SDK
  • 为不同平台条件化应用名称、部署版本等设置,在 Target 编辑器中按需定制
  • iOS 和 Mac 使用同一个 Bundle Identifier,自动实现 Universal Purchase
  • 自动签名在添加新平台后会自动处理证书和描述文件
  • Capability(如推送通知)在适用平台上自动应用,合并到单个 entitlements 文件中
  • 开发阶段可以同时保留多个 Mac 目标(Designed for iPad + 原生 Mac),方便对比测试

还有什么值得关注

  • 发布原生 Mac 应用后,Designed for iPad 版本将不再对用户可见
  • 框架可用性检查很重要——不是所有 iOS 框架在 macOS 上都可用
  • 可以在 Xcode Cloud 中为不同平台配置独立的构建工作流
  • 如果项目的 iOS 和 macOS 代码差异很大,独立 Target 可能仍是更好的选择
WWDC 2022