【生活娱乐赛道】HealthPet 健康宠物 — 像素风运动养成手表应用(复赛作品)

一、自己 / 团队介绍

个人参赛

  • 你是谁:一名普通的前端开发工程师,日常主要写 JavaScript / TypeScript,做过 Web 应用、小程序、H5 活动页等,对 Swift 和原生 iOS / watchOS 开发其实一点不懂。

  • 为什么想做这个作品:自己戴了几年 Apple Watch,每天看着步数、心率、睡眠的数字,却从来没有"想主动去看"的动力。数据就在那里,但它们是冰冷的。我想做一个把这些数据"活起来"的东西——让每一步路、每一小时睡眠,都变成能被"看见"和"回应"的成长。

  • 擅长什么:前端交互设计、产品逻辑拆解、快速原型验证。擅长把复杂的业务逻辑拆成可执行的步骤,用最朴素的方式把想法落地。

  • Vibe Coding / 编程年限:编程年限 10 年,Vibe Coding 是这次比赛才真正深度体验的——以前都是自己查文档、啃语法,这次直接用 TRAE 边聊边写,效率提升真的很颠覆。

  • 性格 / 特点标签

    • :artist_palette: 「会做产品的前端」——不止写代码,更在意用户为什么要用、用了感觉怎么样

    • :owl: 「从零开始的 Swift 新手」——比赛前只在 Playground 里写过 Hello World

    • :puzzle_piece: 「TRAE 深度用户」——从TRAE IDE第一批用户,到TRAE Work深度使用,一路追随

二、产品简介:

是什么:

HealthPet 是一款基于 Apple HealthKit 健康数据生态的 watchOS 原生虚拟宠物养成应用,通过把用户的步数、运动、睡眠、心率、HRV 等数据游戏化为宠物成长和状态反馈,解决健康 App "数据好看但难坚持"的痛点。

面向谁:

  • 核心目标用户: 佩戴 Apple Watch、有健康管理意识但难以长期坚持的年轻人群(18–35岁)

  • 典型使用场景:

    1. 早起抬腕看手表,顺便看晨报,了解昨晚睡眠和宠物今日状态

    2. 白天走路运动,宠物跟着一起涨成长值,阶段升级时弹出庆祝动画

    3. 工作久了,宠物检测到 HRV 异常,弹出正念提醒让用户深呼吸

    4. 和好友配对后,首页同时展示两只宠物,互相"卷"步数和成长

完整功能清单与用户使用路径:

路径一:新用户首次使用

  1. 选择宠物(兔、猫、狗、虎、象、猪、蛇、羊,共 8 款)→ 免费用户可体验兔和猫的前两阶段

  2. 授权 HealthKit 读取步数、运动、卡路里、心率、HRV、睡眠

  3. 进入首页,抬腕即可看到宠物蛋,开始孵化

路径二:日常养成闭环

  1. 健康数据 → 成长值: 步数、运动时长、卡路里转化为成长值(公式:100 × 步数达成率 × 阶段系数 × 连续天数加成)

  2. 五阶段进化: 孵化期(0→300)→ 破壳期(300→800)→ 幼稚期(800→1800)→ 成长期(1800→3300)→ 少年期(3300→6600,少年期满后解锁成就)

  3. 四状态实时映射:

    • 兴奋:心率 > 静息心率 ×1.5 或 >100

    • 放松:心率 ≤ 静息心率 ×1.2

    • 压力:HRV < 静息 HRV ×60% 或 <20(连续 2 次触发正念提示)

    • 疲惫:昨晚睡眠 <6 小时 或 入睡时间凌晨 1–6 点(醒后 4 小时或心率+HRV 恢复后自动解除)

  4. 24 小时状态时间轴: 详情页展示彩色状态片段按实际时间定位的时间轴(最少 1pt 宽度),7 天历史留存

  5. 晨报功能: 次日打开 App 自动弹出昨日数据总结(步数、运动分钟、睡眠小时、成长值增加、昨日主导状态、时间轴)

  6. 阶段升级动画: 跨阶段触发全屏庆祝 overlay(3.5s),破壳期→幼稚期播放专属 GIF 过渡动画

  7. 少年期满庆祝: 成长值达 6600(少年期阈值 ×2)弹出成就 sheet,记录完成时间

  8. 宠物自定义命名: 详情页支持 8 字以内命名

