news 2026/4/26 5:20:10

独立开发健康记录 App 实录:几个让我纠结很久的 iOS 设计决策

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
独立开发健康记录 App 实录:几个让我纠结很久的 iOS 设计决策

上线一周,下载量是零

冷启动就是这样,我心里清楚。但我还是想把「健康手账」这个 iOS App 的开发思路整理出来——不是为了推广,而是做的过程中有几个决策点挺有意思,适合和同样在做 iOS 工具类 App 的朋友聊聊。

这个 App 的出发点很简单:帮有慢病管理需求的用户(尤其是高血压患者)快速记录健康数据。目标用户有相当一部分是老年人,或者是子女帮父母记录的场景。


为什么又做了一个健康记录 App

这类 App 的竞品多到数不清。我当时下载了七八个,用下来有个共同问题:录入太麻烦

打开 App、点击新建、手动输入收缩压、再输舒张压、再输脉搏——三个字段,最快也要 15 秒。对于每天早晚要测两次血压的患者,这个摩擦力不小。更别说帮父母操作,老人对数字键盘并不友好。

我想解决的核心问题就一个:把「记一次数据」压缩到 3 秒以内


录入交互:试了三个方案,前两个全删了

最直接的想法是 OCR 识别——用摄像头拍血压计屏幕,自动读取数值。试了一周,在不同光线下识别率差异很大,用户还得配合把手机对准屏幕,反而更麻烦,放弃。

第二个方案是「上次差异快捷选择」,类似「上次是 128/82,这次有变化吗?」。问题是对新用户完全不直觉,首次录入也没有历史数据可以跑,放弃。

最终落地的方案是物理拨轮——Picker 风格,带阻尼感的自定义实现。收缩压、舒张压、脉搏各一个拨轮,默认值锁定在上次录入附近,打开就能拨,拨完直接存。实际操作下来,熟悉之后 3–5 秒完成一次录入。

这个交互特别适合老年用户,因为拨轮比点击键盘容错率高——拨过了再拨回来,不需要删除重输。这个细节在给父母演示的时候体感非常明显。


数据模型:tagIDs 关联干预行为

健康数值好记,但「今天血压偏高是因为没睡好还是昨晚喝酒了」这种因果关系很难追踪。

我在HealthRecord上加了一个tagIDs: [String]字段,对应一套可自定义的状态标签(StatusTag)。内置标签有「降压药」「运动」「好睡眠」「黑咖啡」等,用户每次录入时顺手打几个印章。

