苹果迷苹果迷  2026-11-12 22:09 苹果家园 |  隐藏边栏 |   抢沙发 |  2 
文章评分 0 次,平均分 0.0 :
导语: 开发者 Andy Gao 开源了 AirPointer,把合盖的 AirPods 充电盒变成 Mac 的指针:握着盒子移动,光标跟着走,敲正面就是点击。项目用 Swift 写,MIT 许可,要先把程序拖进辅助功能名单。代价是每次连接断一下蓝牙音频,会话在合盖约三十分钟后自动结束,目前只在 AirPods Pro 3 加 macOS 26 的组合上测过一对。

11 月,开发者 Andy Gao 在 GitHub 上放了一个叫 AirPointer 的项目,做的事一句话能说完:把合上的 AirPods 充电盒当鼠标用。握着盒子在屏幕前移动,Mac 上的光标跟着走;敲一下盒子正面,等于点一下左键。

项目用 Swift 写的,MIT 许可,11 月 6 日建仓,到 11 月 9 日最后一次提交,拿到 381 个星标、51 次 fork,还挂着 14 个未关闭的 issue。

演示视频里的一帧:一台 MacBook 屏幕上开着 X 的首页,浏览器里是 For you 信息流与右侧的今日新闻栏,画面右侧一只右手半握着合上的白色 AirPods 充电盒,盒子悬在屏幕前,正面朝外
演示视频里的一帧:一台 MacBook 的屏幕上开着 X 的首页,浏览器里是「For you」信息流与右侧的 Today's News 栏;画面右侧一只右手半握着合上的白色 AirPods 充电盒,盒子悬在屏幕前,正面朝外。

四步设置,第一步是给权限

第一次打开会走一个四步向导,每一步一个页面,顶部有进度条。

第一步 Allow,把 AirPointer 拖进辅助功能名单。Mac 上想挪光标、想模拟点击,都得过这道门,项目没有别的路可以绕。

第二步 Connect,开盖、合盖、把盒子放稳一会儿,然后竖起来。第三步 Calibrate,对着屏幕上三个点各指一次,让程序知道你的屏幕在哪个方向。第四步 Tap,敲盒子正面三次,让它认你的敲法。

第二步的说明里还有一行小字:连接期间 Mac 用不了 AirPods 的音频,通话中别连;一次会话结束会消耗盒子里存的诊断数据,并且改动一些 AirPods 的连接设置,这些改动可能留下去。

AirPointer 设置向导的头两个页面截图:左边一步叫 Let AirPointer move the pointer,正文让用户点 Allow 打开辅助功能列表并把 AirPointer 拖进去,卡片里画着辅助功能列表的示意,底部按钮是 Skip for now 与 Allow;右边一步叫 Connect your AirPods,正文让用户握好装了耳机的合盖充电盒,卡片里是一个闭合的白色充电盒,底部按钮是 Back 与 Connect
AirPointer 设置向导的头两个页面截图:左边一步标题「Let AirPointer move the pointer」,正文让用户点 Allow 打开辅助功能列表并把 AirPointer 拖进去,卡片里画着辅助功能列表的示意与 AirPointer 条目,底部按钮是「Skip for now」和「Allow ⏎」;右边一步标题「Connect your AirPods」,正文让用户握好装了耳机的合盖充电盒,卡片里是一个闭合的白色充电盒,底部按钮是「Back」和「Connect ⏎」。

盒子里的传感器是怎么被叫醒的

AirPods 合上盖子、收进盒里,耳机并没有断电。耳机里的加速度计和陀螺仪还在,蓝牙也还连着,只是平时没人去问它在什么姿态。

AirPointer 做的事,是让 Mac 主动去问。项目里有两个辅助程序:ClosedCaseRestore 负责把普通蓝牙链路拉起来,ClosedCaseMotion 负责开传感器、按节奏发请求让闭合的盒子保持唤醒,再把姿态数据通过管道送进主程序。

主程序每秒给辅助程序发一次心跳。主程序退出,辅助程序就关掉传感器、放开它占着的东西,不留后台。

姿态换算成屏幕坐标在 Orientation.js 里做:盒子的朝向决定光标位置,朝屏幕哪边倾就往哪边走。点击由 ClosedCaseTap 判断——找的是「朝某个方向的一次突然位移」,找到就点一下,同时在 Mac 上放一声短响。

半小时这道坎

合盖大约 30 分钟后,会话会自己结束。运动数据停了,AirPods 也联系不上,得重新开合一次盖子才能继续。

这道限制不是程序设的。作者读了测试用的 AirPods Pro 3 的固件镜像 rkof.bin(H2,版本 9A348),在里面找到一个编号 0x63 的定时器,长度写在 0x17d326 这个地址,值 1800000 毫秒,正好 30 分钟。

