Skip to content

1.2.7 - 不再用屏幕状态停止提醒;真正的电源键监听 + 锁定/解锁兜底

Choose a tag to compare

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

1.2.7:屏幕状态不再停止提醒;改为「真正的电源键监听」+「锁定/解锁」兜底

你这次的现象说明了根本问题

自动熄屏后提醒正常(1.2.6 有效)→ 点击屏幕亮屏 → 提醒立刻停止

因为"点击屏幕亮屏"和"按电源键亮屏"在显示状态层面完全一样(都是 熄屏 → 亮屏)。我上一版把"亮屏"当成按了电源键,所以点一下屏幕就把提醒停了。

结论:用显示状态推断电源键,原理上就做不到。 显示状态的每一次变化都有好几个来源:

显示变化 可能的来源
熄屏 → 亮屏 按电源键、点击屏幕、抬手唤醒、短信通知点亮锁屏
亮屏 → 熄屏 按电源键、自动熄屏、通知唤醒超时、自动锁定

前两版我每修掉一个误判源,下一次实测就冒出下一个(先被通知唤醒停、再被通知超时停、再被点击屏幕停)。所以这次彻底不再用显示状态停止提醒。

1.2.7 的两条停止途径

  1. 真正的电源键监听(首选):直接在 imagent 内用 IOKit 的 IOHIDEventSystemClient 只观察物理电源键事件(Consumer 页 / Power 用法 / 按下沿)。事件从不派发、从不消费、从不改写,不影响锁屏/唤醒/SOS。

    • 这是唯一能精确区分"电源键"与"点屏幕"的信号;
    • 但 imagent 没有 HID entitlement,是否放行只能靠实测——所以做了兜底并把它显示在设置里。
  2. 锁定 / 解锁(兜底,一定有效):通知、点击屏幕、抬手唤醒都不会改变锁定状态,所以这两个动作可以安全地作为停止条件:

    • 锁定(用手机时按电源键,或自动锁定)→ 停止;
    • 解锁(输密码 / Face ID)→ 停止(你已经看到提醒了)。

屏幕状态现在只用于诊断

它仍会被记录(设置面板可查),但永不停止提醒。

请在设置里看这一行判断 HID 是否生效

设置 → KeywordSMSAlert → 诊断 →「提醒服务状态」:

  • 显示 已启动 · 电源键监听(HID) → 精确按键监听生效:按电源键立即停止,点屏幕/抬手/通知都不会误停;
  • 显示 已启动 · 停止方式:锁定/解锁手机 → HID 未放行,退化为"锁定/解锁停止"(按电源键点亮屏幕不会停;解锁手机或按电源键锁屏会停)。

括号里还会带上 HIDStatus,把失败原因(例如缺少 entitlement / IOHID 符号)直接写出来。

请这样测

  1. 安装 1.2.7(旧包是 boot-quiet,imagent 启动后约 10 秒才开始工作,属正常);
  2. 发短信 → 等提醒响 → 点一下屏幕亮屏 → 提醒应继续;
  3. 等到自动熄屏 → 提醒仍应继续;
  4. 然后看「提醒服务状态」显示的是哪一种,再按提示的停止方式验证一次。

核验

  • host 单测 44 passed / 0 failed
  • detector:HID 观察代码已编入、显示状态停止规则已确认移除、锁定/解锁停止路径存在;零 Hook、未链接 AVFoundation、包内无 SpringBoard 组件与 LaunchDaemon