小组件设计笔记:一天五个时刻,以及为什么上面没有删除按钮
桌面小组件是 拾缕 里最「外向」的部分:它替 App 站在锁屏和首屏上,把相册的近况讲给你听。这篇手记记录它的几条设计决定。
一天五个时刻
小号小组件不是一张静态卡片,而是一份随时间轮换的「节目单」:
- 清晨 · 回忆 — 多年前的今天,一张旧照片配当时的天气;
- 上午 · 互动整理卡 — 带一个「✓ 保留」按钮,轻点即把下一张待整理照片标记为保留;
- 午后 · 连击 — 连续整理天数与进度,「相册正在变轻」;
- 傍晚 · 故事 — 引导去读今天的故事;
- 晚间 · 待删提醒 — 只显示数量,点按直达 App。
同样是「进度」,早上讲是鞭策,晚上讲就是压力。把信息放进对的时刻,比把所有信息塞进一屏更重要。
11 种状态与回退链
小组件的输入只有一份:主 App 写入 App Group 的快照(进度、连击、回忆、故事摘要、压缩到 512px 的缩略图)。快照里少任何一块,界面都不能出现「空白面板」。所以我们给每个版位定义了回退链——没有回忆就回退到故事视觉,没有故事就回退到引导卡,11 种状态逐一截图归档、逐一验证。
Widget 的照片预览由主 App 提前准备。互动保留写入共享事务账本并通过 StoreKit 验证权益;相册权限与真正删除仍由 App 处理。
为什么上面没有删除按钮
删除永远发生在 App 内,经过 iOS 系统确认。
这是从第一天就定下的硬规矩。整理是在轻松的心态下做判断,删除则值得一次郑重的确认;把删除从桌面上拿掉,是给「误触」留出物理距离。小组件上唯一的写动作是「✓ 保留」——它通过 iOS 17 的交互式组件(AppIntent)直接写入共享的决策存储,连 App 都不用打开。
深链与状态恢复
每个版位点击后通过 photokeep:// 深链回到对应界面:回忆进日历、提醒进整理、故事进故事页。主 App 侧则在决策变化、故事生成、退后台等时机重写快照并刷新时间线,进程重启后再从本地缓存找回最近的故事摘要,保证「你刚看过的一句话」不会凭空消失。
相关的技术边界在上一篇:「每日故事」是怎么写出来的。