跳到主内容

使用 Flutter 构建 macOS 应用

使用 Flutter 构建 macOS 应用时的平台特定注意事项。

本页面探讨了使用 Flutter 构建 macOS 应用时的一些独特注意事项,包括 Shell 集成以及通过 Apple Store 分发 macOS 应用的相关事宜。

集成 macOS 外观与体验

#

虽然你可以使用任何视觉风格或主题来构建 macOS 应用,但你可能希望对应用进行适配,使其更符合 macOS 的外观与体验。Flutter 包含 Cupertino 组件库,它提供了一套符合当前 iOS 设计语言的组件。其中许多组件(如滑块、开关和分段控件)同样适用于 macOS。

另外,你可能会发现 macos_ui 包非常适合你的需求。该包提供了实现 macOS 设计语言的组件和主题,包括 MacosWindow 框架和脚手架、工具栏、下拉和弹出按钮以及模态对话框等。

构建 macOS 应用

#

若要分发你的 macOS 应用,你可以选择通过 macOS App Store 分发,也可以直接分发 .app 文件(例如通过你自己的网站)。在 macOS App Store 之外分发应用之前,你需要对应用进行公证(Notarization)。

上述两个流程的第一步都涉及在 Xcode 中处理你的应用。为了能在 Xcode 中编译应用,你需要先使用 flutter build 命令构建发布版本,然后打开 Flutter macOS Runner 应用。

bash
flutter build macos
open macos/Runner.xcworkspace

进入 Xcode 后,请遵循苹果关于公证 macOS 应用通过 App Store 分发应用的官方文档。你还应通读下方的macOS 特定支持部分,以了解权限、应用沙盒和强化运行时对你发布的应用有何影响。

构建并发布 macOS 应用 页面提供了将 Flutter 应用发布到 App Store 的详细分步指南。

权限(Entitlements)与应用沙盒(App Sandbox)

#

macOS 构建默认配置为签名状态,并受应用沙盒(App Sandbox)限制。这意味着如果你想让 macOS 应用具备特定功能或服务,例如以下功能:

  • 访问互联网
  • 从内置摄像头捕获视频和图像
  • 访问文件

那么你必须在 Xcode 中设置特定的权限(entitlements)。下一节将介绍如何进行此操作。

设置权限

#

管理沙盒设置是在 macos/Runner/*.entitlements 文件中进行的。编辑这些文件时,不应移除原始的 Runner-DebugProfile.entitlements 异常配置(用于支持传入的网络连接和 JIT),因为它们对于 debugprofile 模式的正常运行是必需的。

如果你习惯通过 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 SandboxEntitlements

强化运行时(Hardened Runtime)

#

如果你选择在 App Store 之外分发你的应用,则需要对应用进行公证以兼容 macOS。这需要启用“强化运行时(Hardened Runtime)”选项。启用后,你需要有效的签名证书才能进行构建。

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

有关此主题的更多信息,请参阅 Apple 开发者网站上的 Hardened Runtime