路径三:社交与激励

  1. 通过邀请码生成 → 好友输入邀请码 → 自动配对(CloudKit 轮询匹配机制)

  2. 首页双宠物展示:左右并排显示自己和好友的宠物,点击好友宠物进入详情

  3. 好友详情:展示昨日步数、运动、卡路里、平均心率、睡眠、主导状态、状态分布、阶段信息

  4. 好友模式 Widget:表盘双宠物并排,随时可见

路径四:购买与完整解锁

  1. 免费用户完成破壳期(达 800 成长值)后自动弹购买引导

  2. $2.99 一次性购买:解锁全部 8 只宠物 + 完整 5 阶段(少年期与成就)

  3. 支持恢复购买,交易监听 + 状态回调(成功 / 取消 / 失败)

Widget 系统(2 种模式):

  • 个人模式: 宠物图 + 阶段名 + 进度条 + 今日步数 + 24h 状态时间轴

  • 好友模式: 左右并排两只宠物 + 各自阶段 + 各自成长进度

相比初赛 Demo 的升级:

维度 初赛 Demo 复赛成品
宠物体系 阶段数不完整,宠物种类少 8 款宠物 + 5 阶段完整成长体系(孵化→破壳→幼稚→成长→少年),少年期满成就系统
健康状态 只有简单心情 四状态精准映射(兴奋/放松/压力/疲惫),含状态解除条件、24h 时间轴、7 天历史、状态原因说明
新功能模块 晨报功能、正念提示(HRV 压力触发)、宠物自定义命名
社交功能 基础好友配对 邀请码配对 + 首页双宠物 + 好友昨日完整数据详情 + 好友模式 Widget
购买系统 简单规则 StoreKit 配置文件模拟支付($2.99)、购买弹窗、恢复购买、交易状态监听、免费版精准封顶(破壳期后触发购买引导)
动画体验 简单升级效果 阶段升级全屏庆祝 overlay、破壳→幼稚专属 GIF 过渡、少年期满成就庆祝 sheet、动画冲突排队机制(庆祝→晨报→正念 依次展示)
数据同步 基础本地存储 WatchConnectivity 手表手机同步、CloudKit 三层同步(UserProfile/DailyPetData/UserAchievements)、App Group 共享给 Widget、成就三重备份(本地+App Group+CloudKit)
适配优化 小屏未适配 40/41mm 小屏与 44/45mm 大屏差异化布局、渐变背景高度自适应、所有元素按屏幕尺寸动态调整

三、产品演示视频:

3.00 复制打开抖音,看看【HealthPet Buddy(已上线)的作品】HealthPet 健康数据宠物养成 # trae… https://v.douyin.com/UUz-6aPYRS0/ :6pm 05/10 HIV:/ k@P.XZ

四、产品创作历程:

灵感诞生:从"圆环焦虑"到"宠物伙伴"

最开始做这个产品的动机很简单——我自己每天盯着 Apple Watch 的三个圆环看,达标了就开心,没达标就焦虑。但开心和焦虑都很短暂,第二天还是一样。我就想:能不能让这些数据变成一个"活的东西",你对它好(走路、睡觉),它就对你好(开心、长大)?

最开始的雏形就是一行 Swift 代码:读取步数,然后把数字映射成一个蛋的大小。后来发现光有大小不够,得有阶段、有情绪、有反馈——这样才像"养东西"。

初赛 Demo:验证核心循环

初赛阶段我主要验证了三件事:

  1. HealthKit 数据能不能稳定读取:步数、心率、睡眠这些,TRAE 帮我快速生成了完整的 HealthKitService,包括授权和读取,省了大量查文档的时间。

  2. 成长值公式是否合理:最开始的公式很简单,后来加了阶段系数和连续天数加成,解决了"后期越来越难升"和"断一天就废了"的体验问题。

  3. watchOS 小屏 UI 能不能放下核心信息:用 TRAE 生成首页渐变背景 + 像素宠物的布局,一次就对了。

初赛的核心问题:状态只有开心/普通/饿,太粗糙;好友系统和购买完全没做;阶段进化没动画,用户没惊喜感。

