惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
月光博客
月光博客
MyScale Blog
MyScale Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
爱范儿
爱范儿
P
Proofpoint News Feed
人人都是产品经理
人人都是产品经理
Last Week in AI
Last Week in AI
罗磊的独立博客
G
Google Developers Blog
Y
Y Combinator Blog
博客园 - 【当耐特】
WordPress大学
WordPress大学
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
J
Java Code Geeks
酷 壳 – CoolShell
酷 壳 – CoolShell
V
Visual Studio Blog
美团技术团队
宝玉的分享
宝玉的分享
Jina AI
Jina AI
小众软件
小众软件
T
Tailwind CSS Blog
A
About on SuperTechFans

V2EX

我用 AI 写代码,但终端管理反而成了累赘——于是我做了 codux [调研] 各位在公司都用什么 ide 和 agent 写代码? 老运维 share 一个运维平台 看到有公司考核 token 指标,很好奇大家上个月的 AI 账单是多少 GLM-Coding 调用持续报错: z.ai 的 Lite 套餐几乎无法使用,官方 Pro/Max 是否稳定? 现在还有什么渠道可以稳定安全地使用 Claude 吗? 上海漕河泾内推,本组有 2 个 hc,一个后端,一个前端,预算都是 20k 左右,不打卡,氛围好 如果 V2EX 上有一组不永久保存聊天记录(比如只保存 7 天或者 24 小时)的聊天室,那么会开启哪些有用或者有趣的可能? gemini cli 貌似挂了,一直返回 403 第一次在自媒体上赚到钱 收集了最近在使用的低价 GPT, Gemini,邮箱等 AI 会员的小店合集 讨论个大实话:现在企业还在说 AI 编程提效 20%, 30%的,真的太落后,没用懂 AI。因为包括很多前沿公司,已经狂奔到提效 200%-500%的情况 [招聘][远程][币安] 前端/后端/QA/iOS/Android 至少 3 年以上经验 目前有大量 HC 欢迎投递 Chatgpt Pro 用量用不完的可以开这些设置 面试的时候好像遇到钓鱼了,给各位避个坑 cursor 年续费 22 号到期, 自动续费是否还是老的计次套餐呢 被两件破事毁掉的一下午,琐碎的内耗消磨人的精力 使用 Planet 存储 Codex 的会话或者重要信息 如果业务部门领导不要你开发功能,而是要求你教会它用 claude code 开发功能,你会怎么做? 分享一个 MacOS 接绿联 CM818 USB 转 DP 转接器使用感受 我的 HR 朋友 10 年老 Java ,非全大专,大家帮忙看看简历 开源了一个 AI 口语练习工具,音素级发音评分,完全免费可自部署 V2EX 上有哪些你觉得很有趣、印象深刻的妹纸? 字节为啥不出个国内版 Vercel? 有在大马的朋友吗? 问个运营商问题 你们在有领导的公司大群发过的最大胆的消息是什么 公司裁员,目前没有工作。想试试摆摊,做一个移动鲜啤打酒车 我的硬盘 Memblaze Pblaze 5 Linux 下不识别,给 Linux 内核提交了补丁, AI 说有望被合并 只有我一个人觉得 codex 不好用?
开发了一个进阶版 Apple 健康
MagicCoder · 2026-06-25 · via V2EX

前言

使用 iPhone + Apple Watch 组合有段时间了,当初买的时候,想着用它来记录我的跑步数据,但是坚持了没多久,我就懒惰了,手表最大的作用就成了睡眠监测工具了,由于作息一直比较规律(晚 11 ~早 7 ),就没怎么关注过这些。

最近半年时间,时不时的熬夜写开源项目,我开始关注自己的健康状况了,打开系统自带的的健康 app 把玩了一番,发现它的数据特别全,但是有几个不好用的地方:

  • 首页的内容比较分散,指标都是以列表的形式进行展示的
  • 指标层级较深,需要切来切去,很多指标我更希望将他们展示到一个大的分类里
  • 指标太单一,大多数时候我并不是只想看某个数据,而是把睡眠、恢复、心率、压力、活动放在一起看,给出更完整的身体状态视角。
  • Apple 只会在你静息心率过高的时候给你发出提醒,而我日常会更关心“最近状态怎么样?哪里变好了?哪里需要注意?”

IMG_4989

寻找替代品

Apple Watch 的销量这么好,肯定不止我一个人觉得自带的软件不好用的。经过一番查找后,找到了几个看着还不错的,把他们都下载下来体验了下,综合下来给我的感觉是:

  • 功能做的太多了,我一眼看过去有点恍惚,接下来我该点什么?
  • 界面做的太卡通了,我比较喜欢简约风格的东西,更贴近系统的设计风格

自己开发

体验了 5 款这类软件,始终没找到适合我的,那就只能花点时间开发一个了⚒️

产品设计

我给这个应用取名为 VirPulse ,它并不是想取代 Apple 健康,而是把 Apple 健康里已经记录好的数据重新整理一遍,让我能更快看懂自己的状态。

在设计产品时,我先给自己定了一个原则:不要把 Apple 健康里的所有数据重新抄一遍,也不要一打开软件就塞给用户几十个指标。

所以整个软件只保留了 3 个主要入口:

  • 首页:快速看懂今天的状态
  • 分析:把多个指标放在一起看
  • 搜索:直接找到某个具体指标

可能很多人会好奇,为什么这个应用叫VirPulse

我的上一个作品叫NginxPulse,它将 Nginx 访问日志转换成直观的图表,就像在查看 Nginx 的“生命体征”一样。

