当前位置: 首页 > article >正文

独立开发一个健康记录 App,聊聊 SwiftData 数据建模和拨轮交互的踩坑过程

起因我爸的血压本快记满了去年过年回家看到我爸床头那个写满数字的小本子——每天早晚量血压用笔记下来密密麻麻的。翻了翻有些字迹已经模糊了有些日期明显漏记了最关键的是每次去医院医生问最近血压怎么样他就翻本子翻半天找不到。我当时就想这事儿我能用 App 解决。市面上血压记录的 App 不是没有但我试了七八个要么界面花哨功能一堆但录入贼慢要么是那种需要注册登录还要订阅的。我爸那个年纪打开 App 点三下还没输进去数字他就不愿意用了。所以我做了「健康手账」核心目标就一个让录入血压这个动作在 3 秒内完成。拨轮录入为什么不用数字键盘说实话最开始我是做了数字键盘输入的。标准做法嘛一个 TextField弹出数字键盘输入收缩压、舒张压、脉搏三个字段。但我拿给我爸试的时候他的操作是这样的点输入框 → 键盘弹出来挡住了下面的内容 → 输错了一位要删掉重来 → 输完第一个不知道怎么跳到第二个字段。整个过程大概要 20 秒。后来我换成了拨轮Picker wheel的方案。就像 iOS 原生的时间选择器那种感觉手指一拨数字就定了。收缩压、舒张压、脉搏三个轮并排放拨到位直接保存。实测下来熟练之后真的 3 秒能搞定。这个拨轮我没有用系统的Picker因为系统 Picker 的触感和阻尼不太对拨动的时候有点飘。我自己用ScrollViewGeometryReader实现了一个带物理阻尼感的拨轮加了scrollTargetBehavior(.viewAligned)来做对齐吸附。调手感这事儿花了我大概两周改了无数次阻尼参数。SwiftData 建模一条记录要存多少东西数据模型我用的是 SwiftDataiOS 17 之后苹果推的新持久化框架比 Core Data 写起来舒服太多。一条健康记录的结构长这样ModelfinalclassHealthRecord{varid:UUIDvartimestamp:Datevarsystolic:Int?// 收缩压vardiastolic:Int?// 舒张压varpulse:Int?// 脉搏varweight:Double?// 体重varnote:String?vartagIDs:[String]// 关联的状态标签varprofileID:Stringdefault// 多人档案init(timestamp:Date.now,systolic:Int?nil,diastolic:Int?nil,pulse:Int?nil,weight:Double?nil,note:String?nil,tagIDs:[String][],profileID:Stringdefault){self.idUUID()self.timestamptimestampself.systolicsystolicself.diastolicdiastolicself.pulsepulseself.weightweightself.notenoteself.tagIDstagIDsself.profileIDprofileID}} 几个设计决策说一下**所有指标都是Optional。**因为不是每次录入都要填全部字段。有时候只量血压有时候只称体重。强制要求填完所有项在我看来是反人性的。**profileID 做多人档案。**这个需求来自我自己——我想在一个App里同时记我爸和我妈的血压。用 profileID 做区分查询的时候加个 filter 就行比搞多个数据库简单得多。默认值是 default这样老版本升级上来的数据不会丢。**tagIDs 关联状态标签。**这个是后来加的功能。我发现光记血压数字不够还得知道当天有没有吃药、有没有运动、有没有喝酒。这些干预行为我做成了可自定义的标签叫状态印章。预置了降压药、减脂餐、运动、好睡眠、黑咖啡这几个用户可以自己加。 记录和标签之间用 tagIDs 数组做松耦合关联没有用SwiftData的Relationship。说实话这个选择有点取巧——Relationship在SwiftData早期版本iOS17.0有一些诡异的 bug数据偶尔会丢关联我被坑过一次之后就改用ID数组了。虽然查询的时候多一步但至少数据稳定。 ## iCloud 同步给了开关让用户自己选 数据同步这块我纠结了很久。 健康数据是隐私数据有些用户不想上云但有些用户换手机的时候又需要数据跟过来。最后的方案是在设置里给一个 iCloud 开关默认关闭用户手动打开才走CloudKit。 实现上ModelContainer 初始化的时候根据UserDefaults里的标记来决定 cloudKitDatabase 是 .automatic 还是 .none。这意味着切换开关后需要重启App才能生效——这个体验说实话有点粗糙但SwiftData的ModelContainer一旦创建就没法改配置我暂时没找到更好的办法。 ##PDF就医报告这个功能意外地受欢迎 做这个功能的契机是我陪我爸去看心内科。医生问最近血压情况我掏出手机给他看App里的趋势图。医生瞄了一眼说你能不能打印出来我要放病历里。回来我就做了PDF导出功能。选一个时间范围App自动生成一份排版好的报告患者姓名、时间段、血压统计平均值、最高最低、趋势折线图、每日明细表。格式参考了医院里那些检查报告的排版A4 纸打出来医生一看就懂。 这个功能上线后反馈比我预想的好。有个用户给我发邮件说他每次去看诊前都会导一份医生看了直接说这个挺好以后每次都带着。 ##Siri快捷指令语音触发录入 后来加了AppIntents支持用户可以通过Siri说用健康手账记录健康数据来直接打开录入界面。实现上就是定义一个 AppIntent设置 openAppWhenRuntrue然后通过NotificationCenter通知主界面弹出录入面板。 这个功能的使用频率说实话不高但对于每天固定时间测血压的用户来说配合快捷指令的自动化比如每天早上7点自动弹提醒体验还是不错的。 ## 提醒功能的小细节 提醒不是简单的每天X点推一条通知。我做了按星期几选择的功能——有些用户周末不想被打扰有些用户只有工作日才规律测量。reminderDays 存的是一个 SetInt1到7对应周日到周六和Calendar的 weekday 对齐。 每次App回到前台的时候会重新调度通知ReminderScheduler.reschedule确保修改设置后能立刻生效。 ## 现在的情况和一些想法App在2024年上架AppStore买断制不搞订阅。 说实话下载量不大健康记录这个品类竞争挺激烈的而且很多大厂的App都免费。但我做的时候就没想过要靠这个赚大钱能覆盖开发者账号的年费就行。我爸现在确实在用每天早晚各记一次这就够了。 对了我正在做HarmonyOS版本。鸿蒙的项目结构已经搭好了用的Hvigor构建但ArkUI的自定义组件能力和SwiftUI还是有差距特别是拨轮那个交互在ArkTS里要重新实现一遍还在摸索中。等鸿蒙版做出来了再单独写一篇聊聊跨平台的适配经验。 如果你也在做健康类App或者对SwiftData的实际使用有什么经验欢迎评论区聊聊。

相关文章:

独立开发一个健康记录 App,聊聊 SwiftData 数据建模和拨轮交互的踩坑过程

起因:我爸的血压本快记满了 去年过年回家,看到我爸床头那个写满数字的小本子——每天早晚量血压,用笔记下来,密密麻麻的。翻了翻,有些字迹已经模糊了,有些日期明显漏记了,最关键的是&#xff1…...

EPANET水分配系统模拟工具:从入门到精通的完整指南

EPANET水分配系统模拟工具:从入门到精通的完整指南 【免费下载链接】EPANET The Water Distribution System Hydraulic and Water Quality Analysis Toolkit 项目地址: https://gitcode.com/gh_mirrors/ep/EPANET EPANET是全球水行业标准的水分配系统模拟软件…...

深度评测:GEO源码部署如何赋能企业AI搜索战略?爱搜索GEO营销系统实战验证

在生成式AI重塑信息获取方式的今天,企业面临着一个全新的战场:如何让自己的信息被ChatGPT、DeepSeek、文心一言等主流大模型准确识别、深度理解并主动推荐?这已不再是传统SEO的简单延伸,而是一场关于内容语义、数据结构和生态适配…...

独立开发一个存钱罐App,我用SpriteKit做了个硬币掉落动画,身边朋友最喜欢的就是这个

起因:记账App太多,存钱App太少 去年年底我想找一个纯粹帮我"攒钱"的工具。注意,不是记账,是攒钱——我想设一个目标,比如攒2万块去日本玩,然后每次往里扔点钱,看着进度条一点点涨上去…...

4GB显存也能流畅运行SDXL?揭秘Fooocus低配置AI绘图优化方案

4GB显存也能流畅运行SDXL?揭秘Fooocus低配置AI绘图优化方案 【免费下载链接】Fooocus Focus on prompting and generating 项目地址: https://gitcode.com/GitHub_Trending/fo/Fooocus 还在为高配置需求而放弃AI绘图梦想吗?Fooocus带来了革命性的…...

2025届毕业生推荐的六大AI科研工具实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 于内容创作范畴里,降低AIGC率有着重大意义,这表明得尽量削减算法生成…...

为什么92%的MCP 2026审计报告被监管驳回?——4大元数据缺失陷阱与ISO/IEC 27001:2022对齐方案

更多请点击: https://intelliparadigm.com 第一章:MCP 2026权限审计报告的监管驳回现状与根本动因 近期,多家金融机构提交的MCP 2026权限审计报告连续遭遇监管机构驳回,驳回率高达68.3%(据2024年Q2银保监科技合规通报…...

HaShiFlex架构:深度神经网络加速器的硬件革新

1. 深度神经网络加速器的硬件革命在移动设备和物联网终端爆炸式增长的今天,边缘计算对高效能神经网络推理的需求达到了前所未有的高度。传统GPU方案虽然灵活,但其功耗和延迟难以满足实时性要求严苛的场景。这催生了一个关键问题:如何在保持一…...

2026届毕业生推荐的五大AI学术神器推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在人工智能辅助写作的场景里,“降AI指令”是这种提示方法,它被用来降…...

如何免费激活Windows和Office:KMS智能激活工具终极指南

如何免费激活Windows和Office:KMS智能激活工具终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统频繁弹出激活提示而烦恼吗?Office文档突然变成只…...

Cursor Pro破解终极指南:3步实现永久免费使用AI编程助手

Cursor Pro破解终极指南:3步实现永久免费使用AI编程助手 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your t…...

内核代码学习

核心层: kernel, IPC MM FS NET架构层: arch include,通用头文件驱动与工具: drivers,char、block、usb、i2cuart辅助 Documentation lib samples init scripts定位内核入口 init/main.c/start_kernel()chi…...

基于Python与Telegram Bot构建丝滑AI对话机器人:架构设计与工程实践

1. 项目概述:打造一个丝滑的AI对话机器人 最近在折腾一个挺有意思的东西,一个基于Telegram平台的ChatGPT机器人。简单来说,就是让你能在Telegram这个全球流行的即时通讯软件里,像跟朋友聊天一样,直接和AI对话、画图&a…...

AgentEvolver:让大模型智能体具备自我进化能力的框架解析与实践

1. 项目概述:当模型学会“进化”,智能体开发进入新纪元 最近在探索大模型应用落地的过程中,我一直在思考一个问题:我们费尽心思设计的智能体(Agent),其能力边界是不是在创建之初就被锁死了&…...

避开STC15单片机PCA/PWM的那些坑:时钟源选择与占空比精度详解

STC15单片机PCA/PWM实战避坑指南:从时钟源配置到占空比优化的完整解决方案 第一次接触STC15W408AS的PCA/PWM功能时,我对着官方手册配置了半天,示波器上却始终看不到预期波形。直到深夜才发现问题出在时钟源选择上——这个看似简单的配置项&am…...

软件隐私性的数据保护与合规遵循

在数字化时代,软件隐私性的数据保护与合规遵循已成为企业和用户共同关注的核心议题。随着数据泄露事件频发和全球隐私法规的不断完善,如何确保软件在收集、存储和处理用户数据时既安全又合规,成为开发者与运营者的重要挑战。本文将从数据加密…...

2026年第十七届蓝桥杯网络安全赛项WriteUp

解题情况比赛还剩一小时左右时截图题型:情报收集题目名:map_tracer查看js源码得到信息,访问/app.js可以得到app.js.map文件用记事本打开,可以得到关键信息接口:/api/trace/internal/list签名值:trace_dev_2…...

认知战分析MCP服务器:数学模型驱动的信息对抗与叙事操控检测

1. 认知战与心理战分析:一个面向AI代理的MCP服务器深度解析在信息过载的时代,识别、分析和应对有组织的叙事操控,正成为从国家安全到企业品牌管理的核心挑战。传统的社会聆听工具只能告诉你“有多少人在讨论”,却无法回答“这是否…...

开源网盘直链解析技术方案:八大平台高效下载实现原理

开源网盘直链解析技术方案:八大平台高效下载实现原理 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云…...

八大网盘直链解析工具:告别限速,轻松获取真实下载地址

八大网盘直链解析工具:告别限速,轻松获取真实下载地址 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动…...

【Docker WASM边缘部署终极指南】:20年架构师亲授5大避坑法则与3个生产级优化技巧

更多请点击: https://intelliparadigm.com 第一章:Docker WASM边缘部署的核心价值与适用边界 为什么WASM正在重塑边缘容器范式 WebAssembly(WASM)以其沙箱安全、跨平台二进制可移植性及毫秒级冷启动能力,成为Docker在…...

动态加载JavaScript小部件的正确姿势

在现代网页开发中,动态加载JavaScript小部件是非常常见的需求,特别是在需要根据用户行为或URL参数来定制小部件内容时。今天我们来探讨一下如何正确地实现这一点。 背景介绍 假设我们有一个小部件,它可以通过特定的参数(如clientI…...

5分钟掌握Nintendo Switch游戏转储神器:NxDumpTool完整指南

5分钟掌握Nintendo Switch游戏转储神器:NxDumpTool完整指南 【免费下载链接】nxdumptool Generates XCI/NSP/HFS0/ExeFS/RomFS/Certificate/Ticket dumps from Nintendo Switch gamecards and installed SD/eMMC titles. 项目地址: https://gitcode.com/gh_mirror…...

Hotkey Detective:如何3分钟精准定位Windows热键冲突的终极指南

Hotkey Detective:如何3分钟精准定位Windows热键冲突的终极指南 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective …...

TFT Overlay:3分钟快速上手的终极云顶之弈智能决策辅助工具完全指南

TFT Overlay:3分钟快速上手的终极云顶之弈智能决策辅助工具完全指南 【免费下载链接】TFT-Overlay Overlay for Teamfight Tactics 项目地址: https://gitcode.com/gh_mirrors/tf/TFT-Overlay 你是否在玩《英雄联盟:云顶之弈》时经常手忙脚乱&…...

在Windows上安装Android应用:APK-Installer让跨平台应用管理变得简单

在Windows上安装Android应用:APK-Installer让跨平台应用管理变得简单 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想过在Windows电脑上直接运…...

ArchivePasswordTestTool:基于7zip引擎的高效压缩包密码自动化测试工具

ArchivePasswordTestTool:基于7zip引擎的高效压缩包密码自动化测试工具 【免费下载链接】ArchivePasswordTestTool 利用7zip测试压缩包的功能 对加密压缩包进行自动化测试密码 项目地址: https://gitcode.com/gh_mirrors/ar/ArchivePasswordTestTool 在数字资…...

Java+AI<初学者入门>

今天是我学习Java的第一天,因为我之前学过一段时间的C语言,所以看到视频教程里教学内容是输出hello world,我想起了我刚学c的时候有些怅然,我还是闲话少说,看一下我的学习成果吧。今天首先我先下载了Java25和Java idea…...

通达信缠论可视化分析插件:5分钟掌握专业级量化分析技术

通达信缠论可视化分析插件:5分钟掌握专业级量化分析技术 【免费下载链接】Indicator 通达信缠论可视化分析插件 项目地址: https://gitcode.com/gh_mirrors/ind/Indicator 还在为复杂的缠论分析而困扰吗?想要快速识别市场中枢结构却无从下手&…...

告别ImageNet预训练:用DINO-v2自监督ViT,在自定义数据集上也能训出好模型

突破数据瓶颈:DINO-v2自监督ViT在垂直领域的实战指南 当医学影像分析遇到标注数据不足,当工业质检缺乏足够样本,传统依赖ImageNet预训练的方法往往捉襟见肘。DINO-v2的出现,为这些垂直领域带来了新的曙光——无需海量标注数据&…...