一个真实的痛点

上周翻相册找一张去年在成都拍的照片,翻了十分钟没找到,但突然很想知道:我那次到底走了哪些街?住的酒店在哪个方向?后来去的那个苍蝇馆子离春熙路多远?相册帮不了我,高德的足迹功能又藏得很深,数据还不完整。

作为一个独立开发者,我的第一反应是:这个需求够小、够明确,值得自己动手做一个。于是就有了「雁过留痕」——一个纯粹的轨迹留痕工具。功能很简单:后台自动记录你的轨迹,画在地图上,完事。没有社交,没有分享广场,没有配速心率,打开就是一张地图,上面是你去过的所有地方。

技术上最纠结的事:耗电

独立开发,从去年十一月开始写,到现在大半年。中间最纠结的是耗电问题。持续定位很吃电量,我试了好几套方案,最后用的是系统级的 significant location change 配合间歇性精确定位,日常使用基本感知不到额外耗电。

iOS 端核心的定位策略大致是这样的:

// 大部分时间只监听系统级的显著位置变化,几乎不耗电
locationManager.startMonitoringSignificantLocationChanges()

// 触发显著变化后,短暂开启精确定位采集一段轨迹
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    startPreciseTracking(duration: 120) // 间歇性精确定位2分钟
        saveLocationsToLocal(locations)      // 数据只落本地
        }
        ```
精度上有一点牺牲,不会像运动手表那样米级记录,但对于「我去没去过这个地方」这个问题,够用了。这个定位其实不是为了记录运动表现,只做留痕——你走过的每条街、到过的每个城市,时间久了回头看会很有意思。

## 隐私的取舍:数据全部存本地

另一个取舍是数据全部存本地。我知道加 iCloud 同步换机方便,但第一版我想把隐私做到最干净——轨迹数据不出手机。后续如果大家需要,再考虑端到端加密的同步方案。

## 关于 HarmonyOS 适配的一些想法

目前「雁过留痕」已经在 App Store 上架。之所以发在 CSDN,是因为我最近在认真研究 HarmonyOS Next 的定位能力。鸿蒙的 geoLocationManager 模块提供了类似的连续定位和显著变化监听机制,ArkTS 写起来和 Swift 的思路很接近:

```arkts
import geoLocationManager from '@ohos.geoLocationManager';

// HarmonyOS 的持续定位请求,可配置间隔和精度策略
let requestInfo: geoLocationManager.LocationRequest = {
  priority: geoLocationManager.LocationRequestPriority.LOW_POWER,
    timeInterval: 300 // 5分钟间隔,平衡功耗和精度
    };
    geoLocationManager.on('locationChange', requestInfo, (location) => {
      // 轨迹数据落入本地数据库
        saveTrackPoint(location.latitude, location.longitude, location.timeStamp);
        });
        ```
HarmonyOS 在后台任务管理和功耗控制上有自己的一套机制,ArkUI 的地图组件渲染轨迹的性能也值得测试。如果后续做鸿蒙版本,我大概率会基于这套 API 重新设计后台驻留策略。

## 现阶段进度

目前 iOS 版已上架 App Store,从去年十一月开发至今大半年,核心功能稳定。我在考虑的下一步就是看鸿蒙生态的用户规模是否值得投入一个原生版本——毕竟这类工具 App,后台能力和系统权限是命脉,跨平台框架在这块很难做到位。

如果你也在做 HarmonyOS 开发,特别是涉及后台定位、低功耗策略这块,欢迎交流。踩过的坑越多越想找人聊聊。
Logo

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

更多推荐