后台定位耗电的问题,我花两年把它压到了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 的深度实践,感兴趣的可以关注一下。

相关推荐
星辰即远方15 小时前
计算器仿写总结
学习·ui·ios·cocoa·xcode
2501_9159090619 小时前
全面解析iOS应用上架到App Store的完整流程与关键注意事项
android·macos·ios·小程序·uni-app·cocoa·iphone
00后程序员张20 小时前
抓包鹰 电脑本机网络连接表怎么看?哪些程序在联网 进程归属与可疑 IP 追溯
网络协议·计算机网络·网络安全·ios·adb·https·udp
2501_915918411 天前
免 Xcode 开发 iOS,工具链替代方案与编译、签名、安装
ide·vscode·macos·ios·个人开发·xcode·敏捷流程
初级代码游戏1 天前
iOS开发 Swift 速记5:高级运算符
ios·移动开发·swift
初级代码游戏1 天前
iOS开发 Swift 速记4:函数与闭包
开发语言·ios·swift
2501_915106321 天前
iOS 证书类型及作用说明 账号证书与签名配置的完整解读
android·ios·小程序·https·uni-app·iphone·webview
凡泰AI1 天前
如何通过小程序多端框架,让一个小程序同时运行在iOS、安卓、鸿蒙以及PC客户端,实现一次开发多端运行的效果
android·ios·小程序
ZacJi2 天前
当苹果将系统 API 划归 @MainActor:一次跨 SDK 版本的 Swift 并发踩坑与破局实战
ios·swift