Repository navigation
1.2.9 - 更正上一轮结论:HID 客户端能建但事件从未到达;一次安装问清原因
1.2.9:更正上一轮的结论,并把 HID 的"为什么收不到"一次性问清楚
先更正我上一轮的错误
我说"1.2.7 显示 已启动 · 电源键监听(HID) 就证明事件到达了"——这是错的。查 git 历史确认:
- 1.2.7 的那行逻辑只有
if (HIDAvailable) → "电源键监听(HID)",而HIDAvailable仅仅表示 "客户端创建成功"; - "收不到事件"这个区分是 1.2.8 才加进去的。
所以你 1.2.7 看到的文案只证明客户端能创建,不证明有事件。而 1.2.8 第一次真正测量了它,结果是你看到的:零事件。
也就是说:客户端能在 imagent 里创建成功,但事件从来没到过。真正的原因只可能是"沙箱/权限不允许事件投递",或者"投递方式不对"。
1.2.9:一次安装把这两个问题都问清楚
- 能看见多少 HID 服务:调用
IOHIDEventSystemClientCopyServices数一下 imagent 到底能看到几个 HID 服务。如果是 0,说明沙箱直接封死了 HID 事件系统,任何投递方式都不可能成功——那样我就不会再让你折腾这条路了。 - 三种投递方式依次自动尝试(每次一个独立客户端,互不干扰):
- A
main-runloop:挂 imagent 主 run loop(1.2.7 用的方式,但当时没测过是否真有事件); - B
dispatch-queue:IOHIDEventSystemClientSetDispatchQueue(1.2.8 用的,实测 0 事件); - C
thread-runloop:独立线程 + 自己的 run loop。
每 8 秒如果还没有任何事件,就启动下一种;哪种先收到事件就会记录下来,并显示在设置里。
- A
- 匹配仍然放宽(
Consumer 0x0C/0x30、AppleVendor 0xFF01/0x0B、Keyboard 0x07/0x66),键盘事件仍会把真实的 page/usage/down 记录下来。
设置里现在会显示什么
- 有事件:
已启动 · 电源键监听(HID)· 事件 N/键盘 M · 末次 0x<page>/0x<usage>↓<策略> - 没事件:
已启动 · HID 已注册但收不到事件(可见 HID 服务 N · <当前策略>)
请这样测(一次就够)
- 安装 1.2.9,重启一次用户空间(旧的 boot-quiet 延迟 10 秒生效,属正常);
- 进「诊断 → 提醒服务状态」,按一下音量键,看计数与"可见 HID 服务"的数字;
- 整行发我(含括号内内容)。
结果怎么解读
| 看到的现象 | 结论与下一步 |
|---|---|
可见 HID 服务 0 |
沙箱封死,HID 这条路走不通 → 保留"锁定/解锁"兜底,不再折腾 |
| 服务 > 0 但仍无事件,且三种策略都试过 | 事件投递被拦(可能只差一个 entitlement,而它无法追加)→ 同样放弃 HID |
有事件、键盘 M 增长、末次 显示某个 page/usage |
有救:把 page/usage 发我,我加进匹配表即可 |
有事件且 末次 是 0xC/0x30 或 0xFF01/0xB |
那说明匹配本身没问题,问题在别处,我继续查 |
核验
- host 单测 48 passed / 0 failed(matcher 覆盖 3 种候选 usage)
- detector 产物确认含服务探测、三条投递策略、零 Hook、未链接 AVFoundation、无 SpringBoard 组件与 LaunchDaemon
- 两个
Localizable.strings均通过plutil -lint