@ModelfinalclassHealthRecord{varid:UUIDvartimestamp:Datevarsystolic:Int?vardiastolic:Int?varpulse:Int?varweight:Double?vartagIDs:[String]// 关联当次的干预行为varprofileID:String="default"}``` 趋势图里,这些标签会作为事件标记叠加在折线上。比如连续几天运动后血压数值的变化,一眼就能看出来。这个设计借鉴了运动App里「训练日志」的思路,但放在慢病管理场景下我觉得更有价值——真正需要的是「行为 → 数据」的对照关系。---##Siri快捷指令:消灭打开App这一步 做完拨轮之后我意识到,录入的最大摩擦其实不是界面操作,而是**「找到图标、打开App」这个动作本身**。 用 `AppIntents` 实现了一个Siri快捷指令,说「用健康手账记录健康数据」直接跳到录入界面。实现上用了 `NotificationCenter` 广播机制——intent `perform` 之后 post 一个通知,主视图监听到就弹出录入 sheet。 ```swiftstructLogHealthRecordIntent:AppIntent{staticlettitle:LocalizedStringResource="记录健康数据"staticletopenAppWhenRun:Bool=true@MainActorfuncperform()asyncthrows->someIntentResult{tryawaitTask.sleep(for:.milliseconds(200))NotificationCenter.default.post(name:.healthLogShowInputSheet,object:nil)return.result()}}``` 延迟 200ms 是因为App冷启动时视图层级还没就绪,直接 post 通知会丢失。这个 bug 在真机上才能复现,模拟器里完全看不出来,踩坑之后才加上的。---##PDF就医报告:一个被低估的功能 大多数健康App的数据只能在App内查看,最多导出CSV。但去医院看诊时,医生没时间盯着你的手机屏幕看折线图。 我加了一个「生成就医报告」功能,一键输出标准格式PDF:患者基本信息、最近N天的数据表格、趋势图、备注。打印出来或者直接发给医生都可以。 开发时我犹豫了挺久要不要做这个——PDF布局和图表渲染的实现成本不低。但「数据记了,医生却看不懂」这个痛点太真实了,还是做了。现在回头看,这是整个产品里差异化最强的功能。---## 本地存储+可选 iCloud 同步 数据全部用**SwiftData**存在本地。这是主动决策,不是懒得做后端。 健康数据比较敏感,很多用户对「数据上云」有顾虑。本地存储让这个顾虑直接消失,不需要注册账号,不需要联网。iCloud 同步作为可选项,用CloudKit实现,在设置里手动开启,选择权完全交给用户。 定价上选了**买断制**,也是基于同样的逻辑:慢病患者要长期用,订阅制的心理负担对他们不友好。---## 多人档案:一个App管全家 `HealthRecord` 上有一个 `profileID` 字段,支持创建多个独立档案。典型场景是子女帮父母管理数据:爸妈各一个档案,切换一下看各自的趋势。下次陪父母去复诊,直接切到对应档案导出PDF,不用临时整理数据。---## 还没做好的地方 趋势图的异常检测目前比较简陋,只是超过阈值标红,没有考虑「白大衣高血压」这种连续偏高但实际无问题的场景。想引入滑动窗口均值,暂时还没动。 血压分类标准支持国内标准和ACC/AHA2017切换,但界面没做到位,大多数用户根本发现不了这个设置在哪。这是个遗留的体验债。---## 写在最后 项目目前还在冷启动阶段,家里有需要记血压的长辈的朋友,可以在AppStore搜「健康手账」装一个试试。 如果你也在做 iOS 工具类或健康类App,欢迎在评论区交流——数据录入的交互设计、用户习惯的培养、慢病场景的特殊需求……这些问题我觉得都值得好好聊。>顺带一提:「健康手账」目前也在规划HarmonyOS/鸿蒙版本,如果你是鸿蒙开发者、对ArkUI/ArkTS有经验,也欢迎留言,说不定之后能一起搞。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/26 5:16:19

终极指南:如何用FakeLocation实现安卓应用级位置模拟

终极指南:如何用FakeLocation实现安卓应用级位置模拟 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation FakeLocation是一款基于Xposed框架的安卓位置模拟模块&#xff0…

作者头像 李华
网站建设 2026/4/26 5:12:32

深度学习模型集成:堆叠泛化实战指南

1. 深度学习模型集成方法概述在机器学习实践中,单个模型的表现往往存在局限性。模型集成技术通过组合多个模型的预测结果,通常能够获得比单一模型更优的性能。其中,堆叠泛化(Stacking Generalization)是一种强大的集成…

作者头像 李华
网站建设 2026/4/26 5:10:53

可验证与可演进强化学习智能体框架VERL实战解析

1. 项目概述:一个面向未来的智能体开发框架最近在探索AI智能体(Agent)开发时,发现了一个让我眼前一亮的开源项目:langfengQ/verl-agent。这不仅仅是一个简单的工具库,而是一个旨在构建“可验证、可演进、可…

作者头像 李华
网站建设 2026/4/26 5:00:38

real-anime-z镜像维护指南:日志清理、模型缓存管理、版本升级路径

real-anime-z镜像维护指南:日志清理、模型缓存管理、版本升级路径 1. 镜像概述 real-anime-z是基于Z-Image构建的LoRA模型镜像,专注于生成高质量的真实风格动画图片。该镜像使用Xinference作为推理框架,并通过Gradio提供了友好的Web界面&am…

作者头像 李华
网站建设 2026/4/26 4:59:26

ClickHouse中使用Materialized View和Polygon Dictionary的实践

在处理地理空间数据时,尤其是涉及到区域划分和点位统计的场景中,如何高效地进行数据处理是我们面临的一大挑战。本文将介绍如何在ClickHouse中利用Materialized View(物化视图)和Polygon Dictionary(多边形字典)来优化数据处理流程。 场景描述 假设我们有一张包含地理位…

作者头像 李华