复赛打磨:从 Demo 到成品

复赛阶段我重点做了"系统的完整性"和"体验的颗粒度":

关键问题 1:怎么让健康数据"有情绪"? 解决思路:不能只看步数,要把心率、HRV、睡眠都用上,而且每个状态要有"为什么"——用户看到宠物兴奋,得知道是因为心率高了;看到压力,得知道是 HRV 异常;看到疲惫,得知道昨晚睡了 5 小时所以困。然后加了状态持续时间和原因说明,让反馈不是黑箱。另外加了 24 小时状态时间轴,用户一眼就能看到"今天下午 3 点我压力最大"。

关键问题 2:正念提示和阶段动画同时弹会崩怎么办? 这是个真实的 bug:连续压力状态触发正念 sheet,同时成长值到了触发庆祝 overlay,两个同时弹就会 sheet 出不来。后来用 TRAE 讨论后加了动画锁 isAnimationPlaying 和待展示队列 pendingMindfulnessPrompt——庆祝动画完 → 晨报 → 正念,依次排队展示,解决了冲突。

关键问题 3:好友系统怎么配对最自然? 最开始想扫码,但 watchOS 没摄像头;想摇一摇,但用户不在身边不行。最后选了邀请码方案:一方生成 6 位码,另一方输入,CloudKit 轮询匹配 20 次(约 2 分钟内完成)。配对后双方首页自动显示双宠物,不打扰但随时可见。

设计决策:免费版为什么卡在破壳期? 最初想做订阅制,但用户为养成宠物付月费心理门槛太高。然后改成一次性买断 $2.99。卡在破壳期结束(800 成长值)是因为:刚孵化完用户刚产生情感连接,这时候告诉她"继续养下去需要解锁",转化率会比一开始就付费高得多。免费体验到破壳期大概是 2–3 天,刚好是"习惯养成临界点"。

五、TRAE 实践过程:

完整开发流程:

阶段一:项目基础 + HealthKit 集成

  1. TRAE 创建 Xcode 项目,选择 watchOS App + Widget Extension

  2. 生成 HealthKitService.swift:6 类健康数据(步数/运动/卡路里/心率/HRV/睡眠)的读取方法,授权逻辑

  3. 配置 entitlements(HealthKit = true,health-records 权限)、Info.plist 两个 Usage Description key

  4. 生成 PetViewModel.swift 基础结构,状态管理 + 成长值计算

阶段二:核心养成系统 5. 定义 PetStage.swift:5 阶段阈值(0/300/800/1800/3300)、阶段系数、图片名、进度计算 6. 定义 PetType.swift:8 款宠物 + 颜色 + 名称 7. 实现 calculateGrowth() 统一公式 + 增量计算逻辑(避免升级后系数变化导致计算错误) 8. 四状态映射系统:兴奋/放松/压力/疲惫判定逻辑 + 解除条件 + 状态优先级 9. StateHistoryService.swift:7 天状态记录、24h 时间轴片段生成

阶段三:UI + 动画 + 新手体验 10. HomeView.swift:渐变背景(28pt 圆角 + 8pt 水平对称 padding + 小屏 100pt/大屏 130pt 高度)、左右滑动手势、无标题栏设计 11. 阶段升级庆祝 overlay:3.5s 全屏动画,破壳→幼稚期额外播放 GIF 12. 晨报功能:MorningReportView.swift + 展示时机控制(动画结束后才展示) 13. 正念提示:连续 2 次压力状态触发,含防频繁(每天最多 1 次)和动画冲突排队 14. 宠物命名、切换宠物(重置确认 + 成长值警告)

阶段四:好友 + CloudKit 15. CloudKitService.swift:三个 RecordType(UserProfile/DailyPetData/UserAchievements)+ 字段管理 16. 邀请码生成 + 输入 + 轮询匹配机制(20 次 max) 17. 首页双宠物布局 + 好友详情页(昨日完整数据 + 状态分布) 18. 每日数据自动上传(凌晨后首次启动 + 回到前台时检查)

