从 SwiftUI 到 ArkUI:我把一个慢性病记录 App 移植到鸿蒙的真实经历

起因

我妈每天早上量血压,量完袖带一扔就进厨房了。数据从来不记。月底去复诊,医生问"最近血压怎么样",她的回答永远是"还行吧,偶尔高一点"。这个"偶尔"到底是几次、高到多少、有没有漏药——没人说得清。

我之前在 iOS 上做了一个叫「健康手账」的 App,核心就是解决这件事:录入够快、趋势可视化、用药别靠记忆。今年决定做鸿蒙原生版本,这篇文章记录一下技术选型和迁移过程中的实际体验。

为什么选择做鸿蒙原生而不是套壳

家里长辈用华为手机的比例远超我预期。后台收到最多的反馈就是"什么时候出安卓版",而这些用户拿的大多是 Mate 60、nova 系列——本质上已经是纯血鸿蒙的目标机型了。

做原生还有一个很实际的动机:分布式数据管理和原子化服务这两个能力,在健康管理场景下确实比套壳方案有质的提升。iOS 版我依赖 Apple Watch 做血压趋势通知,迁移到鸿蒙后用了分布式数据管理配合华为穿戴设备,数据在手机、平板、手表之间自动同步,不用手动导入导出。这比 HealthKit 的单向同步链路灵活得多。

ArkUI 声明式开发:和 SwiftUI 的异同

记录页的核心交互是"输入血压数字 → 立刻看到分级色块"。用 ArkUI 的声明式写法实现这个逻辑很自然,状态驱动视图刷新,不需要手动 reload。贴一段血压分级卡片的核心代码:

@Component
struct BPGradeCard {
  @State systolic: number = 0
  @State diastolic: number = 0

  get gradeColor(): ResourceColor {
    if (this.systolic >= 180 || this.diastolic >= 110) return '#FF3B30'
    if (this.systolic >= 140 || this.diastolic >= 90) return '#FF9500'
    if (this.systolic >= 130 || this.diastolic >= 85) return '#FFCC00'
    return '#34C759'
  }

  build() {
    Column() {
      Text(`${this.systolic}/${this.diastolic} mmHg`)
        .fontSize(28)
        .fontColor(this.gradeColor)
      Text(this.getGradeLabel())
        .fontSize(14)
        .margin({ top: 4 })
    }
    .padding(16)
    .backgroundColor('#1A' + this.gradeColor.toString().slice(1))
    .borderRadius(12)
  }
}

如果你写过 SwiftUI,会发现 ArkTS 的声明式写法上手很快。@State/@Prop/@Link 三件套对应 SwiftUI 的 @State/@Binding/@ObservedObject,思维模型几乎一致。布局方面 ArkUI 没有 GeometryReader 这种灵活但容易写乱的东西,Row/Column/Stack 的嵌套逻辑更直白。我个人感觉在复杂列表页上 ArkUI 比 SwiftUI 的 LazyVStack 更好调试。迁移成本比预想的低,有 SwiftUI 经验大概一周能写出完整页面。

用药提醒:后台代理提醒真的靠谱

用药提醒用了 HarmonyOS 的后台代理提醒(reminderAgentManager)。这个方案的好处是 App 被杀掉后提醒依然准时触发,不像 iOS 本地通知在某些机型上被系统节能策略吞掉。对于需要每天定时吃降压药的老人来说,这个可靠性是刚需。

依从率的计算逻辑很简单:实际服药打卡次数 / 应服药次数 × 100%,统计周期做成了 7 天、30 天、90 天三档。首页用一个环形进度卡片展示,家属一眼就能看到老人这周吃药是否规律,复诊时直接给医生看截图就够了。

原子化服务卡片:比 iOS Widget 更适合健康记录

这是我觉得鸿蒙在这个场景下体验优于 iOS 的地方。iOS 的 WidgetKit 本质是只读展示,交互极其有限;鸿蒙的服务卡片(Service Widget)支持点击区域直接跳转到对应的录入页面,还能在卡片上显示今天最新一条血压数据和分级状态。

对于我妈这种"量完就想赶紧记一下"的用户,桌面长按看到当前血压状态,点一下就进录入页,三秒搞定,不用翻 App 列表。这个使用路径的缩短在实际使用中效果非常明显。

其他功能点

做了多档案切换,一个家庭里通常不止一个人需要监测,数据完全隔离。PDF 报告导出用了鸿蒙系统的文件分享能力,生成后可以直接通过畅连或微信分享给远在外地的子女,复诊时也能用华为分享投到医生的平板上。

不足和后续计划

说一个明确的短板:第三方库生态还在建设中。图表组件我最终自己用 Canvas API 画的,没找到成熟度对标 iOS Charts 的库。不过自己画反而更可控,也不算大问题。

鸿蒙版目前已经在我家里三台设备上跑了两个月,数据同步稳定,提醒没漏过。接下来计划适配华为健康穿戴数据的自动导入,如果有做过 Health Kit 对接的同学欢迎交流。

项目里还有一些细节比如趋势图的异常点标注算法、标签关联洞察(吃了某种药后血压变化趋势)的实现思路,后续可以单独写一篇。

有问题欢迎评论区聊,也可以搜「健康手账」体验一下。

posted @ 2026-08-11 21:49  samexxx  阅读(12)  评论(0)    收藏  举报