全部文章

【TECH】MonoPump 的本地优先健康数据设计

MonoPump 如何在保留心率历史价值的同时,避免把私人测量数据变成云端数据或医疗结论。

隐私本地优先健康数据iOS
【TECH】MonoPump 的本地优先健康数据设计

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

手机中的心率历史以本地受保护文件形式呈现
本地优先让默认测量路径保持私密和简单。

测量算法最容易被讨论,但结果页消失之后,真正决定产品是否可信的是数据层。

记录要刻意保持小

一次心率记录不应该膨胀成医疗档案。MonoPump 保存必要字段:日期、BPM、用户、可选场景、质量、置信度、测量时长、来源和备注。这足够支撑历史、导出和趋势描述,同时不会收集超过需求的数据。

Entity relationship diagram Preparing diagram
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 只保留轻量偏好和迁移兼容,长期历史放在本地文件中。

Flow diagram Preparing diagram
View diagram source
flowchart LR
    A[测量结果] --> B[HeartRateViewModel]
    B --> C[编码为 JSON]
    C --> D[原子写入]
    D --> E[Application Support]
    E --> F[iOS 文件保护]

这不只是实现细节。它意味着默认路径不需要账号、服务器、同步额度或网络权限。对一个小型健康工具来说,这种简单本身就是功能。

趋势应该描述,而不是诊断

健康分析层刻意保持克制:平均值、中位数、最大最小、近期窗口对比、活跃天数、质量摘要。它不推断 HRV、压力、睡眠质量、疾病风险或治疗建议。

Flow diagram Preparing diagram
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 的规则很简单:少收集、本地存、谨慎解释、主动导出。

来自 MonoWare

MonoPump 背后还有更多上下文。

打开产品网站,或继续阅读按 MonoPump 筛选的笔记。

通讯

隐私与产品工程笔记,偶尔发送。