使用 Flutter 开发 macOS 应用

本文章讨论了使用 Flutter 构建 macOS 应用的特有考虑因素,包括 shell 集成和在 Apple Store 上分发应用。

适应 macOS 的外观及界面风格

尽管你可以选用任何样式或主题来构建 macOS 应用,但是也许你会更希望应用的界面风格尽可能地对齐 macOS 的设计语言。 Flutter 提供了一套符合当前 iOS 设计风格语言的 Cupertino 组件集。其中许多的组件,例如滑块 (Sliders),开关 (Switches),分段控制器 (Segmented controls),在 macOS 上依然适用。

此外,macos_ui package 同样能满足你的需求。此 package 提供了采用 macOS 设计语言的组件和主题,包括一个 MacosWindow 框架、脚手架 (Scaffold)、工具栏 (Toolbar)、下拉和弹出按钮以及模态 (modal) 对话框。

构建 macOS 应用

你既可通过 macOS 的 App Store,也可直接在你的网站提供 .app 程序文件下载,以分发你的应用。对于 macOS 10.14.5 及之后的版本,在外部分发 macOS 应用之前,你需要对其进行公证。

无论采用上方何种方案,你都需要在 Xcode 中对应用进行处理。首先你需要使用 flutter build 命令构建发布版本的应用,然后在 Xcode 中打开 Flutter macOS 目录下 Runner (Runner.xcworkspace),才能在 Xcode 中编译你的应用。

flutter build macos
open macos/Runner.xcworkspace

在 Xcode 中打开应用后,请参考 Apple 官网指南 在分发前对 macOS 软件进行公证使用 App Store 分发应用程序。除此之外,你还需要阅读 授权和应用沙盒 部分,了解授权机制、沙盒和强化版运行时会如何影响分发的应用程序。

构建和发布为 macOS 应用 文档提供了将 Flutter 应用发布至 App Store 的详细步骤。

授权和应用沙盒

默认情况下,macOS 构建已签名并使用 App Sandbox 进行沙盒化。这意味着如果你想要在 macOS 应用中配置特定的功能或服务,例如:

  • 访问网络

  • 使用内置相机拍摄图片或视频

  • 访问文件

你必须要在 Xcode 中指定 授权文件 (entitlements)。接下来的章节,会告诉你如何实现。

配置授权

macos/Runner/*.entitlements 文件管理了沙盒的相关配置。当你编辑这些文件时,请不要删除原始的 Runner-DebugProfile.entitlements (支持传入网络连接和 JIT),因为调试和性能模式的正常运行需要它们。

如果你习惯于通过 Xcode capabilities(功能)界面 管理授权文件,请注意它仅会更新两个文件中的一个。而在某些情况下,它会创建一个新的授权文件,并使用其切换项目的所有配置。这两种情况都会导致一些问题,因此我们建议你直接编辑这些文件。除非有明确的需求,否则你应该同步修改这两个文件。

如果你打算在 App Store 分发你的应用,你需要启用应用沙盒功能,此时如果你需要添加某些插件或其他原生功能,则需编辑你的应用授权。例如,使用 file_chooser 插件需要添加 com.apple.security.files.user-selected.read-onlycom.apple.security.files.user-selected.read-write 授权。另一个常见的授权为 com.apple.security.network.client,是你的应用访问网络所必需的。

如果没有 com.apple.security.network.client 授权,则网络请求会失败并返回如下的信息:

flutter: SocketException: Connection failed
(OS Error: Operation not permitted, errno = 1),
address = example.com, port = 443

你可以阅读 Apple 开发者官网的 应用沙盒授权 文档,以获取关于此章节的更多信息。

强化版运行时

如果你不打算使用 App Store 分发应用,你则需要对你的应用进行公证,以与 macOS 10.15+ 兼容。这便要求启用强化版运行时。一旦启用,你就需要一个有效的签名证书来编译构建应用。

默认情况下,授权文件支持 JIT 调试构建,但是在使用应用沙盒时,你可能需要管理其他授权文件。如果你同时启用应用沙盒和强化版运行时,你可能需要为同一资源添加多个授权。例如,麦克风访问权限同时要求 com.apple.security.device.audio-input (用于强化版运行时) 和 com.apple.security.device.microphone (用于应用沙盒)。

你可以阅读 Apple 开发者官网的 强化版运行时 文档,以获取关于此章节的更多信息。