尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

【uni-app UTS 插件】三端后台保活定位方案:Android / iOS / 鸿蒙 Next 一套 API 搞定外勤轨迹

【uni-app UTS 插件】三端后台保活定位方案:Android / iOS / 鸿蒙 Next 一套 API 搞定外勤轨迹 一、为什么后台定位这么难做过外勤、物流、配送、巡检类 App 的开发者几乎都踩过这些坑Android8.0 以后后台限制越来越严普通定位服务很容易被系统杀掉必须前台服务FGS 常驻通知Android 13 还要单独申请通知权限各厂商小米、华为、OPPO、vivo电池优化、自启动白名单各不相同Android 14 还要声明foregroundServiceTypelocationiOS后台定位必须开 Background Modeslocation「始终允许」权限要分步申请App Store 审核对用途说明要求很严App 挂起后定位回调可能中断需要额外处理恢复逻辑鸿蒙 Next权限要写在module.json5只写config.json不会进包后台定位需要长时任务LOCATION 类型还要定时续期平板 / 2in1 要在主工程和插件两侧分别配置deviceTypes自己从零写三端原生代码周期以周计还要持续跟进系统策略变化。有没有一套 uni-app 能直接用的方案二、keepalive-location三端统一的 UTS 后台定位插件keepalive-location是一个UTS 原生插件用一套 JavaScript API 覆盖Android、iOS、鸿蒙 Next的后台持续 GPS 定位场景典型用途包括外勤巡检轨迹记录物流配送实时位置司机出车路线留痕现场作业任务核验核心能力一览能力说明后台定位启停startLocation()/stopLocation()点位回调经纬度、精度、速度、高度、时间戳、provider权限内置检测、申请、跳系统设置无需另装权限插件状态监听权限丢失、长时任务过期、服务异常、上报失败等本地环缓可配置最大缓存点数断网不丢点可选 HTTPS 上报批量 POST 到业务服务器不默认上传第三方坐标转换WGS84 ↔ 高德 GCJ-02 ↔ 百度 BD-09统一错误码803xxxx分段便于日志与客服排查三、三端分别做了什么Android前台服务 唤醒锁 厂商白名单内置TrackForegroundService适配 Android 8.0–14支持常驻通知、WakeLockopenVendorKeepAliveSettings()深链跳转小米 / 华为荣耀 / OPPO / vivo / 三星常见保活设置页正式包务必initTrack({ enableForegroundService: true })iOSBackground Modes Always 分步授权支持 Background ModeslocationAlways 权限分步申请挂起状态持续出点readme 附带App Store 审核文案模板可直接改写提交鸿蒙 Next长时任务自动续期权限声明在module.json5含平板tablet、2in1 支持长时任务类型LOCATION定时续期监听取消事件8031004ContinuousLocationRequest持续定位intervalMs最高 60 秒普通授权版买家无需改插件源码主工程配好harmony-configs即可四、5 分钟快速接入1. 安装插件从 DCloud 插件市场导入 keepalive-location放入项目uni_modules/keepalive-location制作自定义调试基座后运行。2. 最小代码示例import {initTrack,requestPermissions,onLocationUpdate,onStatusChange,startLocation,stopLocation,destroy} from /uni_modules/keepalive-location // 注册回调全局注册一次即可 onLocationUpdate((point) { console.log(定位点, point.latitude, point.longitude, point.accuracy) }) onStatusChange((status) { console.log(状态变化, status.eventType, status.lastError) }) // 初始化 → 申请权限 → 开启定位 async function startTrack() { await initTrack({ notificationTitle: 位置服务运行中, notificationContent: 正在进行后台定位, enableForegroundService: true, // Android 正式包必须 true enableCache: true, cacheMaxPoints: 2000 }) await requestPermissions() await startLocation({ distanceFilter: 0, // 0 不按位移过滤 desiredAccuracy: 10, // 期望精度米 intervalMs: 60000 // 出点间隔1000–60000ms }) } // 停止 async function stopTrack() { await stopLocation() destroy() }注意对外初始化方法名为initTrack不是init——避免 iOS/Swift 保留字导致云打包失败。3. 封装成 Vue 插件业务层示例很多项目会封一层 Service统一管理出点间隔、上传队列、前后台切换// utils/locationPlugin.js 思路 class LocationService { async ensureInit() { return initTrack({ notificationTitle: 定位服务通知, notificationContent: 正在后台持续定位..., enableForegroundService: true, enableCache: true }) } async startService({ interval 60 } {}) { await this.ensureInit() const perm checkPermissions() if (!perm.permission.location) await requestPermissions() await startLocation({ distanceFilter: 0, desiredAccuracy: 10, intervalMs: Math.min(Math.max(interval * 1000, 1000), 60000) }) } }五、几个实用特性详解1. 定时出点策略三端一致系统定位只刷新内存中的最近点插件内部定时器按intervalMs回调有新 GPS → 用新点无新 GPS → 复用最近点更新 timestamp这样即使司机等红灯、人员站立不动也能按固定间隔产生轨迹点适合「每分钟上报一次」的业务需求。2. 坐标转换系统 WGS84 → 国内地图插件返回的是系统原始WGS84。上传高德/百度前需转换import { toGaode, wgs84ToGcj02 } from /uni_modules/keepalive-location onLocationUpdate((point) { const gaode JSON.parse(wgs84ToGcj02(point.latitude, point.longitude)) // gaode.latitude / gaode.longitude 用于高德地图展示或上报 })UTS 自定义对象跨 JS 桥可能丢字段坐标转换结果以 JSON 字符串返回需JSON.parse。3. 可选 HTTPS 批量上报await initTrack({ enableCache: true, upload: { url: https://your-api.com/track, headers: [{ key: Authorization, value: Bearer xxx }], batchSize: 20, intervalMs: 15000, includeDeviceId: false } })上报 JSON 格式{ deviceId: optional, platform: android|ios|harmony, points: [ { latitude: 0, longitude: 0, accuracy: 0, speed: 0, altitude: 0, timestamp: 0, provider: gps } ] }插件不默认向任何第三方服务器上传只有业务配置了upload.url才会 POST。4. 统一错误码节选错误码含义8030001未授权定位8030002无后台定位 / Always8031004长时任务取消
返回列表