本页讨论使用 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 之外分发您的 macOS 应用程序之前对其进行公证。

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

bash
flutter build macos
open macos/Runner.xcworkspace

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

构建和发布 macOS 应用 提供了更详细的关于将 Flutter 应用发布到 App Store 的分步指南。

权限和 App 沙盒

#

macOS 构建默认配置为已签名,并使用 App Sandbox 进行沙盒化。这意味着如果您想授予 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 Developer 网站上的 App 沙盒权限

强化运行时

#

如果您选择在 App Store 之外分发您的应用程序,您需要为您的应用程序进行公证以使其与 macOS 兼容。这需要启用强化运行时选项。启用后,您需要一个有效的签名证书才能进行构建。

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

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