轨迹记录总忘按开始?我在鸿蒙上做了个App,解决了90%的痛点
这个 App 要解决什么问题
上个月出差跑了三个城市,回来翻手机相册想回忆去过哪些地方,发现照片里全是会议室和酒店大堂。那些走过的街道、路过的江边、绕远路发现的小巷子,什么都没留下。
运动类 App 倒是能记录轨迹,但每次都要手动开始、手动结束,忘按一次就白走了。我只是想给自己留个痕迹,不想发给任何人看,也不需要什么配速心率。
困扰了挺久,后来干脆自己动手做了一个 App——雁过留痕。只干一件事:把你去过的地方,安静地留在地图上。iOS 版先做完了,今年把它迁移到了 HarmonyOS 原生,这篇文章聊聊整个鸿蒙开发过程中的技术选型和实际体感。
为什么选 HarmonyOS 原生而不是跨平台
最早 iOS 端是用 SwiftUI 写的。做鸿蒙版本时考虑过跨平台方案,但试了几天 ArkTS 之后改了主意。说实话,ArkUI 的声明式语法和 SwiftUI 在思路上非常接近,迁移的心智成本比我预想的低不少。Column、Row、Stack 和 SwiftUI 的 VStack、HStack、ZStack 几乎一一对应,我把 iOS 端的 UI 结构搬过来改改语法,大部分页面半天就能跑起来。
更关键的是鸿蒙有些能力是 iOS 生态里拿不到的,对这个 App 的场景刚好有用。
后台持续定位的处理方式就很不一样。iOS 的后台定位权限审核越来越严,而 HarmonyOS 的 continuous task(长时任务)机制让后台轨迹采集有了更清晰的系统级支持。用户授权一次,App 在后台安静记录,不需要反复弹窗确认。对于一个"开了就不用管"的足迹工具来说,这个体验差距是实质性的。
另一个鸿蒙独有的体验是原子化服务卡片。用户不用打开 App,桌面卡片上就能看到今天走过的轨迹缩略图。我觉得这比 iOS 的 Widget 更适合做"瞄一眼就够"的信息展示,因为卡片本身可以承载更丰富的交互。
核心技术实现:轨迹采集与地图渲染
轨迹记录的核心逻辑不复杂,但细节很多——GPS 漂移过滤、低速状态下的降频采集、电量优化策略等等,这些都是实际跑起来之后一个一个调出来的。地图渲染用了 HarmonyOS 的 MapComponent,把采集到的坐标点用 Polyline 画到地图上,骨架代码长这样:
@Entry
@Component
struct TrackMapView {
@State pathPoints: Array<mapCommon.LatLng> = []
build() {
Column() {
MapComponent({
mapOptions: { center: { latitude: 39.9, longitude: 116.4 }, zoom: 12 }
})
.onReady((map) => {
let polylineOpt: mapCommon.MapPolylineOptions = {
points: this.pathPoints,
clickable: false,
width: 8,
color: 0xFF3A7DFF
}
map.addPolyline(polylineOpt)
})
.width('100%')
.height('80%')
}
}
}
```
做的事情很直白:把坐标数组丢给地图组件,画一条线。实际项目里还有轨迹平滑、分段着色之类的处理,但整个渲染链路的骨架就是这个样子。MapComponent 的 API 设计比较直觉,如果你之前用过高德或百度的地图 SDK,上手不会有什么障碍。
桌面卡片的实现是我觉得鸿蒙版比 iOS 版体验提升最明显的地方。每天凌晨自动截取前一天的轨迹缩略图更新到卡片上,用户早上解锁手机一眼就看到昨天的足迹轮廓。卡片上只放两样东西:一张轨迹缩略图和一个距离数字,克制一点,信息密度刚刚好。
```arkts
@Entry
@Component
struct TrackWidgetCard {
@LocalStorageProp('todayDistance') todayDistance: string = '0 km'
@LocalStorageProp('trackSnapshot') trackImg: string = ''
build() {
Column({ space: 8 }) {
Text('昨日足迹')
.fontSize(14)
.fontColor('#666')
Image(this.trackImg)
.width('100%')
.aspectRatio(1.6)
.borderRadius(8)
Text(this.todayDistance)
.fontSize(20)
.fontWeight(FontWeight.Medium)
}
.padding(12)
}
}
```
## 从 SwiftUI 迁移到 ArkTS 的真实体感
聊几个具体感受,给同样在考虑双端开发的同学做参考。
状态管理思路上有差异。SwiftUI 用 @State、@ObservedObject 那套,ArkTS 的 @State、@Link、@Prop 的作用域划分更细。刚开始会有点不习惯,但写了两三个页面之后反而觉得鸿蒙这套更明确——谁持有数据、谁只是引用,代码里看得更清楚。这对有 Swift 或 TypeScript 基础的开发者来说学习曲线很友好。
工具链成熟度还在追赶。DevEco Studio 用下来整体还行,但和 Xcode 比的话,断点调试、性能分析这些工具还有打磨空间。不过每个版本都能感觉到在进步,不是什么阻塞性问题。
设备适配是个明显的加分项。同一套代码跑在手机、平板、折叠屏上,ArkUI 的自适应布局能力确实省了不少事。雁过留痕在 MatePad 上展开地图的效果比手机上好太多,大屏看轨迹图那种满足感是小屏给不了的。
## 关于"只做留痕"的产品克制
开发过程中最难的不是技术,是克制。总有人建议加社交分享、加打卡排行榜。但我一直觉得这个 App 的价值恰恰在于它什么都不多做。你出门,它安静记录;你想看了,打开地图,所有去过的地方一目了然。没有点赞,没有评论,没有"今日步数打败了 98% 的用户"。
有次出差结束看了一眼全年轨迹图,发现自己居然去过三十多个城市。那个瞬间比任何打卡成就都让人感慨。地图上那条慢慢延伸的线,就是你存在过的证据。
## 后续计划
鸿蒙版目前在持续迭代中,后面打算尝试跨设备流转——手机上录的轨迹在平板上查看大地图,在手表上快速看今日路线。这些场景在 HarmonyOS 的分布式架构下实现起来会比较自然,也是鸿蒙生态真正区别于其他平台的地方。
如果你也在做鸿蒙开发,欢迎交流技术方案,特别是后台定位功耗优化和地图渲染性能这两块,踩过坑的朋友留言聊聊。
#HarmonyOS开发 #ArkTS #ArkUI #原子化服务 #鸿蒙原生应用
更多推荐



所有评论(0)