阶段五:购买 + Widget + 细节打磨 19. HealthPet.storekit:$2.99 非消耗品,中英双语 20. PurchaseService.swift:交易监听、产品缓存、静默恢复购买、PurchaseResult 三态 21. Widget:个人模式 + 好友模式,App Group 共享数据 22. 小屏适配:所有间距/字号/图片尺寸根据 WKInterfaceDevice.screenBounds.height < 220 判断动态调整 23. 成就系统:少年期满庆祝 + 三重备份(本地/App Group/CloudKit)

开发关键步骤截图(不少于 3 张):

关键任务对话 Session ID(不少于 3 个):

  • 6a463e9f97c66048c3f0e4ec — 修复 App 与 Widget 宠物阶段显示不一致问题,涉及 HealthKit 数据同步 + App Group 写入 + Widget 刷新时序

  • 6a43bebe4b9b26049e70ac48 — 阶段升级动画、StoreKit 购买流程(.storekit 文件 + PurchaseService + 购买页 UI + 免费版封顶逻辑)设计与实现

  • 6a489ba00226c91d6fcf3af2 — CloudKit 好友系统(邀请码生成/匹配/轮询)、好友首页双宠物布局、好友详情页、好友模式 Widget 开发 + Xcode target 归属修复

技术方案分享 + 商业化 + 迭代规划

技术栈与关键实现思路:

模块 技术选型 关键实现
平台 SwiftUI + watchOS 10.2 纯 SwiftUI,无 Storyboard
数据层 HealthKit + UserDefaults + App Group HealthKitService 统一读取,UserDefaults 本地持久化,App Group 共享给 Widget
云同步 CloudKit Public Database 三个 RecordType:UserProfile(实时成长/好友码)、DailyPetData(昨日快照)、UserAchievements(成就备份)
支付 StoreKit 2 + .storekit 配置文件 本地模拟,支持恢复购买,交易 listener 监听
状态系统 优先级枚举 + 触发原因记录 PetState 含 priority 属性,每次转换记录 trigger(heartRate/hrv/sleepAnalysis)
状态时间轴 百分比位置 + 最小宽度兜底 24h 线性映射,每段最少 1pt 宽避免窄到看不见
冲突处理 动画锁 + pending 队列 isAnimationPlaying 为 true 时,晨报/正念进入 pending,动画结束后依次触发
Widget WidgetKit + App Group 每 15min 刷新,从 App Group 读取预计算好的全部字段(避免 Widget 内部再算)

商业化与社会价值分析:

商业化:

  • 当前模型: 免费体验(兔/猫 + 孵化期/破壳期,约 2–3 天)→ $2.99 一次性买断(8 宠物 × 5 阶段 + 成就系统)

  • 未来扩展(按优先级排列,已结合食物系统 & 远征冒险设计文档):

    1. 宠物食物系统(首当其冲): 每日步数达标 80% → 发 :hiking_boot: 达标零食(+10 成长),每 10 分钟运动 → 发 :person_running: 能量棒(+15 成长,日上限 5 根),昨晚睡眠 6–9h → 发 :sleeping_face: 睡眠饼干(+20 成长);手动投喂带三阶段动画(食物飞行 → 宠物咀嚼弹跳 → 成长飞字入账),形成"努力运动换零食 → 零食喂宠物长大"的双向激励闭环

    2. 远征冒险系统: 幼稚期及以上解锁,每日凌晨 6:00 自动刷出 1/2/3 天连续任务(Easy 65% / Normal 30% / Hard 5%,Hard 连续 8 次保底),三目标(步数/运动/睡眠)全勤完成后一次性领取成长值奖励(Easy +25 / Normal +60 / Hard +120 + 金星成就);5 张地图皮肤(森林/溪流/山丘/沙漠/雪山)收集成就,通关后可设为首页背景;每 10 分钟运动叠一层 :cyclone: 速度加成,最多 5 层等效 25% 视觉加速

    3. 宠物扩展包(Season Pass): 每季度推出新宠物主题包(如海洋系列、节日系列、十二生肖系列),$0.99 每个

    4. 轻社交(好友挑战 & 排行榜): 约定周末步数挑战、好友内周步数榜、互相寄养宠物

  • 预期转化: 参考同类养成 App,破壳期卡付费点预计免费→付费转化率 5–8%,食物系统和远征系统的日活驱动效果可将付费转化率再提升 2–3 个百分点

