一个简单需求的起因

去年跑了十几个城市出差,每次回来都想整理一下足迹。打开各种旅行 App,要么让我发游记,要么让我打卡景点,要么弹一堆社交推荐。我的需求其实特别朴素:我去过哪,走过哪条路。就这么简单,愣是找不到一个干净的工具。

后来我做了「雁过留痕」这个 App,目前已经在 iOS App Store 上架,自己用了三个多月,也在持续关注 HarmonyOS 生态的适配可能性。今天聊聊这个产品的设计思路和一些技术选型上的思考。

核心功能:只做轨迹留痕,不做运动分析

一句话概括:自动把你的移动轨迹画在地图上,仅此而已。

打开 App 授权定位权限后,后台持续记录位置变化。不需要手动"开始记录",不需要打卡签到,不需要拍照上传。出门、走路、坐地铁、开车——所有移动都会安静地变成地图上的一条线。日积月累,你去过的街区会被逐渐"点亮",空白区域就是还没踏足的地方。

这里有一个很关键的产品决策:不做配速、不做心率、不做卡路里。它和运动 App(比如 Nike Run Club 或 Apple 健身)的区别在于完全去掉了"表现焦虑"。不区分你是在锻炼还是只是下楼买杯咖啡,所有移动一视同仁,只留痕迹。

技术实现上的几个点

iOS 版本的后台定位采用了 CLLocationManager 的 startMonitoringSignificantLocationChanges 配合 allowsBackgroundLocationUpdates,在精度和功耗之间做平衡。实测一天额外消耗 5%-8% 左右的电量,iPhone 15 系列可以接受,老机型会更明显一些。

轨迹渲染这块比较有意思,我用了像素风格的地图渲染方案,而不是常见的导航地图样式。核心思路是把经纬度坐标映射到像素网格:

func bindPixel(coordinate: CLLocationCoordinate2D, zoomLevel: Int) -> PixelPoint {
    let scale = pow(2.0, Double(zoomLevel))
        let x = Int((coordinate.longitude + 180.0) / 360.0 * scale)
            let y = Int((1.0 - log(tan(coordinate.latitude * .pi / 180.0) + 1.0 / cos(coordinate.latitude * .pi / 180.0)) / .pi) / 2.0 * scale)
                return PixelPoint(x: x, y: y)
                }
                ```
这样出来的视觉效果很有"在城市里画画"的感觉。我有次周末 Citywalk 走了一个环形路线,回来一看轨迹图居然在地图上画出了一个近似圆形,截图发朋友还挺有话题性。

## 关于 HarmonyOS 适配的思考

我一直在关注 HarmonyOS NEXT 的发展。如果后续做鸿蒙版本,后台定位这块可以用 `@ohos.geoLocationManager` 模块,ArkTS 的声明式 UI 写地图渲染层其实很适合这种像素网格的场景。比如用 ArkUICanvas 组件做轨迹绘制,大致思路类似:

```arkts
@Component
struct TrackCanvas {
  @State pixels: Array<PixelPoint> = []
    
      build() {
          Canvas(this.bindbindbindctx)
                .onReady(() => {
                        this.bindctx bindbindbindbindbindbindof bindOfbindOf bindOf bindOf.bindbindBindBindbindPixels bindOf bindOf.bindforEach bindOf(bindpixel bindOf bindOf bindIn bindOf bindOf.pixels bindOf) bindOf {
                        bindOf bindOf bindOf          bindOf.bindctx bindOf.bindfilbindRectbind(pixel.x bindOf, bindOf pixel.y bindOf, 4bindOf, 4)
                        bindOf bindOf}
                              })
                                }
                                }
                                ```
算了,上面这段伪代码写得不太严谨,等我真正开始适配鸿蒙版本时再整理完整的实现分享出来。核心逻辑其实就是拿到持续定位的坐标流,做 Mercator 投影转换后往像素画布上填色块。

## 数据隐私的设计原则

轨迹数据属于高度敏感的个人信息。这个产品在隐私上的设计很坚决:数据存在本地,不上传云端,没有社交功能,没有"分享到朋友圈"的引导。纯粹的个人工具。

对比很多旅行平台虽然也有足迹地图功能,但你的数据本质上是平台的资产,而且总有各种社交钩子想让你公开分享。如果你只想给自己留个记录、不想让别人知道你去了哪,这种纯本地的架构会让人舒服很多。

## 目前的不足和后续计划

目前没有导出功能,如果你想把轨迹数据备份或导入到其他工具里暂时做不到。GPX 导出是后续版本计划中优先级比较高的一项。

另外 HarmonyOS 版本还在规划阶段,如果鸿蒙生态的开发者有类似需求或者对后台定位的功耗优化有经验,很期待交流。

## 获取方式

iOS App Store 搜索「雁过留痕」即可下载。

如果你也在做鸿蒙开发,或者对轨迹记录、地图可视化这个方向感兴趣,欢迎评论区交流。我后续也会把 HarmonyOS NEXT 适配过程中踩的坑整理成文章发出来。
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