Skip to content

1.2.9 - 更正上一轮结论:HID 客户端能建但事件从未到达;一次安装问清原因

Choose a tag to compare

@CangWeiohh CangWeiohh released this 10 Oct 01:59
· 5 commits to main since this release

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:一次安装把这两个问题都问清楚

  1. 能看见多少 HID 服务:调用 IOHIDEventSystemClientCopyServices 数一下 imagent 到底能看到几个 HID 服务。如果是 0,说明沙箱直接封死了 HID 事件系统,任何投递方式都不可能成功——那样我就不会再让你折腾这条路了。
  2. 三种投递方式依次自动尝试(每次一个独立客户端,互不干扰):
    • A main-runloop:挂 imagent 主 run loop(1.2.7 用的方式,但当时没测过是否真有事件);
    • B dispatch-queue:IOHIDEventSystemClientSetDispatchQueue(1.2.8 用的,实测 0 事件);
    • C thread-runloop:独立线程 + 自己的 run loop。
      每 8 秒如果还没有任何事件,就启动下一种;哪种先收到事件就会记录下来,并显示在设置里。
  3. 匹配仍然放宽(Consumer 0x0C/0x30、AppleVendor 0xFF01/0x0B、Keyboard 0x07/0x66),键盘事件仍会把真实的 page/usage/down 记录下来。

设置里现在会显示什么

  • 有事件:已启动 · 电源键监听(HID)· 事件 N/键盘 M · 末次 0x<page>/0x<usage>↓<策略>
  • 没事件:已启动 · HID 已注册但收不到事件(可见 HID 服务 N · <当前策略>)

请这样测(一次就够)

  1. 安装 1.2.9,重启一次用户空间(旧的 boot-quiet 延迟 10 秒生效,属正常);
  2. 进「诊断 → 提醒服务状态」,按一下音量键,看计数与"可见 HID 服务"的数字;
  3. 整行发我(含括号内内容)。

结果怎么解读

看到的现象 结论与下一步
可见 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