产品迭代规划:

V1.1(上线后 1 个月):手机端优先优化

  • 现有 watchOS App 功能全部平移到 iPhone 端详情 App

  • iPhone 端新增:7 天状态热力图、宠物成长相册(自动保存阶段进化截图)、历史晨报归档

  • 双端数据通过 WatchConnectivity + CloudKit 实时同步

  • 小屏大屏 UI 适配再打磨

V1.3(3 个月):食物系统上线

  • :hiking_boot: 达标零食(步数≥80% 目标,1 个/天,+10)、:person_running: 能量棒(每 10 分钟运动,上限 5 根/天,+15)、:sleeping_face: 睡眠饼干(睡眠 6–9h,1 块/天,+20)

  • 三档库存上限 30,跨天增量快照发放(防重复)

  • 步数 / 投喂页横滑 TabView 两页切换:Page 1 双宠物 + 步数,Page 2 单宠物 + 三食物按钮

  • 三阶段投喂动画(总时长约 1.1s):

    • 阶段 A(0–500ms):食物图标从对应按钮位置沿抛物线飞到宠物嘴巴

    • 阶段 B(400–900ms):宠物两次小幅弹跳 + happy 表情 + 嘴巴位置黄色星光闪光

    • 阶段 C(600–1100ms):头顶飘出绿色 “+10/+15/+20” 成长飞字渐隐上飘

    • 与阶段升级庆祝动画共存:投喂不占 isAnimationPlaying 锁,但庆祝播放时投喂进 pending 队列

  • 食物获得飞字提示(非投喂场景,来自每日结算)

V1.5(5 个月):远征冒险系统上线

  • 幼稚期(baby)以上解锁,孵化期/破壳期锁定

  • 每日 06:00 自动刷新一个新任务(:game_die: 换任务移除,只能接受或等明天),抽卡 65/30/5 权重 + Hard 保底

  • 3 档每日目标制(非累计),连续 N 天全达标一次性发总奖:

    • :green_circle: Easy:1 天,步数≥6000 / 运动≥15min / 睡眠≥5h → 奖励 +25

    • :yellow_circle: Normal:2 天,步数≥8000 / 运动≥30min / 睡眠 6–9h → 奖励 +60

    • :red_circle: Hard:3 天,步数≥12000 / 运动≥60min / 睡眠 7–8h(严格区间)→ 奖励 +120 + 成就页该地图 :star: 金星

  • 5 张纯皮肤地图(:evergreen_tree: 森林小径 / :ocean: 溪流浅滩 / :snow_capped_mountain: 草原山丘 / :desert: 沙漠绿洲 / :snowflake: 雪山小路)

  • 首页 / 远征页横滑两页 TabView:Page 1 地图背景 + 双宠物 + 迷你远征进度,Page 2 仅单宠物 + 任务卡片(Day1 :white_check_mark: / Day2 :white_large_square: 勾选 + 三目标进度)

  • :cyclone: 速度加成:每 10 分钟运动叠一层,最多 5 层 = 显示倒计时等效加速 25%(实际 deadline 不变防作弊)

  • 成就页新增「已收集地图」Segment:设为背景 / :star: Hard 金标 / 默认渐变 / 取消手动锁

  • 每日三目标睡眠判定:前 1 天完成记录的昨日睡眠统一由 HealthKitService 打包好 HistoricalHealthWindow,彻底隔离日期匹配逻辑

V2.0(8 个月):轻社交方向

  • 好友挑战:约定"周末一起走 2 万步"或"本周都睡 7 小时",完成后双方宠物解锁限定状态特效

  • 好友排行榜:周步数榜、月成长值榜、远征通关速度榜

  • 访客模式:临时让朋友"寄养"自己的宠物一天,对方健康数据也能为宠物涨成长值

  • 血氧、经期追踪、正念分钟数加入成长计算维度(可选开启)

  • 更深度的 iPhone 端数据分析:每周健康报告、月度习惯复盘、状态与健康数据的相关性提示

1 个赞

想问下作者这里宠物的像素风是纯ui搓出来的吗?还是有喂过一些图片

ai生成的图片