逆向工程 macOS Tahoe 的视频壁纸
Apple 在最近的 macOS 版本中引入了电影级的 “Aerials”,彻底改变了桌面体验,但系统仍然是一个封闭的生态。用户无法在系统壁纸选择器中原生添加自己的视频文件。于是出现了 Phosphene,这是开发者 kageroumado 发起的开源项目,逆向工程底层系统框架,以在 macOS Tahoe 上实现自定义视频壁纸。
核心挑战:WallpaperExtensionKit
Phosphene 并非仅在桌面上叠加视频;它直接集成到原生 macOS 壁纸选择器 系统设置 → 壁纸 中。为实现此功能,开发者必须深入 WallpaperExtensionKit.framework,这是驱动系统自带 Aerials 的私有 Apple 框架。
由于该框架是私有的,暂无公开的 SDK。Phosphene 采用了多种高级技术与操作系统通信:
- 动态加载: 应用使用
dlopen在运行时加载私有框架。 - 运行时自省: 由于 XPC 类型(应用与系统之间的通信协议)未在公开头文件中定义,Phosphene 使用 Swift 的
Mirror反射来解析并交互这些类型。 - 方法交换(Method Swizzling): 为防止锁屏在切换时变灰,开发者必须对
WallpaperSnapshotXPC编码器进行交换。系统期望特定的编码器类型(NSXPCCoder),但实际的编码器是其子类;若不进行此运行时修改,快照将无法编码。
系统架构
Phosphene 被拆分为两个主要组件,通过共享的 App Group 容器进行通信:
1. 菜单栏应用 (Phosphene.app)
它充当管理层,处理视频库、管理元数据并执行 HEVC 优化。它还包含一个 VideoOptimizationService,可预渲染低分辨率或低帧率的影片变体,以节省系统资源。
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 原生不支持的精度自定义桌面的方法。