使用 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 10.14.5 开始,你需要在 macOS App Store 外部分发 macOS 应用程序之前对其进行公证。

上述两个过程的第一步涉及在 Xcode 中使用你的应用程序。要能够从 Xcode 内部编译你的应用程序,你首先需要使用 flutter build 命令为发布版本构建应用程序,然后打开 Flutter macOS Runner 应用程序。

flutter build macos
open macos/Runner.xcworkspace

进入 Xcode 后,按照 Apple 的 关于 macOS 应用程序公证的文档,或 关于通过 App Store 分发应用程序的文档 进行操作。你还应该阅读下面的 macOS 特定支持 部分,以了解权限、应用程序沙盒和强化运行时如何影响你的可分发应用程序。

构建和发布 macOS 应用程序提供了一个更详细的分步演练,介绍如何将 Flutter 应用程序发布到 App Store。

权利和 App 沙盒

默认情况下,macOS 构建配置为已签名,并使用 App 沙盒进行沙盒化。这意味着,如果您希望为 macOS 应用程序授予特定功能或服务,例如以下功能或服务

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

那么您必须在 Xcode 中设置特定的权利。以下部分将告诉您如何执行此操作。

设置权利

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

如果您习惯于通过Xcode 功能 UI管理权利文件,请注意,功能编辑器仅更新两个文件中的一个,或者在某些情况下,它会创建一个全新的权利文件,并切换项目以将其用于所有配置。这两种情况都会导致问题。我们建议您直接编辑文件。除非您有非常具体的原因,否则您应始终对两个文件进行相同的更改。

如果您保持 App 沙盒启用(如果您计划在 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 沙盒授权

强化运行时

如果您选择在 App Store 外分发您的应用,您需要对您的应用进行公证以兼容 macOS 10.15+。这需要启用强化运行时选项。启用后,您需要有效的签名证书才能构建。

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

有关此主题的更多信息,请参阅 Apple 开发者网站上的 强化运行时