我做了个不要账号、不要定位权限的旅行 App,聊聊那些「不做」的决定

闲时整理相册,翻到 过去拍的旅行照片。四千多张,一张都没发出去过。

不是不想发。是不知道该怎么发------九宫格太随意,长图太隆重,发单张又觉得少了点什么。那些照片就一直躺在相册里,一年一年地往下沉。

于是我开始写 TripStamp。想法很简单:选一张旅行照片,配上地点、日期和从照片里提取的颜色,做成一张卡片。

做到一半我发现,真正花时间的不是做功能,是决定不做什么。

不做账号体系

最早的版本我是打算做云同步的。用户换手机,作品能跟过来,听上去很合理。后来我把这个想法删了。

做账号意味着要有服务器,有服务器就要存用户数据,存了数据就要写一份关于「我们如何使用你的信息」的隐私政策------而我真正想写的那句话是:我什么都拿不到

现在 TripStamp 没有注册、没有登录、没有后端。你的照片从相册里选出来,在手机上处理完,导出到相册。中间不经过我的任何一台机器。隐私政策里那句「不会在开发者运营的服务器上保留你的照片或卡片副本」,是因为压根不存在这样的服务器。

代价是换手机数据不跟着走。这个取舍我认了。

不要定位权限

1.2.0 加了「旅行足迹」:你导出过的地方会自动连成一张地图,还能切到 3D 地球转着看。

做地图功能,最自然的做法是申请定位权限。但我没有。

足迹里的每一个点,都来自你自己选中的那张照片里本来就有的信息。照片拍摄时相机记下的经纬度,App 读出来,仅此而已。你没选的照片,App 看不到;你不导出,就不会有点落在地图上。

所以 TripStamp 的权限列表里没有「位置」这一项。第一次打开地图的人常以为忘了弹窗------不是忘了,是真的不需要。

这件事的另一面是:如果你的照片不带地理信息,那它就上不了地图。我没有用 IP 去猜,也没有用别的办法补。上不了就是上不了。

不做服务端渲染

后来我研究了一下同类做法,发现有些 App 的「3D 飞行视频」是这么做的:你上传素材,服务器排队渲染,排到了推送通知你。我看到的截图上写着「当前排名 516 位」。

这条路我走不了------不是技术问题,是它和上面那两条直接冲突。素材要上传,就意味着我得先把你的照片收上来。

所以 3D 地球是在你手机上实时渲染的。转动、缩放、路线动画,都是当下算出来的。不用等,不用联网,飞机上也能转。

不做订阅

Pro 是一次性买断。

我自己手机里有太多按月扣费的 App,每次看到账单都要想一想「这个我还在用吗」。TripStamp 是个低频工具------你不会每天做卡片,可能一次旅行做几张,然后几个月不打开。这种东西按月收费不合适。

免费能用四个模板,每天导出 5 张。买断之后无限导出、去水印、多一个护照印章模板、加上地球上的路线动画。

一个没想到的问题:平面地图装不下地球

这是整个开发过程里最让我意外的一件事。

足迹地图我一开始用的是普通平面地图。测试的时候数据都在长三角,一切正常。直到我造了一组跨洲的测试数据------里斯本、雷克雅未克、京都------地图直接框到了北冰洋,一个标记都看不见。

我以为是取景算法写错了,改了五版。后来才想明白:这是墨卡托投影本身的限制。竖屏视口在这套投影下能显示的经度范围,比宽扁的横屏还要少。地点跨度一大,平面地图在数学上就装不下,跟算法没关系。

那怎么办?球面上没这个问题。

所以 3D 地球不是为了炫技加的,是因为平面地图真的装不下。这个结论我写进了设计文档,免得以后自己又去改那个取景算法。

一个翻车:存储膨胀了 9 倍

上线后我自己用了一段时间,某天在设置里看到 App 数据占了 51.2MB。53 条记忆,平均一条 1MB------缩略图不该这么大。

查下来是UIGraphicsImageRenderer的默认行为:它按屏幕倍率渲染,iPhone 上是 3 倍。我写的是「最长边 512px」,实际存下来是 1536px。像素数是预期的 9 倍,存储也就跟着膨胀了 9 倍。

一行format.scale = 1修好。同时写了个一次性迁移,把老用户已经存下的大图压回去------我这台从 51.2MB 降到了 12.6MB。

有意思的是,修完之后我发现作品预览变糊了。因为那个「意外的 3 倍」恰好让预览图刚够全屏看,修掉之后反而不够了。所以最后的做法是:缩略图和作品预览分开设上限,列表里的 512 够用,要全屏看的预览给到 1280。

一个 bug 修出两个决定,这大概就是写代码的日常。


TripStamp 现在在 App Store 上,搜名字就能找到。1.2.0 是旅行足迹这一版。

如果你手机里也躺着几千张没发出去的旅行照片,可以试试。

♥️喜欢我的内容,欢迎大家点赞、转发、关注。

♥️专注于技术+投资+认知三位一体的内容分享。

往期推荐:

860 次展示,13 次下载:我的第一个出海 App 上线一个月

收藏夹从此不再吃灰:我用 Claude Code + Obsidian 搭了个会自己整理的第二大脑

识别"假护城河":3 个信号,看穿一家公司靠技术还是靠品牌

用AI自搭程序,抓到一个AI投资工具,我马上部署了,AI看盘投资落到了实处

今日阅读分享------如何做出伟大的工作?

纳瓦尔思想全景图------财富与幸福指南

如何走出创作低谷?一份可视化指南给你打气

经济机器是怎样运行的?

解决AI焦虑的唯一办法,建议收藏

AI工业革命,有哪些能力最稀缺?

为什么很多创业者做出来的产品没人买?------读《The Mom Test》有感

巴菲特和芒格没有说的那些话

芒格的人生操作系统,构建复利人生的基石

如何选择真正适合你的职业?

决策矩阵

二阶思维

决策日志

AI时代,软件工程师必备概念全景

相关推荐
克里斯蒂亚诺更新1 分钟前
AI编程Agent都有哪些
ai编程
ClouGence6 分钟前
一句话直出可运行程序!GLM‑5.3 系列多任务实测
人工智能·agent·ai编程
zhangfeng113317 分钟前
claude 默认授权启动,读写git权限
ai编程·cluade code
用户38034165882971 小时前
50MB 红线下的 iOS 录屏引擎:ReplayKit Broadcast Extension 实战
ios
用户5619035069331 小时前
Cline 插件怎么配置自定义 API?接入 DeepSeek / Claude / 本地模型
ai编程
桃西西呀1 小时前
RAG 接个向量库就完事?从切块到重排的 7 步流水线,我替你踩了 8 个深坑
人工智能·llm·ai编程
zhangfeng11331 小时前
CodeBuddy‑CLI 默认授权(权限模式)命令行参数
人工智能·ai编程
VIP_CQCRE4 小时前
用 Ace Data Cloud 把 Cline 接入你的 AI 编程工作流
ai编程·vs code·cline·acedatacloud
流光D5 小时前
AI时代,搭建 web 站点并配置 nginx 反向代理流程
运维·服务器·前端·人工智能·nginx·ai·ai编程