0011 冰箱食材与临期提醒
- 状态:已采纳
- 日期:2026-10-20
背景
- #51 想「根据冰箱的菜推荐」。按食材找菜、整句输入已经做完,当时把「快过期提醒」当作库存管理先不做。
- 重新考虑后,记下冰箱里有什么、快过期时提醒,正好接上按食材找菜:提醒的落点就是「用这些能做什么」。
- 提醒要靠系统通知,网页推送在 iOS Safari 上需要先加到主屏幕,国内安卓浏览器也不可靠。
方案对比
| 问题 | 方案 | 取舍 |
|---|---|---|
| 做在哪 | 只做云食册 iOS | 本地通知稳定;网页版等有人用了再补清单 |
| iOS 和网页一起做 | 网页没有可靠的提醒,工作量翻倍 | |
| 到期日 | 每次手填 | 记一样东西要点好几下,坚持不下来 |
按食材给默认冷藏天数(shelf-life.json),可以改 | 一点就记好;天数只是参考,界面上写明以实际为准 | |
| 存储 | SwiftData FridgeItem,和收藏一样走 iCloud、软删除 | 多台设备看到同一个冰箱;CloudKit 生产环境要部署新 schema |
| 提醒 | 每样食材各推一条 | 一次买很多菜时会被刷屏 |
| 每天最多一条,汇总今天和明天到期的 | 到期前一天和当天各提醒一次,时间可调(默认 9:00) | |
| 服务器推送 | 要上传冰箱内容、维护推送服务,没必要 | |
| 权限 | 启动就申请 | 还没用冰箱就弹窗,容易被拒 |
| 用户打开「临期提醒」时才申请 | 冰箱页顶部问一次,也可以在「我的」里开关 | |
| 和找菜结合 | 改推荐排序,优先用快过期食材的菜 | 要同时改 TS 和 CookCore 并更新共享用例 |
| 「用冰箱里的做菜」「只用这几样做菜」把食材带进推荐 | 不动推荐逻辑;做菜页也能一键加上冰箱里的食材 |
决定
packages/data/shelf-life.json:default是没列出的食材(自己输入的)按几天估,items是词典里每样食材冷藏大约能放几天。测试检查词典里的食材都有。CookCore 读成CookData.shelfLife,文件不存在时按默认值(旧数据目录兼容),不改schemaVersion。- 云食册新增「冰箱」Tab:从词典点选或自己输入,放入时按默认天数算到期日;按「快过期(今天到后天)」「还新鲜」「已过期」分组,左滑「吃完了」移出(软删除),点开改到期日。
- 底部「用冰箱里的做菜」把没过期的食材带进推荐结果,「快过期」一组可以只用这几样;做菜页顶部可以一键加上冰箱里的食材。
- 临期提醒用
UNCalendarNotificationTrigger在本机排程,每次冰箱内容或提醒设置变化时整份重排,最多排 30 天;点通知进冰箱页。开关和时间存在本机(UserDefaults),不随 iCloud 同步,因为通知权限本来就是每台设备各自的。
影响
- 新增 SwiftData 模型
FridgeItem,上架前要在 CloudKit 控制台把开发环境的 schema 部署到生产环境。 - 隐私政策「收藏、浏览记录和偏好」一节要加上冰箱里的食材;提醒在本机排程,不收集新数据。
- 以后可以做:桌面小组件显示快过期的食材、做完菜后扣掉用掉的食材、按快过期食材调整推荐排序、网页版冰箱清单、拍小票识别。