后台定位耗电的问题,我花两年把它压到了3%-5%

起因:一个独立开发者的执念

去年十一月我站在厦门环岛路一个拐角,想回忆三年前来这座城市走过哪条路、在哪个巷子吃了那碗沙茶面,翻遍相册只找到几张没有地理信息的食物照片。那一刻的感受很具体------人明明去过那么多地方,但轨迹数据全丢了。

我一年大概飞二三十次,出差频率不低。试过用运动类 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 的深度实践,感兴趣的可以关注一下。

相关推荐
瓦瓦gogo5 小时前
第一次了解 iOS 开发:从 Swift、SwiftUI 到公共组件
ios·swiftui·swift
Liben9 小时前
Weex开发踩坑记录
android·前端·ios
season_zhu11 小时前
Skills For Real Engineers 系列之三:需求聊清楚了,怎么一步步走主流程,做到交付?
ios·ai编程
茶底世界之下12 小时前
窗边花瓶太暗?用 Awaking 看提亮室内的代价
ios
2501_9159090612 小时前
Windows 上用 VS Code 调试 iPhone 真机 App,KXBuild 断点、崩溃定位实操
ide·windows·vscode·ios·iphone·个人开发·敏捷流程
2501_916007471 天前
抓包工具功能对比,TraceEagle、Charles、Fiddler、Wireshark、mitmproxy 差别
前端·网络协议·ios·adb·https·fiddler·wireshark
2501_915106321 天前
Windows 上开发 Unity iOS,使用 KXBuild 进行真机调试、性能采样与打包 ipa
windows·vscode·unity·ios·个人开发·swift·敏捷流程
柚鸥ASO优化1 天前
iOS 27.2 更新后,App Store 广告展示逻辑出现新变化
ios
美狐美颜SDK开放平台1 天前
视频美颜SDK如何应对快速转头与大幅度面部动作?
android·人工智能·ios·音视频·直播美颜sdk·视频美颜sdk
茶底世界之下1 天前
秋叶已经够黄了:用 Awaking 单独收一点黄色
ios