开发了一个进阶版Apple健康

作者:神奇的程序员日期:2026/6/25

前言

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

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

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

寻找替代品

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

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

自己开发

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

产品设计

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

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

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

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

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

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

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

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

首页

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

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

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

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

分析

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

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

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

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

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

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

趋势和搜索

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

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

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

小组件

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

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

界面风格

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

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

数据隐私

健康数据比较敏感,所以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天历史数据。这样既不会让第一次进入软件等待太久,也能保留足够长的趋势数据。

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

业务实现主流程:

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

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

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

获取应用

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

写在最后

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

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

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


开发了一个进阶版Apple健康》 是转载文章,点击查看原文


相关推荐


Mac 软件推荐
yuanyxh2026/6/16

OrbStack 轻量 Linux 系统、Docker 容器、K8S 容器,用它的原因是工作/开发环境在系统里拉太多屎了,开个 Linux 虚拟机隔离工作环境,本地代码编辑器 + ssh 远程连接开发,这种模式适合 web 前端/后端。 安装: brew install orbstack 使用: VSCode 安装 RemoteSSH 插件,连接 host@orb 除了隔离环境,还可以导入导出镜像,方便打包整体环境;或在后台运行服务。 缺点:Linux 虚拟机有一定内存占用 Tart macO


每日一个开源项目(第125篇):taste-skill - 给 AI 装上审美,让前端不再千篇一律
冬奇Lab2026/6/9

引言 "AI 生成的前端,为什么看起来都一个样?" 这是"每日一个开源项目"系列的第125篇文章。今天的主角是 taste-skill——一套给 AI Agent 配上「审美」的前端设计技能包。 让 AI 写前端代码已经很普遍了,但结果往往大同小异:居中排版、蓝色主色调、卡片式布局、圆角阴影,整齐但无聊。问题不在于 AI 不会写代码,而在于它没有任何关于「这个设计应该有什么气质」的约束。 taste-skill 的答案很直接:用一套经过研究积累的设计规则文件,告诉 AI 什么是品位,什么是


09-不要只让 AI 进入 Plan 模式,要先给 AI 一套工程制度
颜进强2026/6/1

上篇:不要只让 AI 进入 Plan 模式,要先给 AI 一套工程制度 这两篇文章的核心目的只有一个:通过业务决策和技术决策,让我们向 AI 提需求时,AI 在 Plan/决策阶段就能更精准。 AI 写代码并不难,难的是让 AI 在一开始做方案时,就知道项目的业务边界、技术边界和执行流程。 这篇是上篇,主要讲为什么要把业务决策和技术决策沉淀下来,以及它们如何帮助 AI 更准确地做方案。 下篇会继续讲:技术决策、rules 和 skills 到底怎么分工,避免文档越写越多,AI 反而越容易混乱。


我为我的龙虾斩分身:OpenClaw 多智能体实操
飞哥数智谈2026/5/12

飞哥数智谈,全栈工程师,在济南这个二线城市做 AI 社群,AI·Spring 社群发起人,同时,担任 TRAE Friends 社区济南 Fellow,致力于 AI 提效与 AI 编程普及与落地。 很久没有写关于 OpenClaw 的文章了,但并不意味着我不再喜欢小龙虾,相反,我依然觉得 OpenClaw 是个具有深远意义的产品。 或者,准确地说,龙虾类产品意义重大,但此处的龙虾并不特指 OpenClaw,可以是 Hermes,可以是 QClaw,也可以是 XClaw。 它们实现了 AI 智能


OpenClaw 多模型配置与切换详解
七夜zippoe2026/5/2

目录 热门文章推荐摘要一、引言:为什么需要多模型支持1.1 AI 模型生态的多元化现状1.2 多模型支持的核心价值 二、支持的模型提供商2.1 OpenAI2.2 Anthropic(Claude)2.3 Qwen(通义千问)2.4 Ollama(本地模型) 三、模型配置详解3.1 基本配置结构3.2 模型选择配置3.3 自定义提供商配置3.4 模型参数配置 四、模型切换机制4.1 Default 默认模型4.2 Reasoning 推理模型4.3 Per-Session 会


