Repository navigation
1.4.1 - 已读停止改为提醒期间每 0.5 秒检查(不再受 5 秒轮询限制)
1.4.1:把"已读停止"从 5 秒轮询里解耦 —— 提醒期间每 0.5 秒检查一次
你问的问题:对,会有延迟
is_read 的检查原先搭在检测轮询的同一拍上,所以:
- 你的
PollInterval = 5秒 → 停止延迟 0~5 秒(平均约 2.5 秒); - 另外数据库若被占用,
sqlite3_busy_timeout(500)最多再加 0.5 秒; - 极端情况下(轮询间隔恰好被重新排定)还会多跳一拍。
修法:同一条通道,只改节奏(不引入任何新子系统)
提醒播放期间另起一个 0.5 秒的定时器,只做那一句主键查询:
SELECT is_read FROM message WHERE ROWID = ?- 仅在提醒进行中运行(由提醒引擎的状态变化通知触发启动/停止),空闲时零开销、零唤醒;
- 检测轮询本身仍是
PollInterval(你的 5 秒)—— 因为它只管"有没有新短信",与停止无关; - 仍然是只读同一个数据库连接:无 HID、无 Darwin 观察者、无 Hook、无额外进程。
新的停止延迟:约 0~0.5 秒(平均 0.25 秒),数据库忙时再加最多 0.5 秒。
核验(发布产物逐项检查)
启动安全不变量(必须不存在,均确认 False):IOHIDEventSystemClientCreate、notify_register_dispatch、com.apple.springboard.lockstate、com.apple.iokit.hid.displayStatus、SBLockScreenManager、MSHookMessageEx。
功能(必须存在,均确认 True):SELECT is_read FROM message WHERE ROWID、fast read check started、com.keyword.smsalert.alertStateChanged、SELECT MAX(ROWID) FROM message。
链接库与 1.3.1/1.4.0 完全一致(Foundation / CoreFoundation / AudioToolbox / sqlite3 / libroothide,无 AVFoundation);host 单测 48 passed / 0 failed。
备注
如果你的 PollInterval 设得更大(例如 10 秒),停止延迟不受影响(仍然是 0.5 秒级);它只影响"新短信被发现的延迟"。