使用 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 之外分發您的 macOS 應用程式之前對其進行公證。
上述兩種流程的第一步都涉及在 Xcode 中處理您的應用程式。要能夠從 Xcode 中編譯您的應用程式,您首先需要使用 flutter build 命令為釋出版本構建應用程式,然後開啟 Flutter macOS Runner 應用程式。
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),因為它們對於 debug 和 profile 模式的正確執行至關重要。
如果您習慣於透過 **Xcode 功能 UI** 管理許可權檔案,請注意,功能編輯器僅更新兩個檔案中的一個,或者在某些情況下,它會建立一個全新的許可權檔案並切換專案以供所有配置使用。這兩種情況都會導致問題。我們建議您直接編輯檔案。除非有非常特殊的原因,否則您應始終對兩個檔案進行相同的更改。
如果您保持 App 沙盒啟用狀態(如果您計劃在 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 Developer 網站上的 App 沙盒 和 許可權。
強化執行時
#如果您選擇在 App Store 之外分發您的應用程式,您需要為您的應用程式進行公證以使其與 macOS 相容。這需要啟用強化執行時選項。啟用後,您需要一個有效的簽名證書才能進行構建。
預設情況下,許可權檔案允許除錯構建的 JIT,但與 App 沙盒一樣,您可能需要管理其他許可權。如果您同時啟用了 App 沙盒和強化執行時,則可能需要為同一資源新增多個許可權。例如,麥克風訪問將需要 com.apple.security.device.audio-input(用於強化執行時)和 com.apple.security.device.microphone(用於 App 沙盒)。
有關此主題的更多資訊,請參閱 Apple Developer 網站上的 強化執行時。