WonderBox 图标

WonderBox

一个对你的 Mac 说实话的原生系统工具箱。
内存优化真能让"已压缩"降下来,空间清理找的是几十 GB 的大头,每一个数字都能在活动监视器里对得上。

macOS 14+ Swift 6 SwiftUI Apple Silicon 与 Intel License: MIT

English · 简体中文

## 1.0 正式版 当前版本:**1.0.1**(构建 **101**)。[下载](https://github.com/jasonwong1991/WonderBox/releases/tag/v1.0.1) · [版本说明](docs/releases/v1.0.1.md)。 - **核心温度**:风扇页显示 CPU/GPU 温度摘要,并逐项展示读到的传感器。Intel 可识别的核心键显示核心序号;Apple Silicon 和未知映射保留传感器键名。不以平均值模拟每核温度;未开放的传感器显示不可用。 - **卸载监听插件**:首次启动询问是否安装,也可随时在设置中安装或卸载。插件是独立的、可由 macOS 登录项管理的辅助应用;关闭 WonderBox 后仍监听 `/Applications` 与 `~/Applications`。在 Finder 中删除应用或移入废纸篓后,会打开关联文件确认窗,支持全选/取消全选,确认后移入废纸篓。 - **浮窗增强**:菜单栏/Dock 快捷浮窗补齐 CPU/GPU 温度及一键清理的预计可回收量(约值,含原有默认清理分类,实际释放可能不同),清理后重新估算。 - **自动清理**:默认关闭;首次打开空间清理时询问,支持按缓存阈值(128 MB–100 GB)、时间间隔(1 小时–30 天)或任一条件触发。可在空间清理页和设置中配置、开启或关闭。 ### 1.0.1 卸载体验修复 - 主界面和监听弹窗都有全选/取消全选,后台测量大小不会覆盖勾选。弹窗先显示文件,大小随后补齐;确认删除不再重复扫描所有关联位置。 - 应用列表不再先递归计算每个 `.app` 的完整大小;卸载完成后只更新受影响的应用,不重扫全部应用。 - 两个卸载入口统一先使用 WonderBox 自身的移入废纸篓 API,普通失败才交给 Finder。Cookies 权限拒绝不会再重复请求管理员鉴权;界面会指向当前运行副本的完全磁盘访问设置。目录读取失败也不再生成猜测的 Cookies 文件。 - **更新后请在设置中点一次“重启插件”**,让已运行的监听进程使用新版本;待确认的卸载记录会保留。 ### 后台功能与清理范围 卸载插件改用 FSEvents 目录事件通知,并保留每 30 秒一次的兜底检查。书签确认应用已在废纸篓时立即排队提示,不再固定等待 30 秒;仅发现路径消失而未确认进入废纸篓时保留 8 秒替换保护期。改名、移动和重复安装仍会被区分。它不会删除文件,也不会请求管理员权限。原应用仍在运行、恢复或重新安装时,清理被阻止;无法读取目录时不把它当作卸载证据。系统可能要求在“系统设置 → 通用 → 登录项与扩展”批准插件。插件只在用户登录期间运行;应用被永久删除时,部分组件身份可能缺失,扫描会给出覆盖范围提示。 自动清理每 5 分钟检查一次,**只在 WonderBox 运行期间**执行,关闭主窗口但保持菜单栏驻留仍有效;完全退出后暂停,下次启动继续按保存条件检查。需要登录后自动运行时,请同时开启“登录时启动”。自动清理仅包含已识别且未运行应用的可重建缓存,跳过未知归属、符号链接、聊天缓存、系统缓存、下载、备份、关联应用数据和废纸篓;与其他清理任务互斥,每项处理前再次检查运行状态,关闭开关后停止后续项目。 插件注册必须使用完整 `.app` 包(`./scripts/package_app.sh`),不能以 `swift run` 代替。发布的安装包仍使用 ad-hoc 临时签名,尚未公证,详见[分发说明](docs/DISTRIBUTION.md)。 ![WonderBox 概览页,显示 CPU、内存、磁盘、网络、电池与运行时间](docs/screenshots/zh/overview.png) > 扫描、分析与诊断日志均保留在本机。检查更新会连接 GitHub;日志仅在你手动导出并发送后共享。 ## 为什么是 WonderBox 多数"Mac 清理工具"给你一个漂亮的绿色大数字,然后指望你别去核对。WonderBox 反过来做: - **内存优化真正作用于已压缩内存。** `purge` 只会丢弃文件缓存,所以依赖它的工具永远动不了"已压缩"那一栏。WonderBox 的 root helper 发出的是 macOS 自己在内存紧张时使用的内核级内存压力广播:每个运行中的 App 都会收到通知并释放缓存,缓存背后的压缩页也随之释放。完成后按类别给出前后对比,并点名哪些 App 做出了响应。 - **按 App 归因的内存占用,可以直接下手。** 子进程会合并到宿主 App(Chrome 的 40 个渲染进程只显示一行),并估算每个 App 有多少内存正躺在压缩器或交换空间里。同一行即可退出或强制退出。 - **空间清理找的是几十 GB,不是几十 MB。** 包管理器缓存、Chromium/Electron 网页缓存、沙盒容器缓存、模拟器与 DeviceSupport 文件——这些才是真正塞满开发者硬盘的地方。 - **诚实的数字。** 体积统计超时的项目以 `≥` 标注为下界。结果只说实际发生了什么,没变化就直接说没变化。 - **靠结构保证安全。** 每一次删除都要通过按类别定义的根目录白名单与路径形状校验。用户数据(聊天记录数据库、文档、Docker 虚拟磁盘、工具链)从一开始就不在候选范围内。不是可重建缓存的东西一律移入废纸篓。 ## 功能 ### 内存 ![内存页:活动监视器同款分类、内存压力等级、按 App 的物理占用排行](docs/screenshots/zh/memory.png) - 与活动监视器一致的分类——App 内存、联动内存、已压缩、缓存文件、可用——外加交换空间用量与内核内存压力等级 - 按 App 汇总的物理占用排行,标注每个 App 已压缩或交换的份额,支持退出与强制退出 - 一键优化:系统级内存压力广播 → 文件缓存清理,输出逐类别的前后对比报告 - 概览页的健康横幅同时反映内存压力,而不只是温控状态 ### CPU 与 GPU - 全宽曲线展示最近 60 秒,按真实时间滚动,并显示时间和百分比刻度。GPU 数据缺失和采样中断不会画成空闲时间。 - 按应用汇总实时占用排行,包含辅助进程,每 3 秒刷新;支持搜索、退出与强制退出 - CPU 与活动监视器采用相同口径:占满一个核心为 100%,多核应用可超过 100% - GPU 进程占用来自驱动提供的上下文计数器;不支持的驱动显示 `—`,而非假定为零。并行上下文合计占用与整机 GPU 利用率并非同一指标 - 运行时间包含休眠,与系统信息中的「启动后的时间」一致 ### 空间清理 应用缓存明细按应用名称、图标和缓存总量展示,展开后勾选具体目录。支持搜索;全选/取消全选仅影响当前可见结果。「完成」保存修改,「关闭」或 Escape 保留原选项。 新增独立的微信、企业微信缓存类别,标准和深度扫描均可使用,默认不勾选。仅列出明确的应用/网页缓存目录,不列出聊天数据库和下载附件;缓存移入废纸篓,清理前需退出相关应用。移动每个缓存前再次检查后台辅助进程和确认后才启动的应用。覆盖常规缓存、沙盒与共享容器、WebKit/Qt 配置目录及已知的旧版账号缓存布局。 ![深度清理,显示包管理缓存与浏览器缓存](docs/screenshots/zh/cleaner-deep.png) **标准扫描** — 用户缓存(含沙盒 App 容器)、日志、Xcode DerivedData、超过 7 天的安装包、废纸篓。 **深度清理** 额外覆盖: | 类别 | 覆盖范围 | | --- | --- | | 包管理缓存 | npm、pnpm、yarn、bun、uv 及其他 `~/.cache` 下的工具、Cargo registry、Go modules、Gradle、Maven、CocoaPods——只删下载缓存,工具链与已安装版本绝不触碰 | | 浏览器与 Electron 缓存 | 任意 Profile 或 Electron 用户数据目录中的 Chromium `Cache`、`Code Cache`、`GPUCache`、Service Worker `CacheStorage` 等;对应 App 运行中时自动跳过 | | 开发深层缓存 | 模拟器缓存、iOS/watchOS/tvOS DeviceSupport、文档缓存、Previews 模拟器设备 | | 应用残留 | 已卸载 App 遗留的数据(90 天阈值 + bundle id 启发式判断) | | 设备备份、未完成下载 | 本机 iPhone/iPad 备份;超过 7 天的 `.download`/`.crdownload`/`.part` 文件 | 每个类别都能展开到具体项目,保留这个工具的缓存、删掉那个工具的: ![包管理缓存类别内的逐项选择](docs/screenshots/zh/cleaner-detail.png) ### 应用卸载 关联文件按用途分组为可展开的文件夹,支持分类勾选与文件夹内容预览。先尝试普通用户权限;失败项目合并交给 Finder 的“移入废纸篓”操作(Apple Events)重试,由 Finder 处理必要的授权。卸载不再安装或授权后台服务,不保存密码。 另外识别应用最近文档记录、自动保存、默认 XDG 数据目录、共享更新/崩溃缓存中的精确产品子目录,以及标识符匹配的外置插件。恢复数据、跨平台共用数据和插件默认待确认。未全选时,详情和卸载确认都会提示保留的关联项目数量与大小;「返回检查」保留原勾选,不自动全选。调研依据、匹配规则和排除范围见[关联文件覆盖矩阵](docs/RELATED_FILES.md)。 关联发现依据应用标识符、原始/本地化名称,识别 `~/Library` 下精确同名的自定义目录、日志和偏好设置;同时检查内嵌 Helper、XPC、扩展及登录项的标识符,从代码签名读取应用组声明,识别可执行路径指向该应用的启动配置。Application Support 在厂商目录下一层用精确产品路径探测匹配的子文件夹,不枚举其他应用的数据内容,不勾选整个厂商目录。共享应用组、独立标识符的组件、声明的特权辅助程序及厂商子目录匹配会注明关联依据,默认不勾选,供确认后选择。没有逐个应用维护的白名单;六种产品样本覆盖不同名称、标识符及存储布局,并验证近似名称、兄弟应用和符号链接等反例。 Electron 应用还通过有限读取根 `package.json`(普通文件或 ASAR 封装)补充运行时产品名称,并检查其声明的启动文件中、临近 `userData` 获取位置的明确旧目录迁移引用。对应的 Application Support 旧版产品目录会列出并注明依据,默认不勾选,避免影响仍在使用的其他版本;不是按名称前缀批量删除。不会搜索依赖包、静态资源或 source map,不执行 JavaScript,不解包资源。读取上限为 2 MiB 归档索引、64 KiB 包元数据和 1 MiB 启动文件;忽略异常偏移、链接、路径穿越和超限文件。应用本体移走后仍保留这些名称用于复查。 排除 Mail、Messages、Keychains 等 macOS 共用目录,不沿符号链接扫描。扫描依据明确的标识和关联证据,并非对任意自定义路径的完整性保证。应用列表与大小排序显示“应用本体 + 已发现的关联数据”(包括未勾选项),详情显示拆分占用。关联列表先显示,大小随后统计;卸载操作不等待统计完成。自动统计采用单个低优先级任务,每个应用共享 60ms / 1,500 项的预算,不再完整遍历每个大型聊天或缓存目录。`≥` 表示至少占用,尚未测量的目录明确显示“待统计”。详情中的“计算完整大小”仅统计当前应用,支持停止,切换应用或页面也会取消旧任务。列表和详情共享会话内缓存,短期失效,刷新或卸载时清空。界面批量更新,缓存排序及汇总结果,目录去重改为 O(n log n),减少主线程重复运算。列表汇总对共用及嵌套的数据目录去重;勾选项只影响移入废纸篓的大小,不改变已发现的应用总占用。 空间清理的项目弹窗使用一个「全选 / 取消全选」切换按钮;「完成」保存更改,「关闭」或 Escape 放弃草稿并保留原选项。ZIP 仅在包含应用、安装包或磁盘映像时归类为安装包。 点击项目弹窗的「名称」或「大小」表头即可排序,应用分组与展开的缓存文件夹一起生效;大小首次点击从大到小,再次点击反向。排序保留勾选和展开状态,未知大小始终排在最后。 设置中的独立「开机启动」区域可配置 WonderBox 自身登录时启动,显示待批准状态,并提供系统登录项管理入口;从系统设置返回时自动同步状态。 ![应用卸载与关联文件](docs/screenshots/zh/applications.png) 盘点 `/Applications` 与 `~/Applications`,从 Spotlight 读取体积、安装日期与最近使用时间;大型/久未使用筛选;逐 App 列出关联的缓存、偏好设置、容器与保存状态;全部移入废纸篓,随时可恢复。 沙盒容器通过应用标识符与容器元数据匹配,支持 UUID 命名;读取受限会提示权限问题,不再静默当作没有关联文件。选择废纸篓里的 App 时,仅移除关联文件,不重复移动应用本体。卸载后检查已选路径并重新扫描,保留失败项目供重试,新发现的残留默认不勾选。卸载前需退出应用,避免重新生成数据。 卸载失败显示系统实际返回的错误,保留未移除项目供重试,并提供“详细信息”和“在 Finder 中显示未移除项目”。取消系统操作后不会自动再次请求授权。需要时由系统请求控制 Finder 的自动化权限;被拒绝时提示打开“自动化”设置,而不是要求重新开启完全磁盘访问。 ### 磁盘分析 工具栏刷新按钮与 **⌘R** 刷新当前页面,不再仅更新概览。CPU/GPU、内存会同时更新系统指标和应用排行;卸载页重扫应用及当前应用的关联文件;空间清理只重扫、不执行清理;磁盘分析忽略缓存并重扫当前目录。设置页刷新权限、登录项、日志大小和更新状态。刷新不会启动内存优化、调整风扇模式或延长保持唤醒时间。 进入目录先显示文件列表,后台最多四个可取消任务逐项补充目录大小,不再阻塞导航。返回已浏览目录可使用 60 秒缓存,「重新扫描」强制刷新。尚未统计完整的总量显示为下界;不自动遍历云同步目录。 ![磁盘分析,按大小列出主目录下的子项](docs/screenshots/zh/storage.png) 逐层深入任意文件夹,体积并行计算;按大小/名称/日期排序,在 Finder 中显示或将所选项目移入废纸篓。云同步目录不参与体积统计,扫描绝不会触发下载。 ### 风扇控制、保持唤醒、菜单栏
风扇页:实时转速仪表与控制模式 保持唤醒页:时长与显示器选项
![菜单栏面板:CPU、内存、磁盘、风扇转速、保持唤醒与快捷操作](docs/screenshots/zh/menubar.png) - 从 AppleSMC 读取实时风扇转速;在开放了风扇写入的机型上提供静音/均衡/强劲/自定模式(含 Apple Silicon 的 `Ftst` 解锁),随时可恢复自动 - 保持唤醒支持 30 分钟 / 1 小时 / 2 小时 / 持续,可选同时保持显示器点亮,基于公开的 IOKit 断言接口 - 菜单栏面板:CPU、内存、磁盘、风扇转速、唤醒开关、内存优化与一键清理,不用打开主窗口 - 在 **设置 → 常驻 → 菜单栏图标** 中选择 **彩色** 或 **单色**。默认保留原有彩色图标,单色图标跟随系统菜单栏外观;切换立即生效,重启后保留选择。 - 跟随系统 / 浅色 / 深色外观,四种强调色,登录时启动 ![设置页:外观、语言、菜单栏、登录启动与权限状态](docs/screenshots/zh/settings.png) ### 更新与诊断 - **设置 → 软件更新**,或菜单 **WonderBox → 检查更新…**:检查 GitHub 最新正式版、查看更新说明,并选择 ZIP 保存位置。默认开启自动检查,每 24 小时最多尝试一次(失败也计入),可在设置中关闭。API 限流时,使用 GitHub 官方最新版跳转与 `SHA256SUMS` 备用检查;不发送扫描结果或诊断日志,不使用账号、令牌或持久化 Cookie。 - 下载支持进度、取消和重试,校验文件大小与 GitHub 摘要或发布版 `SHA256SUMS` 中的 SHA-256 后才保存;采用原子替换,保留 macOS 下载隔离标记,不自动解压或运行。下载后退出 WonderBox,解压并手动替换 App。此功能用于直接分发版本,App Store 版本由商店更新。 - **设置 → 诊断**:默认记录操作结果与数字错误码,帮助定位权限、风扇读取、清理和更新异常;关闭记录即清除本地日志。最多 4 个轮转文件,每个 512 KiB,总上限 2 MiB,逐条记录最多保留 7 天。不记录高频监控数据、文件名、路径、用户名、账号信息、命令、令牌或文件内容。日常空间清理排除 WonderBox 自身的诊断日志。 - **导出日志…** 将日志和应用/macOS 版本、处理器架构打包为 ZIP;关闭记录时仍可导出基本版本信息。请检查后手动附到问题反馈中,不自动上传,也不接入遥测或崩溃报告服务。**清除日志…** 仅清除本地记录,不删除之前导出的 ZIP。 ## 安装 运行要求:macOS 14 或更新,Apple Silicon 与 Intel 均可。 **直接下载**:到 [最新 Release](https://github.com/jasonwong1991/WonderBox/releases/latest) 下载 `WonderBox-x.y.z.zip`,解压后把 `WonderBox.app` 拖进「应用程序」。 发行版为 ad hoc 签名、未经 Apple 公证,首次打开会被 Gatekeeper 拦截。可以右键 App → 打开,然后在「系统设置 › 隐私与安全性」中点「仍要打开」;或者一次性清除隔离标记: ```bash xattr -dr com.apple.quarantine /Applications/WonderBox.app ``` **从源码编译**(需要 Xcode 16 或更新): ```bash git clone https://github.com/jasonwong1991/WonderBox.git cd WonderBox swift build swift test ./scripts/package_app.sh open build/WonderBox.app ``` Swift Package 会构建 `WonderBox` 主程序、两个维护 helper 和可选的卸载监听登录项。`package_app.sh` 生成本地签名的 `build/WonderBox.app`,内含生成的图标、编译好的字符串目录与打包好的 helper;`UNIVERSAL=1 ./scripts/package_app.sh` 生成 Release 使用的 Apple Silicon + Intel 通用二进制。 ## 多语言 WonderBox 内置英文与简体中文,默认跟随系统语言;也可以在「设置 › 语言」中单独为本应用指定。所有文案集中在一个字符串目录 `Sources/WonderBox/Resources/Localizable.xcstrings`,源语言为英文。 新增一种语言: 1. 用 Xcode 的 String Catalog 编辑器打开 `Localizable.xcstrings`(以及 `InfoPlist.xcstrings`),或直接编辑 JSON,为每个 key 的 `localizations` 添加新的语言代码。 2. 把语言代码加进 `scripts/sync_localization.py` 的 `LANGUAGES`,以及 `Sources/WonderBox/Core/Localization.swift` 中的 `AppLanguage` 枚举,这样它会出现在设置页的选择器里。 3. 运行 `scripts/sync_localization.py --check`,存在未翻译的 key 时会失败;`swift test` 也会检查同样的内容以及格式占位符是否一致。 不带参数运行 `scripts/sync_localization.py` 会让编译器列出源码中所有可本地化的字符串并把新 key 写入目录,不需要手工维护 key 列表。 ## 权限 WonderBox 只在你第一次用到某个功能时,索取那个功能刚好需要的权限: | 功能 | 权限 | 时机 | | --- | --- | --- | | 系统监测、保持唤醒、应用盘点、标准清理 | 无 | — | | 废纸篓容量与清空 | 自动化(Finder) | 第一次清理扫描 | | 完整主目录扫描 | 完全磁盘访问(可选,用户自行控制) | 引导页或设置页 | | 风扇控制、内存优化 | 安装或更新共享助手时需要管理员授权 | 第一次使用特权操作 | | 受保护应用卸载 | macOS 的 Finder 式废纸篓操作,必要时由系统请求授权 | 普通移除失败时 | | `/Library/Caches` 清理 | 每次执行输入管理员密码 | 选中该类别时 | helper 守护进程通过 root 持有的 Unix socket 通信,先验证客户端签名与用户 ID,再处理风扇、内存维护及受路径限制的废纸篓请求,不执行客户端提供的 Shell 命令。安装或更新助手、App 临时签名身份改变时需要管理员授权。 ## 发行档位 核心监测与保持唤醒功能只用公开 API。应用与清理操作使用公开的 Foundation API,但对用户 Library 的广泛访问受 App Sandbox 限制。 - **Direct**(`package_app.sh` 产出):内置 `WonderFanHelper`;helper 守护进程(协议 v6)负责风扇写入、内存压力广播/缓存清理。卸载改用系统废纸篓操作。可开启完全磁盘访问以进行广泛的本机扫描。 - **App Store**:启用 `WonderBox-AppStore.entitlements`,剔除 fan helper 与 CSMC 源码,保留用户选择的文件访问权限。广泛的清理类别必须改用文件夹选择 + 安全作用域书签,或直接禁用。 能力矩阵与发布检查清单见 [`docs/DISTRIBUTION.md`](docs/DISTRIBUTION.md)。 ## 品牌素材来源 WonderBox 的应用图标与菜单栏图标均为原创几何图形,完全由本仓库中的 `scripts/generate_icon.swift` 与 `MenuBarAppIcon` 生成,不包含任何第三方 Logo、素材库图片或复制的图像资源。SF Symbols 仅作为原生 macOS 界面符号在应用内使用。截图中出现的第三方应用图标归各自所有者所有。 ## 许可证 [MIT](LICENSE)