Repository navigation
1.4.0 - 打开短信即停止提醒(复用只读轮询,零新增子系统)
1.4.0:把"打开短信(标记已读)"作为停止方式 —— 复用已有的只读轮询,不引入任何新子系统
思路
1.3.1 已经证明"只轮询 + 提醒引擎"能稳定启动。既然轮询 sms.db 是本插件唯一被长期验证的通道,那就继续只用它来实现停止:
iOS 在你打开那条短信(或对它的通知执行打开动作)时,会把
message.is_read置为 1。我们本来就在轮询这个库,于是多查一个主键字段就能知道"用户已经看到了"。
实现(KSASMSWatcher):
- 记录最近触发过提醒的
ROWID(最多 8 条); - 仅在提醒进行中,每次轮询对这几条做一次
SELECT is_read FROM message WHERE ROWID = ?(主键查找,极便宜); - 一旦为 1 → 立即
stopAlertWithReason:@"SMS marked as read"。
这条路径不需要:HID 客户端、Darwin 观察者(notify_register_dispatch)、SpringBoard 注入、任何额外进程 —— 因此启动安全性等同于已验证的 1.3.1。
使用方式
- 收到提醒 → 在通知上点开(或直接打开「信息」里那条短信)→ 提醒立即停止;
- 不打开的话,仍然到设定时长自动结束(
SoundDuration/VibrationDuration,可自行调短)。
核验(发布产物逐项检查)
必须不存在(启动安全不变量,均确认 False):
IOHIDEventSystemClientCreate / notify_register_dispatch /
com.apple.springboard.lockstate / com.apple.iokit.hid.displayStatus /
SBLockScreenManager / MSHookMessageEx
必须存在(功能,均确认 True):
SELECT is_read FROM message WHERE ROWID (新的停止检查)
SELECT MAX(ROWID) FROM message (原有轮询)
AudioServicesPlaySystemSound (震动 + 铃声通道)
链接库与 1.3.1 完全一致:Foundation / CoreFoundation / AudioToolbox / sqlite3 / libroothide(无 AVFoundation)。host 单测 48 passed / 0 failed。
如果这样还不够"随手静音"
还有一个单变量的候选方案:把解锁/锁定状态再作为停止条件(1.2.7 的行为,当时能正常启动,但 1.3.0 那个版本恰好也带着它并且黑屏过,所以我不敢默认开启)。若你需要"不打开短信也能静音",我可以把它做成设置里的开关、默认关闭,你先当实验开启验证一次启动是否正常 —— 一次只加一个变量,不再一次塞三样。