健康数据记录的是一个人每天的身体状态,而心跳又是生命最直接的信号,所以我还是想保留 Pulse 这个词。

一开始本来想叫 LifePulse ,但是 App Store 里已经有了同名应用。后来我继续从生命力、力量相关的词里寻找灵感,最终从拉丁语Virtus中取了前面的Vir,再和Pulse组合,于是就有了VirPulse这个名字。

首页

首页是我每天打开次数最多的地方,所以这里没有放太多复杂的图表,而是先给出一个今日状态评分,再展示睡眠、静息心率、HRV 、步数和活动消耗等信息。

这个评分不是简单取某一个指标,而是会结合睡眠恢复、身体恢复、活动完成度以及最近一段时间的变化趋势进行计算。

比如昨晚睡眠时间不够、HRV 下降、静息心率又比平时高,那么软件就会提醒我最近可能需要多休息,而不是只展示几个冷冰冰的数字。

IMG_4927

这里的评分主要用于观察个人趋势,不作为医疗诊断。

分析

分析页是这个软件的核心功能,我把健康数据分成了运动、睡眠、代谢和压力几个大的分类。

IMG_4928

每个分类都不是只看一个数据,例如睡眠分析会同时参考:

  • 睡眠时长和睡眠阶段
  • 入睡、起床时间是否规律
  • 夜间心率和 HRV
  • 血氧、呼吸频率和腕温

压力状态也不是手表直接提供的数据,而是结合睡眠变化、HRV 、静息心率、活动节律等数据进行估算。

image-20260622024136831

时间范围支持近 7 天、近 30 天、近 90 天和自定义日期,可以用来判断某个变化是偶尔出现,还是已经持续了一段时间。

如果某些数据缺失,软件不会简单按 0 分计算,而是只使用当前已有的数据,并提示这次分析的依据是否完整。

趋势和搜索

有时候我并不想看综合分析,只是想确认某个具体指标最近有没有变化,所以做了一个搜索入口。

IMG_4990

在这里可以直接搜索睡眠、心率、HRV 、血氧、体重、体脂、腕温等指标。点进去后,可以查看最近记录、平均值、最高值、变化趋势以及这个指标和其他健康状态之间的关系。

IMG_4991

IMG_5076

IMG_5077

首次连接 Apple 健康时,会先同步最近 90 天的数据,之后再在后台补全近 400 天的历史趋势。

小组件

为了减少打开软件的次数,我还做了多套桌面小组件,可以直接查看今日状态、睡眠评分、活动进度、压力状态和生命体征趋势。

同时也适配了待机显示,晚上给手机充电时,就可以把它当成一个简单的健康状态面板。

IMG_4933

界面风格

界面上没有加入太多卡通元素,整体以深色背景、半透明卡片和系统图标为主,不同颜色只用来区分睡眠、心率、活动等指标。

image-20260622024656545

页面切换、下拉刷新、图表拖动和底部 Tab 也尽量遵循 iOS 原生的交互方式,用起来不会有太强的学习成本。

IMG_4931

image-20260622024943489

数据隐私

健康数据比较敏感,所以 HealthKit 读取到的原始数据、趋势和分析结果都保存在设备本地,相关计算也是在本地完成的。

服务端主要用于 Apple 账号登录、用户资料和会员状态,不会上传每天的睡眠、心率、步数这些健康记录。

技术栈

这是一个原生 iOS 项目,最低支持 iOS 17 ,并针对 iOS 26 的新 Tab 和 Liquid Glass 系统进行了深度适配。

客户端全部使用 Apple 官方提供的框架,没有引入第三方 UI 和数据处理库,主要技术栈如下:

  • SwiftUI:负责整个软件的界面和交互
  • HealthKit:读取 Apple 健康中的睡眠、心率、HRV 、活动等数据
  • SwiftData:在本地保存健康数据、分析结果和趋势缓存
  • Swift Charts:绘制趋势图、睡眠阶段和指标详情图表
  • WidgetKit:实现桌面小组件和待机显示
  • StoreKit 2:处理月付、年付、永久买断、恢复购买和兑换代码
  • AuthenticationServices:实现通过 Apple 登录
  • URLSession + async/await:和后端接口进行通信
  • Keychain:保存登录令牌

首次授权时读取最近 90 天数据,后续按天增量同步,同时在后台分批补全近 400 天历史数据。这样既不会让第一次进入软件等待太久,也能保留足够长的趋势数据。

图表数据比较多时,如果直接在页面切换过程中读取和计算,会明显感觉到卡顿。所以详情页会先打开一个轻量页面,再异步准备数据,等页面切换完成后再挂载图表。

业务实现主流程:

3333

服务端是基于我现有的 Java 项目继续开发的,主要技术栈如下:

  • Spring Boot + Java:提供账号和会员相关接口
  • MyBatis + MySQL:保存用户资料、登录令牌和订阅记录
  • JWT:处理访问令牌和刷新令牌
  • App Store Server API:校验 Apple 交易和会员状态
  • App Store Server Notifications:接收续订、过期和退款等订阅变化

健康分析并不依赖服务端,服务端主要负责确认“这个用户是谁”和“这个用户是否拥有 Pro 会员”。即使网络暂时不可用,已经同步到本地的健康数据依然可以正常查看。

获取应用

VirPulse 现已在全球 App Store 上架,打开 App Store 搜索“VirPulse”即可下载。

IMG_4992

写在最后

至此,文章就分享完毕了。

我是神奇的程序员,一位前端开发工程师。

如果你对我感兴趣,请移步我的个人网站,进一步了解。