使用 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-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 Store 分發應用,你則需要對你的應用進行公證,以與 macOS 10.15+ 相容。這便要求啟用強化版執行時。一旦啟用,你就需要一個有效的簽名證書來編譯建立應用。

預設情況下,授權檔案支援 JIT 除錯建立,但是在使用應用沙盒時,你可能需要管理其他授權檔案。如果你同時啟用應用沙盒和強化版執行時,你可能需要為同一資源新增多個授權。例如,麥克風訪問許可權同時要求 com.apple.security.device.audio-input (用於強化版執行時) 和 com.apple.security.device.microphone (用於應用沙盒)。

你可以閱讀 Apple 開發者官網的 強化版執行時 文件,以獲取關於此章節的更多訊息。