起因:一个独立开发者的执念
去年十一月我站在厦门环岛路一个拐角,想回忆三年前来这座城市走过哪条路、在哪个巷子吃了那碗沙茶面,翻遍相册只找到几张没有地理信息的食物照片。那一刻的感受很具体------人明明去过那么多地方,但轨迹数据全丢了。
我一年大概飞二三十次,出差频率不低。试过用运动类 App 记轨迹,痛点很明显:每次出门前要记得「开始记录」,到了酒店要「结束记录」,忘了就白跑一趟。这类 App 本质是为跑步骑行设计的,拿来记通勤和旅行,交互逻辑全是错的。
也试过旅行平台标记去过的城市,但一打开就是别人的攻略和推荐流,我只想看自己的足迹。
所以我决定自己做一个,只解决「留痕」这一件事。不需要打卡,不需要社交,不需要写游记。走过,它就记住了。
技术上最难的两件事
说"两年"有点惭愧,白天上班,晚上和周末才能写。最早的版本就是把 GPS 坐标画在地图上,连线都没有,一堆散落的点。真正消耗时间的是两个工程问题。
后台定位的功耗控制
后台持续定位如果不做处理,一天电量就见底了。我前后试了七八种方案,在精度和功耗之间反复拉扯。iOS 的 CLLocationManager 有好几档精度可选,但单靠切换精度远远不够,还得结合运动状态判断来动态调整采样频率。
swift
// 根据运动状态动态调整定位精度
func locationManager(_ manager: CLLocationManager, didUpdate activity: CMMotionActivity) {
if activity.stationary {
manager.desiredAccuracy = kCLLocationAccuracyHundredMeters
manager.distanceFilter = 200
} else if activity.automotive {
manager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
manager.distanceFilter = 50
} else {
// walking / running
manager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
manager.distanceFilter = 15
}
}
核心思路是:静止时几乎不采样,移动时按交通方式分档。最终做到的效果是一整天后台运行,耗电大约在 3% 到 5% 之间,对大部分用户来说基本无感。
轨迹渲染的视觉表达
轨迹数据本身是冷冰冰的经纬度数组,直接画出来就是一团乱麻。我花了很长时间调颜色、线宽、透明度,核心逻辑是让密集的地方自然加深,偶尔路过的地方淡淡一笔。
swift
// 根据轨迹经过次数计算路段透明度
func opacityForSegment(visitCount: Int) -> CGFloat {
let normalized = min(Double(visitCount) / 20.0, 1.0)
return CGFloat(0.15 + 0.85 * pow(normalized, 0.4))
}
最终效果有点像水墨晕开------去得多的地方颜色浓,去得少的地方颜色淡。打开地图看自己走过的城市,视觉上是舒服的,不是密恐的。
产品形态:什么都不用做
打开「雁过留痕」,给它定位权限之后,就没有"之后"了。没有按钮要按,没有模式要选。你该干嘛干嘛,它在后台安静地记着。
想看的时候点开 App,地图上你走过的街道、坐过的高铁线路、飞过的航线,都在那里。可以按时间筛选,比如只看今年去过的地方,或者只看某次旅行那几天的轨迹。
通勤、出差、旅行、周末瞎逛,这些日常移动不需要"开始/暂停/结束"的仪式感。
另外一个我比较在意的设计决策:数据完全在本地。没有账号系统,没有云端同步到别人的服务器。你的行踪是你自己的事,不该被任何平台知道。作为开发者应该能理解这个选择------位置数据是最敏感的个人信息之一。
一个没设计过的玩法
自己用了大半年,发现一个没预料到的东西:「密度感」带来的满足。当你看到自己住的城市,街道被一条一条走满、地图上那片区域慢慢变"实"的时候,会有一种很安静的成就感。不是游戏里打卡集章的刺激,是一种"我确实在这里活过"的踏实。
有朋友拿去用了之后跟我说,他每次 citywalk 会刻意选没走过的路,回来看地图上又多了一小片颜色,像慢慢填满一幅画。这个用法我完全没设计过,但它自然地长出来了。
写在最后
这是我一个人在做的项目,没有团队没有推广预算。App Store 搜「雁过留痕」就能找到。
如果你也在做独立开发,后台定位功耗这块踩坑经验还挺多的,欢迎在评论区交流。或者你对轨迹数据的存储结构、地图渲染性能有什么想法,也可以聊聊。后续我打算单独写一篇关于 iOS 后台任务和 Core Location 的深度实践,感兴趣的可以关注一下。