Weatherling

部落格 · · 更新於 · 作者:Matt Senter

視窗後方的雨,無需螢幕錄影權限

Weatherling 無需螢幕錄影或輔助使用權限,就能讓雨落在視窗後方。它從不檢視螢幕內容,而是使用 macOS 向所有 App 公開的視窗輪廓,並在 Apple App Sandbox 中執行。只有在您開啟可選的天氣同步時才會聯網,也只有在您選擇用位置同步天氣時才會請求位置權限。

這聽起來可能難以置信。看到雨滴落在標題欄、沿側邊流下,再鑽到前方視窗背後,您自然會好奇 App 如何知道螢幕上有什麼。簡短的回答是:它不知道。它只知道物體的位置,而這已經足夠繪製雨景。

視窗幾何資訊,而非視窗內容

每個 Mac App 都能向 macOS 請求目前螢幕視窗列表。Weatherling 使用的介面是CGWindowListCopyWindowInfo,視窗管理器和截圖工具也從這個公開介面開始。它只讀取每個視窗的以下五項資訊:

  • 邊界。 視窗的位置和大小。
  • 層級。 判斷是普通視窗、選單,還是系統介面的一部分。
  • 透明度。 判斷視窗實際可見,還是完全透明。
  • 視窗編號。 用來跟蹤移動視窗的識別符號。
  • 所屬程序 ID。 一個數字,僅用於區分 Weatherling 自己的視窗與您的視窗。

列表按從前到後排列,這也是關鍵。當雨滴經過前方視窗邊緣、落在更後面的視窗上時,只需繼續檢查列表中的下一個輪廓。因此,無需看到任何一個視窗的畫素,雨也能出現在一個視窗前方、另一個後方。

同一列表還提供視窗標題、所屬 App 名稱和共享狀態。Weatherling 從不讀取這些欄位。雨景用不到它們,不讀取也是無需權限的原因之一。

為什麼讀取視窗標題需要螢幕錄影權限

從 macOS Catalina 起,其他 App 的視窗標題被視為螢幕內容。標題可能包含郵件主題、文件名或正在閱讀的網頁,因此 macOS 只向獲准螢幕錄影的 App 提供標題。沒有權限時,標題欄位返回空值。

這條界線決定了整個設計。如果 App 想針對郵件和程式碼編輯器採取不同行為,就需要標題或螢幕捕獲,並必須請求權限。Weatherling 不關心視窗是什麼,只關心它在哪裡,因此無需權限提示。也不請求輔助使用權限,因為它不讀取其他 App 內部資訊,不控制它們,不監控鍵盤、不存取輸入、不執行自動化。

在沙盒中執行,僅新增少量權限

Mac App Store App 執行於 Apple App Sandbox,透過權限宣告申請額外能力,例如網路、攝像頭或容器外檔案存取。Weatherling 宣告瞭com.apple.security.app-sandbox 和 com.apple.security.files.user-selected.read-write。後者允許將分數卡片儲存到您在「儲存」對話方塊中選擇的檔案。自 1.6 版起,App 還宣告瞭傳出網路連線和位置權限,二者僅供可選的「與你的天氣同步」使用。(Apple 簽名還會為每個 App Store App 加入 App 與團隊識別符號,這些不授予額外能力。)

沒有宣告的能力同樣重要。未獲網路客戶端權限的沙盒 App 無法建立傳出連線,而在 1.6 版之前,Weatherling 並沒有這項權限。現在擁有它,也只是為了在您開啟同步時查詢天氣;關閉同步時,App 不發出任何網路請求。沒有帳號、分析或崩潰報告服務。雨勢、風力等設定儲存在 Mac 上 App 自身的沙盒儲存中。

雨聲也是如此。錄音隨 App 打包,通話時會淡出。Weatherling 透過檢查是否有 App 正在使用麥克風來識別通話,macOS 只報告裝置的「是/否」狀態。它從不開啟麥克風、錄製音訊或請求麥克風權限。

親自驗證

無需只憑信任。以下三項檢查約花一分鐘:

  1. 開啟「系統設定 > 隱私與安全性 > 螢幕錄影」(新版 macOS 中稱為「螢幕與系統音訊錄製」)。Weatherling 不在列表中,因為它從未申請。
  2. 在同一區域檢查「輔助使用」和「麥克風」,它也不在這兩個列表中。
  3. 在終端執行codesign -d --entitlements - /Applications/Weatherling.app。除了 Apple 為所有 App Store App 加入的 App 和團隊識別符號外,權限包括 App Sandbox、用於儲存分數卡片的使用者所選檔案存取,以及自 1.6 版起為可選天氣同步新增的傳出網路連線、位置和 WeatherKit。只有當您選擇使用 Mac 的位置而不是輸入地點時,才會用到位置資訊,且 macOS 會先徵得您的同意。

如果未來版本需要更多權限,您會先看到提示。macOS 不允許 App 悄悄獲取這些能力。

跟蹤視窗需要多少資源

讀取視窗列表開銷很小。視窗靜止時,Weatherling 約每秒查詢十次;移動時會暫時提高頻率,讓水流跟上拖移的視窗。兩次查詢間只保留輪廓,視窗關閉時即清除。

桌面裝飾不應讓您在隱私上妥協。開啟雨景,調好氛圍,繼續原來的事情。Weatherling 無需知道您在做什麼。

無需安裝即可在這裡體驗:首頁,可拖移視窗展示同樣構想的瀏覽器版本。App 儲存與不儲存哪些資訊,請見隱私政策;為什麼值得營造這樣的雨景,請見為什麼桌面雨景會讓人平靜.

下一步