我的 MacBook Pro 13 英寸带一条 Touch Bar。用得最多的其实只有一件事:让它一直显示 Dock 里的 App,点一下就切过去。听起来很简单,但我试过的几个现成工具,包括 Pock 和它的第二版,都能做到,却都不够稳:用着用着 Touch Bar 上的内容消失了,或者点了没反应,系统更新之后还可能整个失效。

问题不在于它们做得不好,而在于它们做的事情太多:天气、音乐、电量、各种小组件和插件,而我只需要其中的一件。所以这个项目的起点不是“做一个更强的 Pock”,而是反过来:只做这一件事,并且把稳定放在第一位。

目标:只做一件事,并且做稳

写下来的目标只有五条。只做一件事:显示 Dock 里的 App,点击切换,不做小组件。稳定:睡眠唤醒、锁屏解锁、系统的 Touch Bar 进程重启之后能自己恢复,系统接口变了也不能崩。高效:空闲时不占 CPU,不轮询。原生:Swift 加 AppKit,没有第三方依赖。能分发:必要时可以打包给别人用,但不要求上 App Store。

这五条里,“稳定”和“高效”是我对现有工具最直接的不满,也是后面每一个技术决定的判断标准。

简洁、优雅、高效:判断要不要加功能的三个词

做了一段时间之后,我把这个软件的特点归纳成三个词:简洁、优雅、高效。它们不是宣传语,而是每次遇到“要不要加这个功能”时用来判断的标准。

简洁:只做 Touch Bar 上的 Dock,不做小组件和插件,设置只有菜单里的几个开关。后来我把 Touch Bar 最右边一个“收起十秒”的按钮也去掉了,因为菜单里已经有开关,不必再占一块地方。优雅:外观和行为向系统 Dock 看齐,图标顺序、运行中的小圆点都和 Dock 一致,用系统自带的控件,不自己造。高效:事件驱动,没有任何定时轮询,空闲时什么都不做。

明确不做什么

同样重要的是不做什么。天气、音乐、电量这类小组件不做;不上架 Mac App Store,因为要用私有接口;不做窗口缩略图和按窗口切换,那是 AltTab 这类工具的事;也不自己实现亮度和音量控制,系统控制条和控制中心已经有了。

把“不做”的清单写下来很有用:后面每次想往里加东西,先回来对照一遍,多数时候答案就是不加。

使用环境:这台机器上的设置,决定了后面很多发现

开发和实测都在同一台机器上:MacBook Pro 13 英寸(M1,型号 MacBookPro17,1),macOS 27.0,单显示器,3 个桌面。有几项设置会直接影响行为:Touch Bar 设成“展开的控制条”,开着台前调度,系统里“切换到有该 App 窗口的空间”保持默认。

这些设置后面每一个都出现过:Touch Bar 的显示模式决定了只能用占满整条的方式显示,台前调度让最小化窗口的方案失效,桌面切换的那项设置则让我发现系统只对用户亲手的点击生效。把环境写下来,才知道哪些结论是普遍的,哪些只在这台机器上成立。

和 AI 编程助手一起做:先验证,再动手

整个项目是和 Claude Code 协作完成的。这里有一个我觉得值得记下来的做法:没有让 AI 一上来就写一个完整的 App,而是先让它做调研和可行性验证,确认“后台 App 能不能让 Touch Bar 常驻显示”这个最大的不确定性,再开始写正式的代码。这一步的过程放在下一篇。

需求是怎么一步步加出来的

需求不是一次定下来的,而是在使用中逐步补充。先是常驻显示 Dock 里的 App,点击切换,做成一个能在菜单里开关的菜单栏 App;接着是窗口在别的桌面时,点击应该切到那个桌面;然后是长按退出、双击隐藏;再然后去掉 Touch Bar 最右边的按钮;最后是打包成 DMG,整理说明和文档。

每一步都对应开发日记里的一篇,也都是先有一个具体的使用场景,再决定做不做、怎么做。