摘要:日记、情绪与生活习惯都属于高度私人的数据。本文以心晴手记为例,介绍本地优先 App 的产品价值、技术架构、数据导出、应用锁与删除机制,也诚实讨论无云同步带来的局限。
关键词: 本地优先、Local-first、iOS 隐私、SwiftData、无账号 App、数据导出、Face ID
当你在日记 App 里写下"今天很累",这句话会被发送到哪里?
它是否需要注册账号?是否会上传服务器?是否接入了广告或分析 SDK?删除账号以后,记录真的被删除了吗?
对普通工具来说,这些也许只是隐私政策中的几行字;但对情绪日记来说,它们直接决定用户是否愿意写下真实内容。
因此,我在开发 心晴手记(MoodMemoir) 时,从第一天就选择了"本地优先"。
什么是本地优先?
本地优先不只是"支持离线使用"。
它意味着:
- 用户不注册账号也能使用核心功能;
- 记录默认写入用户自己的设备;
- 断网不会破坏核心体验;
- 用户能够导出和删除自己的数据;
- 云端能力如果未来加入,也应当是可选增强,而不是使用前提。
对心晴手记而言,核心路径完全在本地完成:
text
记录心情 / 日记 / 习惯
↓
SwiftData 存储
↓
本地历史与趋势聚合
↓
Swift Charts 展示结果
没有登录接口,也没有业务服务器参与。
为什么情绪日记尤其适合本地优先?
1. 用户需要安全感,才能诚实记录
日记内容可能涉及工作、人际关系、家庭和真实情绪。只要用户对数据去向有疑问,就会下意识地自我审查。
本地存储无法解决所有安全问题,但它至少让数据边界更简单、更容易解释:核心记录留在设备中。
2. 每日记录不应该依赖网络状态
睡前、通勤、旅行或网络不稳定时,用户仍然应该能够记录。一个每天只需要 30 秒的工具,如果打开后还要等待登录状态和接口响应,轻量感会迅速消失。
3. 第一版不必为"未来可能需要"付出复杂度
账号、服务器、同步冲突、密码找回、合规与运维都是真实成本。
如果第一版的核心目标只是验证用户是否需要"情绪 + 习惯"的轻量记录方式,那么先构建完整的本地体验,比过早搭建云端体系更合理。
技术上如何实现?
SwiftData:承担核心持久化
心情记录、习惯和每日打卡分别建模,通过 SwiftData 保存。SwiftUI 页面使用 @Query 读取数据,在数据变动后自动更新界面。
数据模型只保存完成产品功能所需的字段,不为了"以后做大数据分析"提前采集额外信息。
Swift Charts:在设备上完成聚合展示
最近 7 天和 30 天的心情分布、常见标签和习惯完成率都从本地记录计算。
这类统计不需要把日记上传到服务器,也不需要第三方分析平台参与。
UserNotifications:提醒也不需要服务器
用户主动开启提醒后,App 通过 iOS 本地通知每天在指定时间提醒记录。关闭提醒时,待发送通知会被取消。
LocalAuthentication:给访问再加一道门
用户可以开启应用锁,通过 Face ID、Touch ID 或系统支持的设备认证方式保护入口。
它不能替代系统级安全,但能避免别人拿到已解锁手机后直接打开私人日记。
本地优先必须同时提供"数据自主权"
只把数据存在手机里还不够。如果用户无法取出数据,本地数据库也可能变成另一种封闭孤岛。
所以心晴手记提供:
| 操作 | 用途 |
|---|---|
| 完整 JSON 导出 | 保存情绪、日记、习惯和打卡数据,适合备份 |
| 心情 CSV 导出 | 用表格查看日期、心情、日记和标签 |
| 删除全部数据 | 经过确认后清除本地记录 |
真正尊重隐私,不是简单地说"我们不会看",而是让用户知道数据在哪里,并且随时能够带走或删除。
我没有接入哪些东西?
当前版本没有:
- 账号注册;
- 后台服务器;
- 第三方广告;
- 第三方行为分析;
- AI 心理分析;
- 社交社区。
功能越少并不天然代表越安全,但依赖更少、数据路径更短,确实让隐私边界更容易审查和说明。
必须诚实面对的局限
本地优先不是万能答案。
当前没有云同步意味着:
- 多台设备之间不能自动同步;
- 删除 App 或设备损坏可能导致未备份数据丢失;
- 换机前需要主动导出备份;
- 无法在网页或 Android 端实时查看同一份数据。
这些不是应该藏在宣传文案后面的"小字",而是用户做选择前需要知道的信息。
未来如果加入 iCloud 或 CloudKit,我仍希望坚持三个原则:默认清楚、同步可选、数据可导出。
本地优先适合所有 App 吗?
不适合。
多人协作、即时通讯、跨设备实时同步或依赖服务端内容的产品,本身就需要云端能力。但对于个人日记、习惯追踪、离线工具和敏感信息记录,本地优先值得成为架构讨论的起点。
在写第一行服务端代码之前,可以先问:
用户完成最核心的任务,真的必须把数据发送给我吗?
写在最后
隐私不是设置页里的一个开关,而是产品从数据模型、依赖选择到商业模式共同形成的结果。
心晴手记选择本地优先,不是因为服务器做不到,而是因为对一款私人记录工具来说,"少知道一点"本身就是一种产品价值。
体验入口: 下载或申请体验心晴手记