使用 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 应用。
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),因为它们对于 debug 和 profile 模式的正常运行是必需的。
如果你习惯通过 Xcode 能力(Capabilities)界面管理权限文件,请注意,能力编辑器通常只会更新两个文件中的其中一个;在某些情况下,它甚至会创建一个全新的权限文件,并将项目切换为在所有配置中使用它。这两种情况都会引发问题。我们建议你直接编辑这些文件。除非有非常特殊的理由,否则你应该始终对两个文件进行相同的修改。
如果你保持应用沙盒处于启用状态(如果你打算在 App Store 中分发应用,这是必需的),则在添加某些插件或其他原生功能时,需要管理应用的权限。例如,使用 file_chooser 插件需要添加 com.apple.security.files.user-selected.read-only 或 com.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 Sandbox 和 Entitlements。
强化运行时(Hardened Runtime)
#如果你选择在 App Store 之外分发你的应用,则需要对应用进行公证以兼容 macOS。这需要启用“强化运行时(Hardened Runtime)”选项。启用后,你需要有效的签名证书才能进行构建。
默认情况下,权限文件允许调试构建使用 JIT,但与应用沙盒一样,你可能需要管理其他权限。如果你同时启用了应用沙盒和强化运行时,则可能需要为同一资源添加多个权限。例如,访问麦克风需要同时添加 com.apple.security.device.audio-input(针对强化运行时)和 com.apple.security.device.microphone(针对应用沙盒)。
有关此主题的更多信息,请参阅 Apple 开发者网站上的 Hardened Runtime。