大多数浏览器和
Developer App 均支持流媒体播放。
-
利用 Xcode 开发多平台 App
了解如何利用 Xcode 14 为多个 Apple 平台构建 App。我们将介绍如何简化 App 目标,维护常用代码库,以及默认共享设置。我们还将探索如何通过对您的设置和代码进行条件化,为每个平台自定义您的 App。
资源
相关视频
WWDC22
-
下载
您好 我是 Xcode 团队 的设计师 Jake 多平台 App 开发在 Xcode 14 中 被提升到一个新的水平 单个 App 目标现在可以支持 跨多个平台的更多目标 同时维护一个通用代码库 默认共享设置 并允许在需要时 进行条件化的新方法 首先 我们将介绍什么是 多平台 App 目标 以及在哪些情况下效果最好
接下来 我们将修改我们的项目 以支持多个目标和平台 然后我们将更新我们的项目 以使其在新平台上构建和运行
我们将确保 App 在每个受支持的 平台上都能运行良好
最后我们会将 Xcode Cloud 与我们的项目修改内容进行集成
首先 让我们了解 我们要使用哪种技术 以便于让我们的 App 支持多个平台 在 Xcode 14 以前 如果您希望 您的 App 同时支持 iOS 和 macOS 您需要对 两个独立的项目目标分别开发 如果您的项目需要明显不同的代码库 那就太好了 在不同平台之间 共享很少的设置即可 或者如果每个 App 的目标 都严重依赖于不同的底层技术
如果您的项目今天仍然如此 您最好的选择是 继续为每个平台使用单独的目标代码 在 Xcode 14 中 单个 App 的目标可以对多个目标声明支持 例如 iPhone iPad Mac 和 Apple TV 这对于一个使用公共代码库 并在所有目的地 共享其大部分设置的 App 来说 是非常好的 同时它还允许在需要时进行定制 让我们看看 Xcode 14 中的多平台 App 是如何工作的 如果我们从头开始 最好的开始方法是 在创建 Xcode 新项目时 使用最新的 改进的 多平台 App 模板
多平台 App 模板使用 SwiftUI 作为它的生命周期和接口 它从默认配置为 支持 iPhone iPad 和 Mac 的目标开始 这是新项目的绝佳配置 因为我们使用的是 SwiftUI 我们可以访问每个平台 的 SDK 的完整功能集 允许利用每个平台所提供的优势 创建非常不错的新 App 现有项目也可以声明 在 App 的目标中 对多个目标平台的支持 并使用 SwiftUI 访问 每个平台的 SDK 的全部功能 让我们看看如何将一个目标为 Mac 平台的程序 添加到现有的 iOS App 中 我一直在开发一个叫 Food Truck 的 App 它在 iPhone 和 iPad 上运行良好 我对这个 iOS App 非常满意 现在我想把它迁移到 Mac 上 以支持这个平台和它的功能 让我们看看项目 在 Xcode 中的样子
如果我们查看 App 的目标 我们就能看到 App 支持的 所有目标的列表
您可以看到我已经有了一个 Mac 目标 专为 iPad 设计 这允许带有 Apple silicon 芯片的 Mac 电脑运行我未经修改的 iOS App 这是开始支持 Mac 电脑的很好方法 但我想对 Mac 的支持 提升到一个新的水平 让我们添加一个 Designed for Mac 这样的体验
我们可以很容易地 编辑支持的目标列表 并给 App 添加 Mac 目标 Mac 目标有几个选项 Mac Mac Catalyst 和 Designed for iPad 最后一个是灰色的 因为我的 App 已经支持它了
在 Mac 和 Mac Catalyst 之间选择主要取决于 我们最有兴趣使用哪种技术 如果我们的 App 大量使用 UIKit 或 Storyboards 作为核心 Mac Catalyst 将是把我们现有的 iPad App 转换成 兼容 Mac App 的 一个很好的方法 然而因为我们的 App 使用 SwiftUI 这就使得 Mac option 成为制作我们 Mac App 的 最佳选择 我们将立即获得 漂亮的 Mac 外观 其拥有 macOS SDK 的全部功能 并没有任何限制 这意味着我们可以自由地在 iOS 程序上使用 UIKit 以及在 macOS App 中自由使用 AppKit 如果我们需要这种灵活性的话 考虑到上述的问题 下面让我们选择 Mac 这是使用 SwiftUI 的 最佳选择 一旦我做出选择 Xcode 会提醒我 为了能让我的项目支持 Mac 系统 则需要进行一些必要的修改 在这种情况下 Xcode 将更新我的目标 让目标包含 Mac 上支持的 依赖项和框架 重要的是要注意 Xcode 是不会修改我的代码的 所以如果我调用的 API 在 Mac 上不可用 我需要自己解决这些问题 一旦我选择了 My Mac 选项 它就会添加到我支持的目标列表中 当我在 Xcode 中开发时 拥有多个 Mac 目标是完全有效的 如果我正在从 Mac Catalyst 或 Designed for iPad 过渡到 一个完整的 Mac App
这就意味着我可以继续在 Xcode 中测试我的每个 Mac 产品 在开发我的 App 时 我不一定会局限于单一选择 但是 如果我要将我的原生 Mac App 发布到 App Store 那么我的 Designed for iPad 的 App 将不再提供给我的用户 因此 Xcode 提供了一种 快速删除此目标的方法 然而一旦我对原生 Mac 程序 体验满意 我就会考虑删除这个目标 无论我是从零开始 还是向现有的 App 添加新目标 在 Xcode 中使用单个目标 都可以在默认情况下 共享代码和构建设置 在某些情况下 我想自定义一个单独的设置 比如我的 App 的显示名称或最低部署版本 让我们看看如何在 Xcode 14 中 改进的目标编辑器中做到这一点 许多 App 目标设置 都包含一种对其值进行条件化的方法 在支持的设置上 我可以显示一个编辑器 它允许我为项目中的 每个生成配置设置默认值 我添加了一个 自定义 Beta 配置 以及新 Xcode 项目附带的 标准调试和发布配置 当使用 beta 配置构建时 我想给 App 一个不同的显示名称 所以我可以在此处编辑名称 当我进行输入时 我们将在 Xcode 中 看到 App 的显示名称 已经被所有的可能名称取代 如果需要我还可以在后面 添加一个状态字段 让我可以根据正在使用的 SDK 指定一个合适的名字 这允许我在为 Mac 构建 beta 版程序时 起一个特定的名称
好的 看来我们已经编辑完成了 在 General 选项卡中的设置 让我们看看 Signing & Capabilities 选项卡 看看有什么其他需要修改的地方
好消息是 启用 Automatic Signing 后 就无需更改其他内容了 当我添加我的 Mac 目标时 必备的签名证书 和 Mac 的设置配置文件 就已经自动生成了 默认情况下 我的 iOS 和 macOS App 产品都使用相同的捆绑标识符(Bundle Identifier) 这太棒了 因为这意味着 当把它们发布到 App Store 时 它们即可享受 通用购买(Universal Purchase) 所以购买我的 iOS 程序的人 也会自动获得我的 Mac App 我的 App 还利用了推送通知等功能 我一直在让我的 iOS 程序功能 适应我的 MacOS 程序 它们无需我再做 任何额外的工作即可使用 它们甚至被合并到 同一个授权文件中 现在我们已经为 App 添加了 对多个目标的支持 我们的下一个目标是构建它 为新目标构建 App 时 遇到问题是正常的 尤其是涉及到新的 SDK 时 例如我们新的 Mac support 那么让我们来看看 其中的一些常见问题 某些框架并非适用于所有平台 我们需要确保项目内 没有导入或链接 任何不可用的框架 请记住 在添加对新目标的支持时 Xcode 不会更改我们的代码 所以我们需要 基于当前 SDK 将原有代码条件化 类似于我们对 App 的设置进行条件化 对待 API 也是如此 在我们构建程序时 某些功能可能会 基于 SDK 被标为不可用 Swift 提供了一种方法 可以对代码的某些部分条件化 使其只包含 当前使用 SDK 的可用功能 Xcode 还允许我们指定 在为某些 SDK 构建程序时 是否编译单个文件 如果我现在构建我的项目 没有出现任何问题 那是因为我选择了 使用 iOS SDK 我需要从列表中选择 My Mac 来针对 macOS SDK 进行构建
构建结果现在显示了一些新的问题 正如我们所料 它们主要与可用性有关 在一个程序文件中 我导入了 在 Mac 上不可用的 ARKit 包 我可以将此导入语句包装在 #if canImport 中以对其进行条件化
如果我不想费心 管理框架的支持平台 这种操作就非常有用 简单来说 如果不可用 就不要包括这部分代码 但是 我仍然在整个文件中 使用 ARKit 包的功能 所以有时为 SDK 条件化整个文件更有意义 如果我们导航回项目标签 转到 Build Phases 选项卡 然后搜索我的文件…
并指定它应该只为 iOS 编译
在构建之后 一旦我对代码作出这些更改 Xcode 就会出现一个新提示 在 Mac 上的 SwiftUI 框架中 有一个功能被标记为不可用 具体来说 我在 iOS 上使用 editMode 允许用户 在表格和列表中 进行编辑和选择内容 但该功能在 macOS 上不存在 用户已经可以在 Mac 上 自由选择和编辑行内容 因此 我们需要让 这段代码仅在 iOS 上运行 我可以调节环境属性 以及所有 使用 editMode 的地方
现在 我需要确定 我使用此属性的地方 都已经完成条件化 就像这个 onChange 修饰符这样 我可以将整个修饰符 包裹在 if os 条件中
最后 我在工具栏中使用了一个 EditButton 视图 它也是 iOS 专用的
好的 让我们尝试 运行我们的 App
搞定了 我们的 App 现在 可以在 Mac 上构建和运行 仅仅因为 App 现在可以在新平台上构建和运行 并不意味着我们的工作已经完成 在某些情况下 您希望改进 App 的体验 以满足平台上用户的要求 此外 删减 iOS 的独有功能 并不代表工作结束 我们现在可以使用 macOS SDK 的所有功能 现在我看到 App 可以在 Mac 上运行 我注意到 App 的排版 有一个问题 使得在它的新环境中 感觉有些不自然 网格视图中的 这些甜甜圈似乎太大了 那是因为这里的网格项目 是为触控而设计的 当 UI 元素使用具体磅值来 控制元素大小时 就会出现这种情况 或者程序的设计 只考虑了在单独平台的展示 在 Mac 上 我们不需要将按钮 或缩略图做得那么大 因为我们有一个更精确的指针设备 这是根据我们基于 不同 SDK 构建项目时 将其中的常量 进行条件化的一个很好的例子 当我们将我们的 App 移植其他平台时 根据我们新平台的要求 重新考虑这些选择是很重要的 让我们看看 如何根据不同的 SDK 来指定不同的显示值 我经常使用的一种技术 是将常量作为计算属性 并使用 #if os 来 条件化返回的内容 让我们将其转换为计算属性 并返回以前的常量 但该常量仅在 iOS 上 返回这个数值
看起来 80 的大小感觉更自然
现在 关于使用 macOS SDK SwiftUI 中有一个很酷的新功能 它允许我们将自己的 UI 元素添加到菜单栏 我有 App 的摘要视图 以便于让我的用户 可以快速轻松地访问所需功能 回到我们的 App 的声明部分 在这里 我可以为额外菜单栏 添加一个新场景 但请注意 因为这是 macOS 独有的功能 所以我需要针对 macOS SDK 对其进行条件化
让我们构建程序 并运行看看
真棒 我的卡车图标 现在出现在菜单栏中 太棒了 现在我的 Mac 用户可以 从他们的菜单栏中 查看今天的信息并进行快速浏览 当我们使用 SwiftUI 时 我们可以完整使用各个平台 SDK 以及利用其出色的功能 需要注意的是 当我们将 App 迁移到其他平台时 我们经常需要基于新平台的 工作条件 重新考虑过去的许多选择 SwiftUI 将平台的需求 直接转化为 API 许多界面元素将自动出现 并且在每个平台上看起来都很棒 相反 这意味着 当我们使用大量 自定义控件和 UI 的其他功能时 我们可能会失去自动样式的效果 所以我们该经常仔细检查我们的 UI 让他们在每个平台都能显示自如 综上所述 当我们构建 我们优秀的 App 时 应该确保我们遵循 由人机界面指南规定的最佳做法 现在我们对 App 的 本地化修改结果非常满意 是时候归档我们的 App 产品并将其 上传到 App Store Connect 了 这个工作我们可以从 Xcode 构建 或通过 Xcode Cloud 对其自动化处理 一旦我们准备好了 我们就可以 与 TestFlight 上的 内部和外部测试人员分享该 App 并将其发布到 App Store 我们需要归档我们的 App 而后将它们上传到 App Store Connect 因为我们只有一个目标 并不意味着我们只有一个产品 我们需要为每个平台归档 并单独上传程序 如果是在本地构建和存档 则需要选择一个目标平台 该目标具有要为其创建归档的 SDK 如果我想制作 macOS App 我就要从目标列表中 选择 My Mac 否则的话 我会选择一个 iOS 设备来生成我的 iOS App
一旦我选择了目标平台 我就可以选择 Product > Archive 来创建归档
归档完成后我可以使用 Xcode 中的 Organizer 窗口 并将 App 上传到 App Store Connect
如果我使用 Xcode Cloud 我可以在我的工作流程中添加操作来构建 测试并存档我的产品 在我的工作流程中的操作列表中 我可以创建要构建的新项目 测试 分析和归档我的每个产品 在本例中我有一个 iOS App 和一个 macOS App 我可以再进行一个设置 包括部署准备 自动将我的 App 上传到 App Store Connect 我甚至可以立即将构建程序发送给内 部的 TestFlight 团队 并开始获得有关变化的新鲜反馈 总而言之 Xcode 14 将 多平台 App 的开发提升到了一个新的水平 实现了简化的 App 目标 现在可以支持 跨多个平台的更多目标 使用单个 App 目标 您可以维护通用代码库 并且它们在默认情况下共享设置 如图所示 我们可以根据 需要对设置和代码进行条件化 让我们定制的 App 能最好地匹配平台的期望 剩下的就看您了 要了解有关今年 Xcode 的 新功能和改进的更多信息 请看 What's new in Xcode 我迫不及待地想看看 借助 Xcode 和 SwiftUI 的强大功能 您能带来哪些奇思妙想
-
-
8:48 - canImport
#if canImport(ARKit) import ARKit #endif
-
10:02 - Condition Property
#if os(iOS) @Environment(\.editMode) private var editMode #endif
-
10:13 - Condition View Modifier
#if os(iOS) .onChange(of: editMode?.wrappedValue) { newValue in if newValue?.isEditing == false { selection.removeAll() } } #endif
-
10:19 - Condition View
#if os(iOS) EditButton() #endif
-
11:48 - Computed Property
var thumnailSize: Double { #if os(iOS) return 120 #else return 80 #endif }
-
12:37 - Menu Bar Extra
#if os(macOS) MenuBarExtra { MiniTruckView(model: model) } label: { Label("Food Truck", systemImage: "box.truck") } .menuBarExtraStyle(.window) #endif
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。