规划你的 macOS App
如果你刚接触 Mac 软件开发,请花些时间来熟悉将要用到的工具和技术。Apple 提供了你入门所需的一切,各种 macOS 技术也能帮助你实现 App 的理想功能和性能。
探索无限可能
Mac 为速度和性能而生,macOS 可帮助你充分提升 App 的性能。对于需要原始处理能力来尽快执行任务的 App,Mac 是理想之选。不过,Mac 也可用于完成日常的任务,例如通信、新闻与信息、社交媒体以及游戏等。
macOS 提供了不同的路径供你交付内容,而你选择的路径将会影响你必须做出的初始决定:
用标准视图合成 UI
利用 macOS 中内建的按钮、文本标签以及其他标准视图和控件,快速地构建 App。自定控件的外观或创建全新的视图,以独特的方式展示你的内容。这种做法适用于大多数 App,而且还能缩短开发时间。
构建无 UI 的软件
对于不需要 UI 的轻量型工具和实用程序,可以选择这条路径。创建命令行工具和脚本、XPC 服务及模块来支持自定文件系统或云存储、数据库与服务器软件、开源工具、新型编程语言,以及 UNIX 工具等。
在选择了特定路径后,请思考你的 App 所需要的功能。除了一些核心技术外,你还可以根据需要采用许多技术来支持特定的功能。macOS 技术不仅可让 App 不必考虑低级硬件细节,还为你提供一个稳定的基础来打造你的各项功能。
如果你有现有的 iPadOS App,可以使用 Mac Catalyst 为你的 App 创建可在 Mac 上运行的版本。
从何处着手
软件开发从 Xcode 开始,这是 Apple 的集成式开发环境。Xcode 提供一套齐全的软件开发工具,包括项目管理支持、代码编辑器、可视化 UI 编辑器、调试工具、面向不同设备的模拟器,以及用于评估性能的工具,等等。Xcode 还包含一整套系统代码模块 (称为框架),以辅助你开发软件。
Xcode 包含适用于 iOS、iPadOS、macOS、Apple tvOS 和 watchOS 的 SDK。
要在 Xcode 中创建新项目,请选取“File”(文件) >“New”(新建) >“Project”(项目),然后按提示操作来创建 macOS App。新项目附带一些默认代码来帮助你轻松入门,而 App 类型则决定了你的初步起点。如需有关如何使用 Xcode 的信息,请查看 Xcode 文档。
Swift Playgrounds 是一个交互式编程环境,适用于希望学习及试验代码和开发者技术的用户。如需更多信息,请查看“Swift Playgrounds”。
采用 Swift
在设置项目时,请考虑你要使用哪一种编程语言。Swift 是首选,因为其语法非常简洁,从设计上保证安全,而且还有让代码更富表现力的现代特性。此外,Swift 代码能够生成运行速度飞快的软件,并可与 Objective-C 互操作,因此你可以在同一项目中同时包含这两种语言的源代码文件。
《Swift 编程语言指南》
《Swift 编程语言指南》 全面概述了 Swift 编程语言,是你 Swift 学习之旅的理想起点。
挑选 App 构建器技术
你还应在早期做出另一个选择,即你准备将哪一种 App 构建器技术用于你的界面。Apple 的 App 构建器技术提供了 macOS 与你的 App 通信所需要的核心基础架构。它们也定义了编程模型,供你用于构建界面和处理事件等。
SwiftUI
SwiftUI 为你构建 UI 和 App 基础架构提供了一种与平台无关的现代方法。以编程方式从一组标准 SwiftUI 视图指定你的界面,或以你希望的外观创建自定视图,并且实时为你的界面呈现可视化展示。在运行时,系统会使用你的代码来构建 App 的最终界面并管理界面更改。借助这种编程式 UI 设计方法,你可以随手获得许多标准行为,还能更简单地让 UI 保持最新状态。如需有关如何使用 SwiftUI 的引导式演示,请查看“SwiftUI 简介” 教程。
AppKit
借助 AppKit,你可以利用 Storyboard 以可视化方式合成你的界面。AppKit 为构建 App 提供了一种更加传统的方法,让你能够全面掌控界面元素的管理。编写更新视图和控件所需要的代码,更改它们的配置,并将更改传达给 App 的其余部分。要开始构建 AppKit App,请查看 AppKit 文档。
SwiftUI 是设计 App 基础架构和 UI 的首选技术,它为开发提供了一个更好的起点。即便你通过 AppKit 构建初始 UI,SwiftUI 和 AppKit 视图也能互操作。你可以在同一视图层次结构中轻松地混合使用 SwiftUI 视图和 AppKit 视图。
除了构建 App 的基础架构外,macOS 还包含可用来打造 App 数据结构的技术。Swift 标准资料库和 Foundation 框架 提供了你常用的基本类型,如数组和字典、字符串、数字、日期和其他常见的数据值类型。你也可自己创建自定类型,并运用 Swift 的 Codable 支持 将这些类型持久保留在磁盘上。如果你的 App 管理大量的结构化数据,请考虑使用 Core Data 和 CloudKit 来管理和持久保留这些数据。
设计用户体验
App 通过提供引人入胜的体验来留住用户。你创建的 UI 需要外观精美、布局易于理解,并且始终凸显恰当的内容。
Mac 提供许多屏幕空间来构建丰富的界面,因此请思考如何以直观的方式展示信息。另外,也要考虑系统相关设计模式对你 UI 的影响。
- 窗口定义了 App UI 的核心。创建一个或多个窗口,并将相似或不同的内容放入每个窗口中。将窗口设置为特定的大小,或者允许用户调节它们的大小。支持全屏模式,以创造免受打扰的工作环境。
- 菜单定义了用户可对你的内容执行的操作。屏幕顶部的菜单栏会显示活跃 App 的菜单。在你的 App 中标识相关的操作,并根据用户如何与你的内容交互来设计菜单。
- 程序坞为用户提供一个访问 App、文稿、窗口和文件夹的便捷途径。添加自定程序坞菜单来显示常用的命令,或者在 App 图标上添加标记来提醒新内容。
《人机界面指南》
Apple 的《人机界面指南》提供了宝贵的信息,指导你设计 App 界面、导航内容,以及管理 Mac 上的交互。在探索 macOS 生态系统时,务必重视并仔细阅读这些指南,使用相应的 Apple 设计资源来深入设计你的 App。
某些功能和技术是所有 macOS App 都必不可少的。在规划你的初始 UI 时,请务必采用以下功能:
窗口控制器
在 macOS 上,窗口控制器管理界面中一个窗口的内容,包括载入、显示和关闭窗口。SwiftUI 使用场景 来管理窗口。AppKit 则使用 NSWindowController 对象。
外观变体
构建你的 UI,支持系统层面的外观变化。用户可通过深色模式选取浅色或深色 UI,也可通过辅助功能设置来选取高对比度 UI。不同的外观依赖于不同的调色盘和图像素材,你可以借助素材目录 来管理它们。对于 UI 的其余部分,可使用系统 API 来判断何时需要在浅色、深色或高对比度内容之间切换。如需相关信息,请查看“在你的界面中支持深色模式”。
文本样式
使用文本样式和动态字体变体来呈现你 App 的文本。文本样式定义了一段文字的语义化使用,例如,正文样式定义了主要内容。即使你改变字体大小,文本样式的字体特性也保持不变,以便在你缩放文本时维持 App 的预期外观。将动态字体变体用于菜单、工具提示以及界面的特定元素,从而与标准 UI 元素的外观保持一致。如需相关指导,请查看“字体排印”。
可缩放图像
融合 SF Symbols,让你的 App 更自如地适应更改。“SF Symbols” App 提供一个由可配置的矢量图像组成的庞大集合,这些图像能够自然地适应外观和尺寸变化。它们也能与 San Francisco 系统字体完美搭配,在不同 Apple 平台上形成统一的外观。请查看“在你的 UI 中配置和显示符号图像”。
谨慎地处理文稿和文件
在 macOS 中,用户能够直接访问文件系统,并可在“访达”或“终端”App 中添加、删除、移动和检查文件。支持有助于用户访问文件的技术,并确保你的 App 能够适应其他地方所做的更改:
通过 iCloud 云盘支持跨设备共享文件
给予用户将文档和文件储存到 iCloud 中的选项,以保证他们能在所有设备上访问这些文件。利用 iCloud 键值存储 共享少量数据。
将私有文件储存在 App 的容器目录中
如果你的 App 会创建中间文件、缓存或你不希望用户更改的其他内容,请将这些文件储存在 App 容器目录 中。容器提供了定义完善的内容存放位置,隐藏于视图之外,以防用户意外更改你的内容。
为自定文件类型提供“快速查看”预览
用户可利用“快速查看”从“访达”速览文件内容,无需打开文件本身。为你定义的所有自定文稿格式提供“快速查看”插件。如需相关信息,请查看“QuickLookUI”。
如果你的 App 支持基于文件的文稿,请提供顺畅无阻的文稿编辑体验。使用 SwiftUI 文稿类型 或 AppKit NSDocument 类型来规范文稿内容。通过在 App 编辑代码中内建“撤销”和“重做”支持,协助用户在编辑过程中犯错时复原。采用自动存储功能,防止用户丢失对其文稿的更改。如需更多信息,请查看“开发基于文稿的 App”。
在开发期间采用最佳做法
以下做法能帮助你为每个用户提供最佳体验:
保护用户的隐私
隐私非常重要,因此请告知用户你将如何使用他们的数据。如果你收集数据,请提供隐私声明来阐述你将如何使用这些信息。如果你使用会操作个人数据的 Apple 技术,请附上使用说明,以便系统在首次使用时显示。如需更多信息,请查看“保护用户的隐私”。
审查你的辅助功能支持
Apple 已将辅助功能支持直接内置于其各项技术中,但屏幕阅读器和其他辅助功能仍需依赖你的 App 提供的信息。SwiftUI 和 AppKit 可以描述 UI 的每一部分,但只有你知道这些部分是如何在一起协同工作的。检查辅助功能标签和其他描述,确保它们提供了实用的信息,并确保基于焦点的导航简约且直观。如需更多信息,请查看“辅助功能”。
打造国际化和本地化的 App
针对其他地区和语言打造本地化的 App,拥抱全球化市场。利用 Foundation 框架 准备你的 App,它可提供代码来根据不同语言和地区对字符串、日期、时间、货币和数字进行格式调整。确保你的 UI 对从左到右和从右到左的语言都有良好呈现。将 App 资源本地化,并将它们添加到你的 Xcode 项目中。如需有关国际化和本地化流程的信息,请查看“本地化”。
为每个人而设计
在开发内容时考虑社会和文化方面的差异,避免使用对你的部分受众隐含负面或贬损意义的图像和词语。如需更多信息,请查看“包容性”。
全面测试和调试 App
在开发环节,使用内建 Xcode 调试器在出现问题时进行调试。使用 XCTest 构建自动化测试套件并在每次构建时运行,以验证新代码的运行是否与预期相符。使用 Xcode Cloud 的持续集成系统,实现自动构建你的 App、自动完成测试循环及向 QA 团队自动分发。
优化你的 App 性能
利用 Xcode 附带的 Instruments App,排查代码中的瓶颈和其他性能问题。对运行代码进行性能测试,查找内存泄漏,分析资源使用,以及进行更多其他检查。如需有关使用 Instruments 收集指标的信息,请查看“提升 App 的性能”。
为 App 选择商业模式
通过各种商业模式在全球范围内分发你的 App,包括免费、免费但提供 App 内购买项目、付费下载等。你所构建的界面应能提供一致性的体验,并支持你所选择的商业模式。如需更多信息,请查看“为 App 选择商业模式”。
如何更进一步
当你的 App 准备就绪并能正常运行时,请探索更多方法来进一步完善用户体验。小小改变也能带来大不同 — 哪怕只是加入一个特定功能,或者换一种方式呈现你的内容。例如:
围绕新功能添加运行时条件检查
当你更新 App 以支持 macOS 新版本时,请在面向新功能的代码附近添加运行时条件检查。借助运行时检查,你就不必专门为使用 macOS 新版本和旧版本的用户发布 App 的不同版本。运行时检查能让所有用户运行相同的 App,同时让运行 macOS 新版本的用户可以使用 App 的新增功能。如需有关添加运行时检查的信息,请查看“在特定平台或操作系统版本上运行代码”。
要与你的内容交互,App 不是唯一的途径。采用以下技术,将 App 的范围拓展到系统的其余部分。
将你的内容与其他系统服务集成
系统的一些部分支持特定于 App 的信息,并使用 App 扩展来收集这类信息。为你的 App 添加小组件 App 扩展,以便在“通知中心”显示内容,或者添加操作 App 扩展 来定义 App 的快速操作。如需有关支持的 App 扩展的信息,请查看“App 扩展”。
支持 App 内容的通用链接
如果你的网站和 App 提供类似的内容,请给你的 App 添加通用链接支持。借助通用链接,你不必为打开 App 中的内容而创建单独的 URL。只需一个 URL,就能打开你的 App (若已安装) 或你的网站 (若未安装 App)。如需更多信息,请查看“允许 App 和网站链接你的内容”。
导出或可让其他 App 受益的功能
macOS 中的“服务”菜单可显示用户能对当前所选对象执行的任务。在这个菜单中填充你的 App 可提供的任务,并编写在运行时执行这些服务的代码。如需相关信息,请查看《服务实现指南》。
一些 App 需要与自定硬件通信,或扩展系统来提供系统级的服务或安全功能。如果你支持以下任何活动,请考虑给你的 App 添加系统扩展:
监控事件中潜在的恶意活动
例如,你可以监控进程的执行或分叉、文件系统的装载,以及发出的信号等。如需相关信息,请查看“端点安全”。
自定或扩展核心网络功能
例如,你可以配置系统的无线局域网设置,创建和管理 VPN 配置,执行内容筛选,管理系统范围 DNS 配置,或者集成自定热点。如需相关信息,请查看“网络扩展”。
直接与自定硬件通信
例如,你可以与外置 USB 设备、HID 设备、PCI 设备、串行设备或许多其他设备通信。如需相关信息,请查看“DriverKit”。
探索更多
进一步了解各种技术,它们不仅带来独特的功能,还可与不同 Apple 平台紧密集成,形成一个无缝的生态系统来帮助 App 和游戏跨平台运行,包括 iOS、iPadOS、macOS、Apple tvOS、visionOS 和 watchOS。