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

相关推荐
FairGuard手游加固11 小时前
iOS 游戏加固技术解析:代码混淆、资源加密、内存保护与重签名检测
安全·游戏·macos·unity·ios·objective-c
思盛iOS签名上架12 小时前
iOS企业签名原理是什么?
macos·ios·cocoa
Daniel_Coder13 小时前
我用 SwiftUI + GRDB 做了一个「按时吃药·服药提醒」App
ios·swiftui·swift·widgetkit
Patrick_Wilson15 小时前
iOS 第三方浏览器图片下载失败问题
前端·ios·浏览器
悟空瞎说1 天前
NSNotificationCenter(NotificationCenter)官方文档白话翻译 + API 详解 + Swift 实战
ios
末代iOS程序员华仔2 天前
iOS个人开发者账号申请为啥会被卡住
ios·swift·figma
MaoJiu2 天前
从纹理采样到局部形变:实时瘦鼻 Shader 算法解析
ios
奈斯先生Vector2 天前
从“能调用”到“可替换”:Coze 多模型 API 编排层设计指南
linux·运维·人工智能·ubuntu·平面·ios
DogDaoDao2 天前
HarmonyOS 深度解析:从微内核到 ArkTS 工程实战
android·linux·ios·华为·程序员·harmonyos·harmonyos next