macOS application 的三種運行模式

平時,你不會遇到這個問題,直到你需要寫一個後台程序……

我們都知道 macOS 有一個全局的 Dock,這個東西上會顯示所有正在運行的程序,但如果你的程序是一個菜單欄小程序,或者是一個……輸入法,那你肯定不想讓這個 app 的圖標顯示的 Dock 上,因為這類 app 是要持續在後台運行的。

這時候我們就可以在 Info.plist 中寫 LSBackgroundOnly 字段,這樣這個 app 就會在後台運行,沒有 Dock 圖標,也不會在 cmd+tab 的切換選項中顯示出來了。落格輸入法就是這麼做的,這也是蘋果官方示例中的配置——但這麼做長久以來伴隨著一個問題,那就是如果你這個 app 還是需要顯示必要的設置界面的話,那這個界面會永遠在所有窗口的最下方,也就是說,窗口一彈出就立即被擋住了。甚至,除了標準窗口,其他任何警告彈窗,都是無法顯示的,除非先有一個標準窗口出現,且用戶點擊了一下該窗口的任何位置……

上文這些前提導致了很多問題,我不得不內嵌另外一個 app 來作為落格輸入法的專門設置軟件,然後兩者之間使用 xpc 通信,真的是令人絕望。

直到今天 TIL,我發現原來可以使用 NS應用程序.共享.設置激活策略(.配飾) 在程序中動態改變自己的運行級別,可以動態修改自己為普通 常規的 模式,或者是後台 禁止 模式。顯然,通過看代碼名稱也明白了,原來這個後台模式,是故意不允許彈出窗口的。

顯然,如果你聲明程序是後台程序,那它的一切窗口都是不能獲得焦點的,這個問題我一直以來以為是 macOS 的Bug😅

那麼,有沒有別的方案呢?還真的有,除了上文的兩種模式外,macOS 其實還提供了介於兩者中間的模式,既像後台程序那樣不顯示圖標,又能在必要的時候獲取焦點和類似普通程序那樣彈窗:

在必要的時候動態切換程序的運行模式為 配飾 即可。


當然,如果用代碼太麻煩,我們也可以直接改 Info.plist,把 LSBackgroundOnly ,改為 LSUIE元素 ,即可。

本文由 落格博客 原創撰寫:落格博客 » macOS application 的三種運行模式

轉載請保留出處和原文鏈接:https://www.logcg.com/archives/3531.html

通過 落格博客

如非聲明,本人所著文章均為原創手打,轉載請註明本頁面鏈接和我的名字。

2 評論

發表評論

您的電子郵件地址不會被公開. 必填字段標 *