Skip to content

feat(reminder): 接入本地提醒引擎(实现 #161 时间/地点提醒送达) #263

Description

@LUPENGHAN

Proposal

#161(本地提醒送达,已 Accepted)定稿的产品行为工程化落地:新建 Android 原生闹钟模块 + 本地提醒引擎(domain/application)+ 设备侧适配器(通知/震动/音频/定位)+ SQLite 数据层,替换现有的全 Mock 桩实现,接入 App 组合根。

Background

#161 明确写了"不在本 Proposal 中决定 Android 调度框架、定位算法或 TTS 服务实现"——这些工程选型是本 Issue 要做的事。当前 createAppServices.ts 里构造的 reminder 是 MockReminderApplication(纯桩),所有设备端口也都是 Mock,提醒功能完全不可用。

关键决策与依据

决策点 备选方案 选择 理由
Android 闹钟调度 复用 Expo 本地通知调度 / 自建原生 AlarmManager 模块 自建原生模块(timeflow-alarm) Expo 本地通知后台存活和精确触发不如 AlarmManager+BOOT_COMPLETED 重排;#161 要求断网时提醒仍可达
地理围栏判定 应用侧连续定位轮询+Haversine(百度 SDK)/ 系统原生 Geofencing API(expo-location) 系统原生 Geofencing 系统 API 由 OS 管理省电、后台更可靠
提醒数据来源 沿用内存态 Mock 数据 / 接入真实 SQLite 接入真实 SQLite 提醒必须基于用户真实创建的日程
四个适配器 PR 的合并顺序 各自独立合并(互不冲突)/ 依次合并 依次合并 267→268→269→270 四个 PR 都需要改 createAppServices.ts 里各自负责的端口那几行,属于同一文件不同行的并发修改;GitHub 允许它们同时被 approve,但后合的会在合并时与先合的产生 diff base 偏移,需要合并一个、其余三个重新 rebase 一次,不能真正并行落地

基本概念与信息结构

沿用 #161 已定义的:提醒配置/提醒实例/送达方式/提醒完成/提醒延期/已送达/提醒状态。新增工程概念:LocationMonitorPort/AlarmSchedulerPort/DeviceCapabilityPort/NotificationChannels/ReminderDeliveryPort(域与基础设施之间的边界端口);geofence_radius_meters(围栏半径,本期硬编码 200 米)。

验收标准

本轮不做

  • 百度定位模块(timeflow-baidu-location/NativeLocationMonitor/BaiduLocationBridge)本次整个删除,不接入也不留死代码
  • 云端日程同步触发的数据刷新(SqliteScheduleSyncService)——生产代码里零调用点,另开 issue
  • geofence_radius_meters 硬编码 200 米,不做成可配置,记录为已知简化
  • 语音/位置搜索的三个不相关小修复不在这个 issue 里,单独走

边界

规格:FullSpec

Metadata

Metadata

Assignees

No one assigned

    Labels

    FullSpec完整规格提案:影响面较大,需要写清楚动机、范围、不做、备选方案、接口/数据结构、原型、验收标准enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions