Flipfile:整理相册,不是清理空间
Flipfile 的玩法很简单:一张张看照片,上滑丢进回收站,下滑归进相簿。
它最早叫 Swipe,第一个提交里给它的定位是一个 swipe-to-clean 的照片 App,也就是滑一滑、清理照片。开工七周后,产品文档的第一段定位变成了:帮用户整理照片库,不是帮用户清理存储空间。删除只是整理的结果之一,空间释放是删除的副作用,两者都不是产品目的。
为什么不显示「释放了 3.2 GB」
那次讨论功能的时候,agent 给的改进建议一条条往「空间释放」上靠:展示 GB、做大文件维度。我一条条否掉了。
原因是:一旦展示 GB,产品重心就会滑向「清理」,用户会去找最大的视频删,而不是一张张看完。整理的终点是每张照片都有归属:在某个相簿里、在回收站里,或者在「未整理」里。没有第四个地方。为了守住这一点,后来连「标记为系统收藏」「仅确认保留」这两种下滑模式都删了:它们让照片离开「未整理」,却不放进任何相簿,照片就变得哪里都不在。
同一次讨论里我也否掉了「请求评分」。七周后改了主意:各商店评分都是 0,搜「swipe」排不进前 190,而评分是排名的一部分。改成只用系统的评分框,只在看完一组、累计归档 20 张以上时问一次,每个版本最多一次。
几个关键决定
- 完全不联网。 没有服务器、没有账号、没有统计和广告,只有买断要经过 App Store。代价是免费额度没法跨设备同步:换手机后计数归零。我接受这个代价,因为要堵这个洞就得引入 iCloud 存储,等于给一个不联网的 App 加上网络行为。
- 删除走系统接口。 照片进「最近删除」,30 天内能恢复。早期 App 自己也弹一个确认框,和系统的确认框叠在一起,而系统框里安全的那个选项叫「不允许」,很容易点错,所以把自己的删了。
- 保存即时,删除攒着。 下滑归进相簿立刻生效;上滑的照片先进回收站,可以反悔,在回收站里点一次「删除 N 张照片」,系统只弹一次确认。
- 免费额度存在钥匙串里。 存在普通设置里,卸载重装就能重置额度,付费墙形同虚设。在系统确认框里取消的删除不计数。
- 一次买断,开家庭共享。 不做订阅。
免费额度改过一次
一开始只有删除计入免费额度,归进相簿不限量。结果是主要用来归相簿的人永远碰不到付费墙,而归相簿正是这个 App 的核心动作。1.8.0 起改成归进相簿和删除合计前 100 张免费:撤销一次归档退回一张,把照片从一个相簿换到另一个不计数,更新之前归的照片不追溯,所以没有人一更新就撞墙。
改名
Swipe 这个名字在商店里搜不到:搜「swipe」在美国、中国、英国、日本都排不进前 190,名字里带 Swipe 的 App 有几十个,最大的一个在美区有九万多个评分。1.6.0 改名 Flipfile,换成一个只属于它的词。仓库、Bundle ID 和内购都没改,只改了用户看得见的名字。
英文商店名后来又改成了 Flipfile: Swipe Photo Cleaner。美区搜「organize photos」「sort photos」这类整理词,排第一的同类滑动 App 叫 Slidebox: Photo Cleaner App;名字里只写整理,Flipfile 只有「sort photos」一个词进了榜。商店名向搜索让步,App 本身的决定没变:不显示 GB,删除只报张数。
踩过的坑
- 过审后在后台压了一天。 1.1.0 的发布方式是默认的「手动」,过审后没人点发布。教训写进了 Swipe 仓库的规则,但只写在那里;一周后小豆记账踩了同一个坑。之后才有了一个所有 App 共用的知识库,所有版本都设成过审自动发布。
- 「凭原理先改」改坏了两次。 滑动手势调了几轮,有两次是 agent 按推理改的:给弹簧手动加初速度、让卡片沿松手的方向飞出去,结果手感都更差。之后定了规矩:先写下四个方向的不变量,涉及方向和弧线的改动,用真机录下来的拖动轨迹回放来验证,不再凭原理改。
- 一个只是看起来有用的测试配置。 StoreKit 的测试配置文件只有通过 scheme 的测试动作才会生效,而仓库里没有共享的 scheme。它在仓库里放了两天,看起来有覆盖,实际上从来没被用到,发现后删了。
删光测试
8 月底我删掉了这个项目的全部测试。理由是:能写出正确的测试,就说明已经想清楚了代码该怎么写,而想清楚到这个程度的代码本来就不该错。改成的做法是「跑起来看」:每个改动在模拟器或真机上实际操作,拿截图当证据。
这有代价,提交记录里也写了:当天早些时候有一个扇形排列的几何 bug,肉眼看不出来,是把同一条断言在每一种相簿数量下都跑一遍才发现的。
现在
181 次提交,其中 157 次和 Claude 一起完成;提审基本也由 agent 通过 App Store Connect API 完成,例外是备案信息对不上的时候,要在网页上点一次确认。现在的版本是 1.8.0,App 有七种语言,商店介绍有 13 种,在 175 个国家和地区上架。