使用 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 中编译你的应用。

bash
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。这便要求启用强化版运行时 (Hardened Runtime)。一旦启用,你就需要一个有效的签名证书来编译构建应用。

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

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