我对苹果的视频壁纸进行了逆向工程

2026-05-21 1 阅读 kageroumado
Phosphene 适用于 macOS Tahoe 的视频壁纸引擎。 Phosphene 是一款菜单栏应用 + 壁纸扩展,可将您自己的视频文件作为 macOS 桌面和锁屏壁纸播放。它插入系统的本机壁纸选择器,因此视频会与系统设置 → 壁纸中 Apple 的内置天线一起显示。它建立在苹果公司的私有WallpaperExtensionKit框架之上——苹果公司自己的Aerials也使用同样的框架——这意味着播放可以在进程外运行,在应用程序退出后仍然存在,并与操作系统级锁屏/空闲/睡眠生命周期集成。 ⚠️ 私有框架。 Phosphene 通过 dlopen 加载 WallpaperExtensionKit 并使用基于镜像的运行时自省与其 XPC 类型进行对话。苹果可能会在任何主要操作系统版本中更改这一点。该项目跟踪 macOS 26 (Tahoe)。功能 带来您自己的视频。导入 MP4 / MOV / 任何 AVFoundation 可读文件。它们显示在系统壁纸选择器中。无间隙循环。通过跨循环边界偏移 PTS/DTS 实现帧精确循环 — 无齐平、无卡顿。多显示器 + 每个空间选择。每个显示器有不同的壁纸,由 macOS 保留。电量感知播放。分级播放策略完全根据热状态、电池电量、电池电量与交流电、游戏模式和演示模式(活动/锁定/空闲)来减少工作或暂停。平滑的锁屏斜坡。启用仅在锁定屏幕上时,壁纸会在您锁定和解锁时以三次曲线缓入/缓出,与 Apple 自己的 Aerials 行为相匹配。被遮挡时暂停。检测每个显示器何时被窗口完全覆盖并暂停渲染,直到桌面再次可见。自适应变体。可选择预渲染视频的低分辨率/低 fps 变体;渲染器在每个循环边界处交换到满足当前策略的最便宜的变体。菜单栏控制。预览当前壁纸、切换暂停、切换显示、配置行为、登录时启动。要求 macOS Tahoe (26.0+)。 Phosphene 依赖于 macOS 14 中引入的壁纸扩展点,但使用 Tahoe-only SwiftUI 和 glassEffect() API。苹果硅。目标为arm64-apple-macos26.0。构建 Xcode 17+,并启用 Swift 6 严格并发。构建 git clone https://github.com/ /phosphene cdphosphene open Phosphene.xcodeproj 在 Xcode 中,选择 Phosphene 方案并运行。该项目使用同步文件系统组,因此在 Phosphene/ 或 PhospheneExtension/ 中添加/删除文件不需要 pbxproj 编辑。您需要设置一个开发团队来进行代码签名。壁纸扩展嵌入到应用程序包中,并在应用程序启动时向系统注册。使用视频壁纸启动 Phosphene。使用菜单栏图标管理库并添加一个或多个视频。打开系统设置→壁纸。 Phosphene 的视频出现在他们自己的收藏中。选择一个视频。 macOS 处理实际的壁纸分配 - Phosphene 的扩展提供框架。架构 ┌────────────────────────┐ ┌──────────────────────────┐ │ Phosphene.app │ │ PhospheneExtension.appex │ │ (菜单栏 UI) │ │ (主机:WallpaperAgent) │ │ │ │ │ │ • 库管理 │ Darwin │ • XPC 处理程序 │ │ •每个视频元数据 │ ──────▶ │ • AVSampleBufferDisplayLayer │ │ • 优化 (HEVC) │ notif。 │ • 电源/热监视器 │ │ • 首选项 │ │ • 快照生成器 │ └──────────────────────┘ └────────────────────────────┘ │ │ └──────────────┬──────────────┘ ▼ 共享应用组容器 (~/Library/Group Containers/glass.kagerou.phosphene) • 视频库 + 变体 • WallpaperPrefs.plist • BMP 快照缓存 应用程序端 ( Phosphene/ ) — SwiftUI 菜单栏应用程序。管理磁盘上的视频库,通过 VideoOptimizationService 对可选的低分辨率变体进行转码,公开首选项,并在库发生更改时发布 Darwin 通知。扩展端 ( PhospheneExtension/ ) — 当 Phosphene 壁纸处于活动状态时,在系统 WallAgent 进程内运行。在运行时加载 WallpaperExtensionKit.framework,注册为壁纸提供程序,并通过 AVSampleBufferDisplayLayer 将帧渲染到远程 CAContext 中。它接收来自 WallpaperAgent 的 XPC 获取/更新/无效/快照调用,并通过 PlaybackPolicy 路由演示模式更改。 PlaybackPolicy 是播放行为的唯一事实来源。输入(热状态、电池、演示模式、用户暂停、遮挡等)崩溃为完全/减少/最小/暂停之一。渲染器将​​策略应用于每个状态更改。 VideoRenderer 拥有解码管道。它不是 AVPlayerLayer(在远程 CAContext 内默默地失败),而是手动驱动 AVSampleBufferDisplayLayer:一个用于当前循环的 AVAssetReader,一个用于下一个循环的预加载 AVAssetReader,以及一个跨循环增长的 PTS 偏移量,以保持时间线单调递增。结果是无故障循环,无需刷新渲染器。值得了解的怪癖WallpaperSnapshotXPC swizzle。系统的快照编码器检查 type(of: c