去年冬天做完citywalk,手冻着打开手机看轨迹,就一条线。
看了两秒,把App关了。
那条线除了说明「我去过」,什么都说明不了。我走了哪些新街道?绕进去那个没名字的小巷算不算探索?穿过那片老居民区,我到底覆盖了多少地方?
没有答案。所有的App给我的只有步数和卡路里,好像我出门是为了减肥,不是为了探索。
就这样我开始做**雁过留痕**,一个把你的GPS轨迹换算成**面积(km²)**的App。不是轨迹线,是你真正踩过的土地面积。以25米为精度的网格,每个格子踩到才染色,踩过就算数,永久累积。
---
先说有个用户在评论区写了这么一句话,我看到的时候愣了一下:
> 「人生总要留下一些什么。大雁飞过,留下了痕迹。」
他说的比我能说清楚的都准。我做这个的出发点说白了就这么朴素——出门一趟,得有点什么留下来,不只是一条线。
好,说回开发的事。
---
**网格算法:看起来三天搞定,实际上我删了三次**
把GPS轨迹转成面积,逻辑上不复杂:用25米网格切地图,记录轨迹经过哪些格子,统计数量乘以面积。
我第一版就这么做的,跑起来一看,用户站在原地不动,面积还在涨。
GPS在后台会漂移,站着不动坐标抖动半径能到十几米,平白多染了一堆格子。面积数字虚高,我自己用着都觉得不对劲。
加了平滑滤波,漂移压住了,但CPU跑起来手机发烫。后台挂一小时,电量掉得很难看。用户哪怕再喜欢这个功能,手机烫成暖宝宝也会卸载的。
删了,重写。
第三个方案改变了思路:后台只管记GPS点,不做任何实时计算。把连续轨迹切成一段一段的「TraceSegment」,每段至少要有8个有效点才算有效轨迹,短于这个阈值直接丢弃。用户走完回来,再批量处理格子覆盖、算面积。
这个8是反复跑出来的。我试过5、10、12,在步行上班、公园散步、商场逛街几个不同场景里来回测,5太松噪声进来一堆,12又会把十分钟以内的短途全过滤掉——用户出去买个早餐发现没有记录,体验很差。最后觉得8是能平衡两端的数字,就定了。
电量问题解决了,但我发现新问题:用户如果在同一条街走了很多次,路径有细微偏差,同一条街可能被记成两列格子,面积还是会偏高。
最后把网格精度锁死在25米,这个尺度下一条正常街道基本落在同一列格子里,误差在可接受范围内。不完美,但够用。
---
**省份解锁:国内地图有个坑,做之前没意识到**
我想加「省份解锁」玩法,用户的探索格子覆盖一个省,这个省就染色点亮。
内置中国行政区边界数据,判断格子和省份边界的重叠——听起来不复杂。
然后我发现:国内手机的GPS坐标是GCJ-02偏移坐标系,跟标准WGS-84有几百米的位移。不做适配的话省份解锁就乱了。有多乱?我实测的时候站在长安街,App判断我在朝阳区。坐标没出北京,人已经「跨区」了,这要是放出去用户肯定以为遇到了灵异事件。
花了几天把坐标转换适配进去,这才是做给中国用户用的东西应该有的基本功。
还有一个细节:省份解锁的阈值必须做成动态的。面积越小的省阈值越低,不然北京、上海这种小省市会比新疆难解锁——用户在上海住了十年,反而比在新疆路过一次更难点亮,这逻辑说不通。
---
**成就系统:我低估了这件事**
我以为成就是锦上添花,一周搞定。
花了将近一个月。
成就的维度一旦列出来就停不下来:总距离、连续打卡天数、夜间出行次数、周末记录天数、单次最长距离、解锁省份数、解锁城市数、中国探索面积、全球探索面积……每个维度一组徽章,每组徽章又有多个等级。
最后定了四条赛道:**探索轨迹**(走多远)、**坚持打卡**(连续多久)、**华夏版图**(省市解锁)、**环球足迹**(国家和全球面积)。
做完之后有点可惜的地方是:这套东西做得挺细,但目前用户量还很小,稀有徽章基本没人能点亮。精心摆了一桌,宾客还没到。不过徽章先在那里,总会有人来拿的吧。
---
**Widget:一个15分钟的时间戳**
Widget 我想做成「当日进度展示」,今天走了多少、新开垦了多少面积、距离下一等级还差多少。
Widget 和主 App 数据是隔离的,用 App Groups 共享本地缓存,这没什么,标准方案。
但有个边界情况:用户走完回来,主 App 还在算面积,Widget 读到的是旧数据,进度比实际少。用户会以为App有bug。
我加了一个写入时间戳:Widget 如果发现缓存超过15分钟没更新,显示「正在同步」的提示状态,而不是直接展示一个旧数字。
这个细节没人会注意到,除非它不在的时候。
---
**现在的状态**
上线到现在,下载量还不到200。说实话我不确定是触达方式的问题,还是「探索面积」这个概念本身还没找到对的人群。
我在想,「你的城市你探索了几%」这种数字是不是天然有攀比欲?如果加个朋友之间的面积排行,能不能让更多人愿意分享截图出来?还是说这套玩法根本就是小众需求,不会破圈?
不知道。先做着。
感兴趣的话收藏一下——下一篇写后台GPS保活,比这篇惨多了。iOS有个机制会在你不注意的时候把后台进程干掉,我为了让App活着研究了一套「骗」系统的方案,那段才是真正让我抓狂的部分,下篇写。