Skip to content

fix(reminder): 时间/地点提醒响铃不分强度、原生闹钟无补挂兜底 #354

Description

@LUPENGHAN

背景

时间/地点提醒目前有几个可靠性缺口:

  1. 原生闹钟响铃声音不区分提醒强度——不管 low/medium/high,响铃行为几乎一样,达不到"高强度持续响、低强度提示一下"的设计预期。
  2. 原生精确闹钟一旦因为系统限制(厂商省电策略、进程被杀等)没能真正挂上,目前没有任何兜底机制发现和补救——用户不会再收到这条提醒,直到下次打开 App 触发一次 rebuild。
  3. 地点提醒展示时缺少"原生全屏响铃优先"的统一路径,跟时间提醒的展示体验不一致,两条路径分别维护。

方案

  • 原生闹钟新增三档铃声(none/ping/full),按提醒强度换算:低=一次性提示音不震动,中=提示音+震动,高=循环响铃+震动,全部改由原生 RingActivity/AlarmSoundService 统一承接,不再跟 JS 侧的弹窗/播放抢事件。
  • 时间型提醒的原生闹钟触发/响铃 UI 全权交给原生侧,JS 只负责注册和状态同步。
  • 新增后台守护任务(ReminderGuardCoordinator + reminderGuardTask):定期核对"该挂上原生闹钟的日程有没有真的挂上",没挂上就补挂;系统围栏不可用/失效时提供持续定位轮询兜底。
  • 地点提醒和时间提醒统一走 presentNow 原生全屏响铃优先路径,presentNow 本身不可用(iOS、或原生模块拿不到)时才回退到 JS 通道。

验收标准

  • 低/中/高三档提醒强度在真机上响铃行为可区分(提示音次数、是否震动、是否持续响)。
  • 模拟闹钟未挂上的场景下,后台守护任务能在下个轮询周期内补挂闹钟。
  • 地点提醒触发时优先走原生全屏响铃页,跟时间提醒体验一致。
  • 现有 JS/原生单测全部通过。

不做

  • 不改动本地 TTS 播报(见后续 PR)。
  • 不改动 SQLite 连接生命周期或围栏半径/轮询策略(见后续 PR)。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions