心率 App 有两个互相拉扯的责任:它要记住足够多的历史,才对用户有价值;同时它又不能把个人健康数据当成普通行为数据处理。MonoPump 在这个取舍里选择本地优先。

测量算法最容易被讨论,但结果页消失之后,真正决定产品是否可信的是数据层。
记录要刻意保持小
一次心率记录不应该膨胀成医疗档案。MonoPump 保存必要字段:日期、BPM、用户、可选场景、质量、置信度、测量时长、来源和备注。这足够支撑历史、导出和趋势描述,同时不会收集超过需求的数据。
This diagram could not be rendered. Its source is still available below.
View diagram source
erDiagram
USER ||--o{ HEART_RATE_RECORD : owns
USER {
uuid id
string name
string avatar
}
HEART_RATE_RECORD {
uuid id
date measuredAt
int bpm
double qualityScore
double confidenceScore
string context
string source
}
克制是刻意的。如果一个字段不能改善体验,用户也没有主动需要,就不应该因为技术上容易收集而收集。
本地存储改变产品边界
MonoPump 把记录放在 App 容器里,用 Application Support 下的 JSON 文件保存,写入时使用原子写入和完整文件保护。UserDefaults 只保留轻量偏好和迁移兼容,长期历史放在本地文件中。
This diagram could not be rendered. Its source is still available below.
View diagram source
flowchart LR
A[测量结果] --> B[HeartRateViewModel]
B --> C[编码为 JSON]
C --> D[原子写入]
D --> E[Application Support]
E --> F[iOS 文件保护]
这不只是实现细节。它意味着默认路径不需要账号、服务器、同步额度或网络权限。对一个小型健康工具来说,这种简单本身就是功能。
趋势应该描述,而不是诊断
健康分析层刻意保持克制:平均值、中位数、最大最小、近期窗口对比、活跃天数、质量摘要。它不推断 HRV、压力、睡眠质量、疾病风险或治疗建议。
This diagram could not be rendered. Its source is still available below.
View diagram source
flowchart TD
R[本地 BPM 记录] --> S[按日期排序]
S --> A[平均值和中位数]
S --> M[最大最小]
S --> W[近期窗口对比]
S --> Q[质量摘要]
A --> O[描述性洞察]
M --> O
W --> O
Q --> O
消费级摄像头 App 可以帮助用户观察模式,但不应该假装自己是医生。MonoPump 的规则很简单:少收集、本地存、谨慎解释、主动导出。