本页讨论使用 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 应用程序。

bash
flutter build macos
open macos/Runner.xcworkspace

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

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

权限和应用沙盒

#

macOS 构建默认配置为签名并使用应用沙盒进行沙盒化。这意味着如果您想为您的 macOS 应用授予特定功能或服务,例如以下内容:

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

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

设置权限

#

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

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

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

强化运行时

#

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

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

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