逆向工程 macOS Tahoe 的影片桌布
Apple 在近期 macOS 版本中引入的電影級「Aerials」改變了桌面體驗,但系統仍然是封閉的。使用者無法在系統桌布選擇器中原生加入自己的影片檔案。於是出現了 Phosphene,這是一個由開發者 kageroumado 所打造的開源專案,透過逆向工程底層系統框架,將自訂影片桌布帶入 macOS Tahoe。
核心挑戰:WallpaperExtensionKit
Phosphene 並非僅在桌面上疊加影片;它直接整合到原生 macOS 桌布選擇器 System Settings → Wallpaper 中。為了達成此目標,開發者必須深入 WallpaperExtensionKit.framework,這是支援系統內建 Aerials 的 Apple 私有框架。
由於此框架是私有的,沒有公開的 SDK。Phosphene 採用了多種進階技術與作業系統溝通:
- 動態載入:應用程式使用
dlopen在執行時載入私有框架。 - 執行時內省:由於 XPC 類型(應用程式與系統之間的通訊協定)未在公開標頭中定義,Phosphene 使用 Swift 的
Mirror反射來解析並與這些類型互動。 - 方法交換:為防止鎖定畫面在過渡期間變成灰色,開發者必須對
WallpaperSnapshotXPC編碼器進行 method swizzling。系統預期的是特定的編碼類型 (NSXPCCoder),但實際的編碼器是其子類;若未進行此執行時修改,快照將無法編碼。
系統架構
Phosphene 分為兩個主要元件,透過共享的 App Group 容器進行通訊:
1. 功能列應用程式 (Phosphene.app)
它作為管理層,負責影片庫、管理中繼資料,並執行 HEVC 最佳化。它還包含一個 VideoOptimizationService,可預先渲染較低解析度或較低 fps 的影片變體,以節省系統資源。
2. 桌布擴充套件 (PhospheneExtension.appex)
它是 WallpaperAgent 的宿主。以獨立進程執行,意味著即使主功能列應用程式退出,桌布仍會持續播放。此擴充套件使用 AVSampleBufferDisplayLayer 將實際渲染輸出至遠端的 CAContext。
為效能與電池壽命而設計的工程
在實作影片桌布時,最重要的挑戰之一是對電池與散熱效能的影響。Phosphene 實作了精密的 PlaybackPolicy,確保桌布不會耗盡筆記型電腦電池或導致熱節流。
具電源感知的播放
PlaybackPolicy 作為唯一的真實來源,將多種輸入——熱狀態、電池電量、交流電狀態、遊戲模式與展示模式——彙整為四種狀態:full、reduced、minimal 或 paused。
智慧遮蔽偵測
為節省 GPU 時間,Phosphene 偵測所有螢幕是否被視窗完全覆蓋。當桌面不再可見時,渲染器會完全暫停,直至桌面再次顯示。
無縫循環
標準的 AVPlayerLayer 常在遠端 CAContext 中失效。為解決此問題,開發者實作了手動解碼管線。透過為當前循環使用一個 AVAssetReader,為下一循環預載另一個,並套用跨循環增長的 PTS(呈現時間戳記)偏移,引擎得以實現逐格精準、無卡頓的循環,且不需清除渲染器。
技術需求與限制
對於想要建置或安裝 Phosphene 的使用者,因依賴最新 macOS API,需求相當嚴格:
- 作業系統:macOS Tahoe(26.0 以上),因為它依賴 Tahoe 專屬的 SwiftUI 與
glassEffect()API。 - 硬體:Apple Silicon(
arm64-apple-macos26.0)。 - 工具:Xcode 17 以上,啟用 Swift 6 嚴格併發。
結論
Phosphene 展示了逆向工程 Apple 私有框架的典範。雖然作者最初打算將其作為商業產品,但此專案已開源,讓人窺見 macOS 如何處理高階視覺效果,並為使用者提供一種自訂桌面的方式,達到 Apple 原生無法提供的精細度。