Repository navigation
1.2.7 - 不再用屏幕状态停止提醒;真正的电源键监听 + 锁定/解锁兜底
1.2.7:屏幕状态不再停止提醒;改为「真正的电源键监听」+「锁定/解锁」兜底
你这次的现象说明了根本问题
自动熄屏后提醒正常(1.2.6 有效)→ 点击屏幕亮屏 → 提醒立刻停止
因为"点击屏幕亮屏"和"按电源键亮屏"在显示状态层面完全一样(都是 熄屏 → 亮屏)。我上一版把"亮屏"当成按了电源键,所以点一下屏幕就把提醒停了。
结论:用显示状态推断电源键,原理上就做不到。 显示状态的每一次变化都有好几个来源:
| 显示变化 | 可能的来源 |
|---|---|
| 熄屏 → 亮屏 | 按电源键、点击屏幕、抬手唤醒、短信通知点亮锁屏 |
| 亮屏 → 熄屏 | 按电源键、自动熄屏、通知唤醒超时、自动锁定 |
前两版我每修掉一个误判源,下一次实测就冒出下一个(先被通知唤醒停、再被通知超时停、再被点击屏幕停)。所以这次彻底不再用显示状态停止提醒。
1.2.7 的两条停止途径
-
真正的电源键监听(首选):直接在 imagent 内用 IOKit 的
IOHIDEventSystemClient只观察物理电源键事件(Consumer 页 / Power 用法 / 按下沿)。事件从不派发、从不消费、从不改写,不影响锁屏/唤醒/SOS。- 这是唯一能精确区分"电源键"与"点屏幕"的信号;
- 但 imagent 没有 HID entitlement,是否放行只能靠实测——所以做了兜底并把它显示在设置里。
-
锁定 / 解锁(兜底,一定有效):通知、点击屏幕、抬手唤醒都不会改变锁定状态,所以这两个动作可以安全地作为停止条件:
- 锁定(用手机时按电源键,或自动锁定)→ 停止;
- 解锁(输密码 / Face ID)→ 停止(你已经看到提醒了)。
屏幕状态现在只用于诊断
它仍会被记录(设置面板可查),但永不停止提醒。
请在设置里看这一行判断 HID 是否生效
设置 → KeywordSMSAlert → 诊断 →「提醒服务状态」:
- 显示
已启动 · 电源键监听(HID)→ 精确按键监听生效:按电源键立即停止,点屏幕/抬手/通知都不会误停; - 显示
已启动 · 停止方式:锁定/解锁手机→ HID 未放行,退化为"锁定/解锁停止"(按电源键点亮屏幕不会停;解锁手机或按电源键锁屏会停)。
括号里还会带上 HIDStatus,把失败原因(例如缺少 entitlement / IOHID 符号)直接写出来。
请这样测
- 安装 1.2.7(旧包是 boot-quiet,imagent 启动后约 10 秒才开始工作,属正常);
- 发短信 → 等提醒响 → 点一下屏幕亮屏 → 提醒应继续;
- 等到自动熄屏 → 提醒仍应继续;
- 然后看「提醒服务状态」显示的是哪一种,再按提示的停止方式验证一次。
核验
- host 单测 44 passed / 0 failed
- detector:HID 观察代码已编入、显示状态停止规则已确认移除、锁定/解锁停止路径存在;零 Hook、未链接 AVFoundation、包内无 SpringBoard 组件与 LaunchDaemon