更新记录
1.0.4(2026-09-21)
修复ios打包问题
1.0.3(2026-08-26)
更新普通授权版接入
1.0.2(2026-08-19)
- 鸿蒙:修复 ArkTS 编译(
wantAgent改从@kit.AbilityKit导入;缓存读写、JSON 解析、HTTP 上报按 ArkTS 严格类型改写) - 鸿蒙:权限声明改为
utssdk/app-harmony/module.json5+$string:reason(仅写config.json不会进包,会导致8030001) - 鸿蒙:定位权限分步申请(先模糊+精确前台,再处理后台);后台定位需系统设置「始终允许」
- 鸿蒙:定位订阅改为
ContinuousLocationRequest,启动前检查定位开关;intervalMs上限放开到 60000ms - 鸿蒙:
GpsPoint回调过 JS 桥丢字段时,Demo 用getCachedPointsJson兜底刷新首点展示 - Demo:默认每 60 秒出一次点;开启定位后自动申请权限
平台兼容性
uni-app(3.8.4)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | 16.0 | 26 | √ |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | × | × |
keepalive-location
UTS 后台保活定位|Android iOS 鸿蒙 Next|外勤巡检后台持续 GPS 定位
三端 UTS 插件:后台定位启停、点位回调、权限内置、状态事件、本地环缓、可选 HTTPS 上报。普通授权 / 源码授权。
功能
- 后台定位开启 / 关闭;点位回调(经纬度、精度、速度、时间戳、高度)
- Android:前台服务 + 常驻通知,适配 8.0–14,唤醒锁;厂商自启动/白名单深链
- iOS:Background Modes
location,Always 权限分步;挂起状态点位回调;附 App Store 审核文案模板 - 鸿蒙 Next:后台定位权限、长时任务自动续期、配额/取消监听
- 权限检测、申请、跳转设置(内置,不另发权限插件)
- 状态监听:权限丢失、系统限制、长时任务过期、服务异常、上报失败
- 统一错误码、demo、manifest 完整配置模板
安装
市场插件 ID 为
keepalive-location。本地目录名请与 ID 一致。
将本目录放入项目 uni_modules/keepalive-location,制作自定义调试基座后运行。
import {
initTrack,
startLocation,
stopLocation,
getStatus,
onLocationUpdate,
onStatusChange,
destroy,
requestPermissions,
checkPermissions,
openAppSettings,
openVendorKeepAliveSettings,
getCachedPoints,
clearCachedPoints,
flushUpload,
getTrackCapabilities
} from '@/uni_modules/keepalive-location'
API
注意:对外初始化方法名为
initTrack(避免 iOS/Swift 保留字init导致云打包失败)。
| 方法 | 说明 |
|---|---|
initTrack(options?) |
初始化(通知文案、缓存、upload)→ Promise<boolean> |
startLocation(opt?) |
开启后台定位 → Promise<void> |
getCurrentLocation(opt?) |
单次定位(不启后台跟踪)→ Promise<GpsPoint> |
stopLocation() |
停止并 flush 上报 → Promise<void> |
resumeLocation() |
回前台 / 权限恢复后调用,重建原生定位会话 |
getStatus() |
同步状态快照 |
onLocationUpdate(cb) |
点位回调(后注册覆盖) |
onStatusChange(cb) |
状态回调(后注册覆盖) |
destroy() |
销毁资源 |
checkPermissions() / requestPermissions() |
权限 |
openAppSettings() / openVendorKeepAliveSettings(vendor?) |
跳设置 |
getCachedPoints(limit?) / clearCachedPoints() |
环缓 |
flushUpload() |
立即上报 |
getTrackCapabilities() |
能力探测 |
toGaode(lat, lng) / wgs84ToGcj02 |
WGS84 → 高德 GCJ-02 |
toBaidu(lat, lng) / wgs84ToBd09 |
WGS84 → 百度 BD-09 |
gcj02ToBd09 / bd09ToGcj02 / gcj02ToWgs84 |
坐标系互转 |
convertGpsPoint(point, to) |
整点转换,to: gcj02/gaode/bd09/baidu |
坐标转换(插件点位为系统 WGS84)
返回值为 JSON 字符串(UTS 自定义对象跨 JS 桥易丢字段),需
JSON.parse。
import { toGaode, toBaidu, convertGpsPoint } from '@/uni_modules/keepalive-location'
onLocationUpdate((point) => {
const gaode = JSON.parse(toGaode(point.latitude, point.longitude))
const baidu = JSON.parse(toBaidu(point.latitude, point.longitude))
// gaode.latitude / gaode.longitude
})
initTrack 选项
await initTrack({
notificationTitle: '位置服务运行中', // Android 通知标题
notificationContent: '正在进行后台定位', // Android 通知内容
enableWakeLock: true, // Android 唤醒锁
enableForegroundService: true, // Android 正式接入务必 true(后台保活)
enableCache: true,
cacheMaxPoints: 2000,
upload: { // 不传则不上报
url: 'https://example.com/track',
headers: [{ key: 'Authorization', value: 'Bearer xxx' }],
batchSize: 20,
intervalMs: 15000,
includeDeviceId: false
}
})
Android 前台服务(FGS)正式接入说明
| 场景 | enableForegroundService |
|---|---|
| 正式 App / 云打包 / 上架 | true(默认) |
| 仅前台调试、排查约 1s 闪退 | 可临时 false |
正式接入 checklist:
initTrack({ enableForegroundService: true, notificationTitle, notificationContent })- 先
requestPermissions()(定位 + 后台定位 + 通知;Android 13+ 通知权限) - 制作自定义调试基座 或云打包(把
TrackForegroundService.kt+ Manifest 打进包) - 开启定位后应出现常驻通知;没有通知却闪退 = FGS 未正确进包或权限不足
- 建议引导用户关掉电池优化、加厂商白名单:
openVendorKeepAliveSettings()
Demo 工程为避闪退可暂关 FGS;接入业务 App 时请打开。
startLocation 选项
await startLocation({
distanceFilter: 0, // 米;0=不按位移过滤
desiredAccuracy: 10, // 米
intervalMs: 1500 // Android:即使静止也按此间隔回调并写本地缓存(默认 1500,夹到 1000–2000)
})
Android / iOS / 鸿蒙策略:系统定位只刷新内存最近点;定时器按
intervalMs出点(有新 GPS 用新点,否则复用最近点并更新 timestamp)。
单次定位 getCurrentLocation
不启动后台跟踪,适合打卡、填表等一次性取点场景(需已授权定位):
import { getCurrentLocation } from '@/uni_modules/keepalive-location'
const point = await getCurrentLocation({
desiredAccuracy: 10,
timeoutMs: 15000
})
console.log(point.latitude, point.longitude)
离线 / 无网络
- GPS 采集:Android / iOS / 鸿蒙在无移动网络时仍可通过 GPS 卫星定位(室内或弱信号时精度下降)
- 本地环缓:
initTrack({ enableCache: true })后断网仍持续写缓存,getCachedPoints()可读历史点 - 上报:仅在有网且配置
upload.url时 HTTPS 上报;断网触发8033001,恢复网络后flushUpload() - 不含离线地图 / 离线导航能力
权限变更后自动恢复
若在定位运行中将系统定位权限改为「禁止」,再改回「始终允许」:
- 插件会发
permission_lost状态事件并挂起原生会话(running仍为 true) - 定时器 /
resumeLocation()检测到权限恢复后,自动重建 Android FGS 通知、iOS CL 会话、鸿蒙长时任务 - 建议在 App
onShow中调用resumeLocation(),从设置页返回时更快恢复
GpsPoint
| 字段 | 说明 |
|---|---|
| latitude / longitude | 坐标 |
| accuracy | 米 |
| speed | m/s,不可用 -1 |
| altitude | 米,不可用 -9999 |
| timestamp | ms epoch |
| provider | gps / network / harmony 等 |
上报 JSON
{
"deviceId": "optional",
"platform": "android|ios|harmony",
"points": [{ "latitude": 0, "longitude": 0, "accuracy": 0, "speed": 0, "altitude": 0, "timestamp": 0, "provider": "gps" }]
}
仅支持 HTTPS POST。
错误码 803xxxx
| 码 | 含义 |
|---|---|
| 8030001 | 未授权定位 |
| 8030002 | 无后台定位 / Always |
| 8030003 | 通知未开 |
| 8030004 | 电池优化限制 |
| 8030005 | 用户拒绝 |
| 8031001 | 未 initTrack |
| 8031002 | 已在运行 |
| 8031003 | 服务异常 |
| 8031004 | 长时任务过期 |
| 8031005 | 系统限制 |
| 8032001 | 缓存读写失败 |
| 8032002 | 缓存满丢最旧 |
| 8033001 | 网络失败 |
| 8033002 | HTTP 非 2xx |
| 8033003 | URL 非法(非 https) |
| 8033004 | 序列化失败 |
| 8039001 | 参数非法 |
| 8039002 | 平台不支持 |
| 8039003 | 内部错误 |
Android manifest 模板
在 manifest.json → app-plus → distribute → android 中确保权限(插件 AndroidManifest.xml 也会合并):
ACCESS_FINE_LOCATION/ACCESS_COARSE_LOCATIONACCESS_BACKGROUND_LOCATIONFOREGROUND_SERVICE/FOREGROUND_SERVICE_LOCATIONPOST_NOTIFICATIONSWAKE_LOCKREQUEST_IGNORE_BATTERY_OPTIMIZATIONSINTERNET(仅当使用上报)
Android 14 需声明前台服务类型 location(本插件已带 Service)。
厂商白名单:调用 openVendorKeepAliveSettings(),覆盖小米 / 华为荣耀 / OPPO / vivo / 三星常见页;失败回落应用设置。深链因系统版本可能失效。
iOS 配置模板
manifest.json:
"app-plus": {
"ios": {
"capabilities": {
"UIBackgroundModes": ["location"]
},
"privacyDescription": {
"NSLocationWhenInUseUsageDescription": "需要在使用期间获取您的位置,用于外勤巡检与轨迹记录",
"NSLocationAlwaysAndWhenInUseUsageDescription": "需要在后台持续获取您的位置,用于外勤巡检、轨迹记录与现场任务核验",
"NSLocationAlwaysUsageDescription": "需要在后台持续获取您的位置,用于外勤巡检、轨迹记录与现场任务核验"
}
}
}
App Store 审核文案模板(可直接改写提交)
用途说明(App Review Notes):
本应用为外勤巡检 / 现场作业类工具。开启「始终」定位后,员工在巡检途中将 App 置于后台或锁屏时,仍需持续记录 GPS 轨迹,用于任务核验、路线留痕与异常位移告警。我们仅在用户主动开始巡检任务后采集位置,任务结束后立即停止;位置数据用于业务方自有服务器(可选上报),不用于广告追踪。
权限弹窗文案建议: 与上方 privacyDescription 保持一致,强调「外勤巡检 / 轨迹记录」。
鸿蒙 Next 配置
权限必须写在插件 utssdk/app-harmony/module.json5(并配套 resources/.../string.json 的 $string:reason),仅写 config.json 不会打进鸿蒙包,会导致 requestPermissions 永远 location:false / 8030001。
插件已声明:
ohos.permission.LOCATION/APPROXIMATELY_LOCATIONohos.permission.LOCATION_IN_BACKGROUNDohos.permission.KEEP_BACKGROUND_RUNNINGohos.permission.INTERNET(上报时)
主工程 EntryAbility 需配置 backgroundModes: ["location"](可用项目根目录 harmony-configs/entry/src/main/module.json5 覆盖)。长时任务类型为 LOCATION;插件会定时续期并监听取消事件(long_task_expired / 8031004)。
操作顺序:先 requestPermissions() 弹窗授权,再 startLocation()。若曾拒绝,需到系统设置里打开定位权限。
普通授权版接入
- 从插件市场导入 keepalive-location,制作自定义调试基座
- 在项目根目录创建/编辑
harmony-configs/entry/src/main/module.json5:deviceTypes增加tablet、2in1EntryAbility配置backgroundModes: ["location"]
- 业务代码 import 插件 API,先
requestPermissions()再startLocation() - 重新运行到鸿蒙(改 harmony-configs 必须重新编译)
插件内的鸿蒙权限与平板 deviceTypes 已内置,无需修改 uni_modules 目录。
最小示例
import {
initTrack,
requestPermissions,
onLocationUpdate,
onStatusChange,
startLocation,
stopLocation,
resumeLocation,
getCurrentLocation,
destroy
} from '@/uni_modules/keepalive-location'
onLocationUpdate((p) => console.log('point', p))
onStatusChange((s) => console.log('status', s))
await initTrack({ enableCache: true })
await requestPermissions()
await startLocation({ distanceFilter: 10, desiredAccuracy: 50 })
// ...
await stopLocation()
destroy()
隐私声明
- 本插件申请定位、后台定位、前台服务、通知、唤醒锁、电池优化、鸿蒙长时任务等权限,详见上文。
- 点位可本地环缓;仅当业务配置
upload.url时向该地址 HTTPS 上报。插件不默认上传至第三方。 - 不含广告 SDK。

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 141
赞赏 0
下载 12644694
赞赏 1952
赞赏
京公网安备:11010802035340号