使用 Flutter 开发 macOS 应用
本文章讨论了使用 Flutter 构建 macOS 应用的特有考虑因素,包括 shell 集成和在 Apple Store 上分发应用。
适应 macOS 的外观及界面风格
#尽管你可以选用任何样式或主题来构建 macOS 应用,但是也许你会更希望应用的界面风格尽可能地对齐 macOS 的设计语言。 Flutter 提供了一套符合当前 iOS 设计风格语言的 Cupertino 组件集。其中许多的组件,例如滑块 (Sliders),开关 (Switches),分段控制器 (Segmented controls),在 macOS 上依然适用。
此外,macos_ui package 同样能满足你的需求。此 package 提供了采用 macOS 设计语言的组件和主题,包括一个 MacosWindow
框架、脚手架 (Scaffold)、工具栏 (Toolbar)、下拉和弹出按钮以及模态 (modal) 对话框。
构建 macOS 应用
#你既可通过 macOS 的 App Store,也可直接在你的网站提供 .app
程序文件下载,以分发你的应用。对于 macOS 10.14.5 及之后的版本,在外部分发 macOS 应用之前,你需要对其进行公证。
无论采用上方何种方案,你都需要在 Xcode 中对应用进行处理。首先你需要使用 flutter build
命令构建发布版本的应用,然后在 Xcode 中打开 Flutter macOS 目录下 Runner (Runner.xcworkspace),才能在 Xcode 中编译你的应用。
flutter build macos
open macos/Runner.xcworkspace
在 Xcode 中打开应用后,请参考 Apple 官网指南 在分发前对 macOS 软件进行公证 或 使用 App Store 分发应用程序。除此之外,你还需要阅读 授权和应用沙盒 部分,了解授权机制、沙盒和强化版运行时会如何影响分发的应用程序。
构建和发布为 macOS 应用 文档提供了将 Flutter 应用发布至 App Store 的详细步骤。
授权和应用沙盒
#默认情况下,macOS 构建已签名并使用 App Sandbox 进行沙盒化。这意味着如果你想要在 macOS 应用中配置特定的功能或服务,例如:
-
访问网络
-
使用内置相机拍摄图片或视频
-
访问文件
你必须要在 Xcode 中指定 授权文件 (entitlements)。接下来的章节,会告诉你如何实现。
配置授权
#macos/Runner/*.entitlements
文件管理了沙盒的相关配置。当你编辑这些文件时,请不要删除原始的 Runner-DebugProfile.entitlements
(支持传入网络连接和 JIT),因为调试和性能模式的正常运行需要它们。
如果你习惯于通过 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 Store 以外分发应用,你则需要对你的应用进行公证,以兼容 macOS。这便要求启用强化版运行时 (Hardened Runtime)。一旦启用,你就需要一个有效的签名证书来编译构建应用。
默认情况下,授权文件支持 JIT 调试构建,但是在使用应用沙盒时,你可能需要管理其他授权文件。如果你同时启用应用沙盒和强化版运行时,你可能需要为同一资源添加多个授权。例如,麦克风访问权限同时要求 com.apple.security.device.audio-input
(用于强化版运行时)
和 com.apple.security.device.microphone
(用于应用沙盒)。
你可以阅读 Apple 开发者官网的 强化版运行时 文档,以获取关于此章节的更多信息。
除非另有说明,本文档之所提及适用于 Flutter 的最新稳定版本,本页面最后更新时间: 2024-05-20。 查看文档源码 或者 为本页面内容提出建议。