计时从什么时候开始,看的是 0x17d294 处的状态检查:固件的 dock state 要等于 6,作者推测意思是「合盖放在盒中」。到点后代码跑到 0x17cddc,再查一次状态,然后调用一个不会返回的致命断言。

实测的会话结束点跟这个数字对得上,都是合盖后约 1805 秒。作者自己也写明,这是读固件加计时得出的结论,没有做实时抓包验证。他还试过一次合着盖重连,没重置这个限制。

AirPointer 的三处界面截图:左边是主窗口,标题 Pointing 上方有一枚状态胶囊,中间是带网格的深色画布与一个红色光点,下方是 Recenter、Recalibrate、Disconnect 与 Pause 按钮;中间是菜单栏面板,顶部是 AirPointer 与开关,提示按 fn 加 control 暂停,下面是同样的画布、一条从 Slow 到 Fast 的滑杆与四个菜单项;右边是屏幕顶部的刘海区域,刘海下方浮着一个白色充电盒图标与两行说明文字
AirPointer 的三处界面截图:左边是主窗口,标题「Pointing」上方有一枚写着 Pointing 的状态胶囊,正文是「Aim with the case. Tap its front to click.」,中间一块带网格的深色画布上有一个红色光点与十字准星,下方是 Recenter、Recalibrate、Disconnect 三个按钮与一个 Pause 按钮(右侧标着 fn ⌃);中间是菜单栏面板,顶部是 AirPointer 与 Pointing 胶囊、一个开关,提示语「Press fn ⌃ to pause from any app.」,下面是同样的画布、Recenter 与 Pause 按钮、一条从 Slow 到 Fast 的滑杆,以及 Open AirPointer、Calibrate...、Settings... ⌘,、Quit AirPointer ⌘Q 四个菜单项;右边是屏幕顶部的刘海区域,刘海下方浮着一个白色充电盒图标与「Pointing」「Tap the front of the case to click.」两行字。

用起来会碰到什么

暂停和继续都按 fn ⌃,任何 App 里都生效,快捷键可以在设置里改。光标原本小于 2 倍时会放大到 2 倍,暂停或断开后恢复原尺寸——这一步用了一个 macOS 的私有调用,不是公开接口。

连接那一刻蓝牙链路会断一下,音频跟着停。会话期间程序会关掉所有 AirPods 的麦克风和 Mac 的声音,同时给 AirPods 播一段听不见的静音,让音频链路保持活着;会话结束后再恢复。强退的话,下次打开程序时才恢复。

刚连上的二十秒左右光标会抖,作者说这是正常的。「放稳」那一步如果一直不过,多半是台面不够硬或者手碰到了盒子。指针卡顿,先看看有没有别的程序(OBS、浏览器通话)占着 AirPods 当麦克风。敲击不灵,去设置里跑一次 Teach Tap。

想试的话

要求写在项目的表里,只有一行是「测过」:AirPods Pro 3、macOS 26、Apple Silicon,一台 Mac 一对耳机。AirPods Pro 2 是「能识别,没测过」。构建要装 Xcode,跑 build.sh 出 app。

作者列了四种「故意没测」的情况:会话中强退、会话中睡眠唤醒、会话中断蓝牙、会话中与结束后的通话和音频。敲击识别也只在一个人的敲击习惯上调过,换个人可能要多跑几次 Tap Test(一局 75 秒)。

连不上多半是耳机被别处抢走了。作者给的解法是把 iPhone 的蓝牙关掉,因为 iPhone 会攥着已经配对的 AirPods 不放。

数据都存在自己机器上:~/Library/Application Support/AirPointer/ 下面存着选中的耳机、屏幕边缘、传感器校准值、最近十次会话的日志与敲击测试分数,不往外发。

项目页里还挂了一个用这套东西玩的小游戏,浏览器里打鸭子。作者放它出来是为了说明这东西能干什么——用盒子当指针,比用它当鼠标更贴切。

本站自制要点卡:AirPointer 的门槛与硬限制,设备要与 Mac 配对且构建要装 Xcode,测过的组合只有 AirPods Pro 3 加 macOS 26 加 Apple Silicon,会话在合盖约 30 分钟后结束,每次连接会断一下蓝牙音频
本站自制清单卡:AirPointer 的五条硬限制与门槛。要求 AirPods 与 Mac 配对;构建需要 Xcode;测过的组合只有 AirPods Pro 3、macOS 26、Apple Silicon;会话在合盖约 30 分钟后结束,需开合盖续接;每次连接会断一下蓝牙音频,通话中不宜连接。

声明:本文来自投稿,不代表苹果家园立场,版权归原作者所有,欢迎分享本文,转载请保留出处!

发表评论

表情 格式 链接 私密 签到

友情链接

    扫一扫二维码分享