树莓派4b + USRP B210 搭建反无人机(反无)系统( HTML + CDN )
MC数据局2026/4/23

brainstorming: 硬件能力分析 1. USRP B210 的能力边界 参数规格对反无系统的意义频率范围70 MHz – 6 GHz✅ 覆盖无人机主流频段(2.4G / 5.8G / 915M / 433M)瞬时带宽最大 56 MHz(USB 3.0)✅ 可一次看完整个 2.4G ISM 频段(83.5 MHz)虽勉强但可用通道数2×2 MIMO✅ 可做双天线测向(干涉/相位差)ADC12-bit灵敏度够用接口USB 3.0⚠️ 树莓派的瓶颈在这里 2. 树莓派的瓶颈(⚠️ 关


Flink技术实践-FlinkSQL Join技术全解
大大大大晴天️2026/4/15

一、背景介绍 在离线批处理场景中,编写一个 Join SQL 是再平常不过的操作——两张有限的数据集,在某个键上关联,输出结果。但当你把这套 SQL 语义移植到实时流处理场景时,一切都变了。 特性批处理 Join流处理 Join数据特征有限、静态、全量数据集无限、动态、无界数据流执行模式一次性全量匹配,结果固定持续计算,结果随新数据实时更新状态管理无需长期状态,计算完成即释放必须维护历史状态以匹配未来数据时间维度无时间概念,基于完整数据集强依赖事件时间 / 处理时间处理乱序与延迟计算成本可预


当代码不再为人而写:Claude Code 零注释背后的 Harness 逻辑
mCell2026/4/7

前几天 Claude Code 因为 sourcemap 没关,导致源码被公开。这件事在技术圈引起的讨论密度很高,因为这种真正跑在生产环境里的闭源通用 Agent 产品,它的内部实现本身就是一份高价值的学习材料。 我看了一些解析文章。有讲它设计模式的,有分析它安全边界的,也有拆解 Prompt 架构的。 但有一个细节我反复确认了一下: Claude Code 内部要求,不要写任何注释。 第一反应是反直觉。 注释难道不是为了理解代码吗?我从写代码以来接受的教育就是:复杂逻辑要写注释,接口参数要写注


C# 基于OpenCv的视觉工作流-章43-轮廓匹配
sali-tec2026/3/29

C# 基于OpenCv的视觉工作流-章43-轮廓匹配 本章目标: 一、匹配原理; 二、模板创建; 三、模板匹配; 本章与章41模板匹配基本相似,在章42基础上,先对图像进行边缘检测,提取轮廓,以轮廓制作模板,匹配时也先对原图进行边缘检测,提取轮廓,最后再进行匹配。整体不同处在于先对图像进行预处理,好处在于匹配适应性更高,对光线明暗不同的图像也能进行更好的匹配。 一、匹配原理 章41已介绍,不再详述; 二、模板创建 边缘检测、轮廓提取在前文章节已介绍,不再详述; 三、模板匹配 参考章42;


OpenCodeUI 让你随时随地 AI Coding
三金得鑫2026/3/21

Hi,大家好,我是三金~ 自从用了 OpenCode + OMO 之后,写起代码来如沐春风,特别得劲!(除了比较烧 token) 但是 TUI 用久了之后吧,又有了一点别的想法: 能不能远程链接?让我随时随地都能 AI Coding。 Web 界面要“看着顺眼、点起来顺手” 所以当我在 L 站看到有佬友开源 OpenCodeUI 的时候,第一反应就是:许愿许成功了? OpenCodeUI 是 OpenCode 的第三方 Web 前端界面。它和 OpenCode 的客户端有点像,整体风格偏简约

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 聚合阅读