更新记录
1.0.0(2026-05-30) 下载此版本
初次提交
平台兼容性
uni-app x(4.75)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| × | × | 5.0 | √ | √ | × |
其他
| 多语言 | 暗黑模式 | 宽屏模式 |
|---|---|---|
| √ | √ | √ |
laoqianjunzi-gps
laoqianjunzi-gps 是一个面向 uni-app x 的系统定位 UTS 插件,提供统一的定位权限申请、最近一次定位读取、实时监听、后台定位能力申请与运行时能力查询接口。
本文档只说明当前插件对外暴露的统一 API,适合直接在 uvue 页面或 uts 逻辑中接入。
插件定位
- 适用框架:
uni-app x - 最低 HBuilderX 版本:
5.07 - 建议 uni-app x 版本:
4.75及以上 - 支持平台:
Web、Android、iOS、Harmony - Android 最低版本:
minSdkVersion 21 - iOS 最低版本:
12.0 - 插件类型:
UTS原生插件
能力概览
已提供的核心能力
- 统一的前台定位权限申请接口
- 统一的后台定位能力申请接口
- 读取最近一次缓存定位
- 启动实时定位监听
- 支持对象回调和 tuple 回调两种结果形式
- 查询运行时能力与平台特征
- Android 前台服务通知栏托管
平台能力矩阵
| 能力 | Web | Android | iOS | Harmony |
|---|---|---|---|---|
| 定位权限申请 | 支持 | 支持 | 支持 | 支持 |
| 最近一次定位读取 | 支持 | 支持 | 支持 | 支持 |
| 实时定位监听 | 支持 | 支持 | 支持 | 支持 |
| 后台定位能力申请 | 不支持 | 支持 | 支持 | 支持 |
| 打开系统定位设置 | 不支持 | 支持 | 支持 | 支持 |
| 原生定位引擎 | 否 | 是 | 是 | 是 |
| 通知栏参数生效 | 不支持 | 支持 | 不支持 | 不支持 |
安装与导入
将插件放入项目的 uni_modules 目录后,可直接导入使用,无需额外安装 JavaScript 依赖。
import {
askPermission,
describeRuntime,
hasPermission,
isSwitchEnabled,
openSystemSettings,
prepare,
readLastSnapshot,
requestBackgroundMode,
startWatch,
stopWatch,
type LqjGpsReading,
type LqjGpsWatchOptions
} from "@/uni_modules/laoqianjunzi-gps"
快速开始
推荐接入顺序:
- 页面加载后先调用
prepare() - 按平台选择定位权限名
- 调用
askPermission()申请前台定位权限 - 如需后台定位,先调用
requestBackgroundMode() - 使用
startWatch()或startTuple()开始监听 - 页面销毁时调用
stopWatch()
最小可用示例
<script setup lang="uts">
import {
askPermission,
prepare,
startWatch,
stopWatch,
type LqjGpsReading,
type LqjGpsWatchOptions
} from "@/uni_modules/laoqianjunzi-gps"
let permissionName = 'location'
// #ifdef APP-ANDROID
permissionName = 'android.permission.ACCESS_FINE_LOCATION'
// #endif
// #ifdef APP-IOS
permissionName = 'location'
// #endif
// #ifdef APP-HARMONY
permissionName = 'ohos.permission.LOCATION'
// #endif
// #ifdef WEB
permissionName = 'location'
// #endif
function startDemo() : void {
const options : LqjGpsWatchOptions = {
intervalMs : 1000,
distanceMeters : 0,
backgroundMode : false,
emitCachedFirst : true,
notificationTitle : '定位服务运行中',
notificationText : '应用正在持续获取位置信息',
notificationIconName : null
}
startWatch(options, (reading : LqjGpsReading) => {
console.log('定位结果', reading.stage, reading.latitude, reading.longitude, reading.message)
})
}
onMounted(() => {
prepare()
askPermission(permissionName, (granted : boolean) => {
if (granted) {
startDemo()
}
})
})
onUnmounted(() => {
stopWatch(true)
})
</script>
API 总览
导出方法
prepare() : void
describeRuntime() : LqjGpsRuntimeProfile
hasPermission(permissionName : string) : boolean
askPermission(permissionName : string, callback : (granted : boolean) => void) : void
isSwitchEnabled() : boolean
openSystemSettings() : void
requestBackgroundMode(callback : (granted : boolean) => void) : void
readLastTuple(callback : (stage : 0 | 1 | 2, latitude : number, longitude : number, speed : number, altitude : number, heading : number) => void) : void
readLastSnapshot(callback : (reading : LqjGpsReading) => void) : void
startTuple(options : LqjGpsWatchOptions, callback : (stage : 0 | 1 | 2, latitude : number, longitude : number, speed : number, altitude : number, heading : number) => void) : void
startWatch(options : LqjGpsWatchOptions, callback : (reading : LqjGpsReading) => void) : void
stopWatch(dismissNotification : boolean) : void
prepare()
用于初始化插件运行上下文。
- 建议调用时机:页面
onMounted、组件初始化、首次定位前 - Android:绑定当前
Activity并准备原生定位引擎 - iOS:初始化
CLLocationManager - Harmony:清理上一次残留监听状态
- Web:空实现,可直接调用
describeRuntime()
返回当前平台的运行时能力。
返回值类型:LqjGpsRuntimeProfile
| 字段 | 类型 | 说明 |
|---|---|---|
platformName |
string |
平台名称,例如 Android、iOS、Harmony、Web |
supportsOpenSettings |
boolean |
是否支持打开系统定位设置 |
supportsBackgroundMode |
boolean |
是否支持后台定位模式 |
usesNativeEngine |
boolean |
是否使用原生定位实现 |
hasPermission(permissionName)
检查当前平台下某个定位权限是否已经授权。
推荐传入的权限名见下文“权限参数说明”。
注意事项:
- Web 端的结果基于当前运行期内是否成功获取过定位,并不是浏览器权限面板的完整映射
- iOS 端如果传入带有
background或always含义的字符串,会按后台定位权限判断 - Harmony 端会按传入的原生权限名精确判断
askPermission(permissionName, callback)
申请前台定位权限。
callback(true):权限已授予callback(false):权限被拒绝、当前环境不可申请或系统服务不可用
建议:
- Android 使用
android.permission.ACCESS_FINE_LOCATION - iOS 使用
location - Harmony 使用
ohos.permission.LOCATION - Web 使用
location
isSwitchEnabled()
检查系统定位总开关是否可用。
- Android:检查 GPS 或网络定位是否启用
- iOS:检查系统定位服务是否开启
- Harmony:检查系统定位服务是否开启
- Web:固定返回
true
openSystemSettings()
尝试打开系统定位设置相关页面。
- Android:打开系统定位开关页面
- iOS:打开当前应用的系统设置页
- Harmony:触发系统定位开关请求
- Web:空实现
requestBackgroundMode(callback)
申请后台定位能力。
- Android:必要时请求
ACCESS_BACKGROUND_LOCATION - iOS:申请
Always定位授权 - Harmony:申请
LOCATION_IN_BACKGROUND与KEEP_BACKGROUND_RUNNING - Web:固定返回
false
建议仅在业务明确需要后台持续定位时调用。
readLastTuple(callback)
读取最近一次定位结果,使用 tuple 结构回调。
参数说明:
| 回调参数 | 类型 | 说明 |
|---|---|---|
stage |
0 \| 1 \| 2 |
0 表示缓存结果,1 表示实时结果,2 表示错误 |
latitude |
number |
纬度 |
longitude |
number |
经度 |
speed |
number |
速度,单位 m/s |
altitude |
number |
海拔 |
heading |
number |
朝向 |
说明:
- 本方法优先返回最近一次已有结果,部分平台在没有缓存时会主动补读一次定位
- 若当前没有缓存定位、权限未授予或系统服务不可用,会回调错误阶段
readLastSnapshot(callback)
读取最近一次定位结果,使用对象结构回调。
返回类型:LqjGpsReading
| 字段 | 类型 | 说明 |
|---|---|---|
message |
string |
当前结果描述 |
stage |
'cached' \| 'live' \| 'error' |
结果阶段 |
latitude |
number |
纬度 |
longitude |
number |
经度 |
speed |
number |
速度,单位 m/s |
altitude |
number |
海拔 |
heading |
number |
朝向 |
accuracy |
number |
水平精度 |
verticalAccuracy |
number |
垂直精度 |
推荐优先使用本方法,便于保留错误信息与精度字段。
startTuple(options, callback)
启动定位监听,回调为 tuple 结构。
- 适合只关心经纬度和少量基础数值的场景
- 遇到错误时
stage为2 intervalMs为0时按单次实时定位处理
startWatch(options, callback)
启动定位监听,回调为 LqjGpsReading 对象。
- 适合业务页面、日志展示、状态机判断
emitCachedFirst为true时,可能先收到一条cached结果- 后续实时结果的
stage为live - 失败时会收到
stage = 'error'的对象
stopWatch(dismissNotification)
停止当前定位监听。
- Android:
dismissNotification = true时会同时关闭前台定位通知 - iOS:停止系统定位更新,忽略通知参数
- Harmony:停止定位监听并结束后台运行状态
- Web:取消浏览器侧位置更新监听
建议页面退出时始终调用一次。
监听参数说明
startTuple() 与 startWatch() 共用 LqjGpsWatchOptions。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
notificationTitle |
string \| null |
Android 为 定位服务运行中 |
后台定位通知标题,仅 Android 生效 |
notificationText |
string \| null |
Android 为 应用正在持续获取位置信息 |
后台定位通知内容,仅 Android 生效 |
notificationIconName |
string \| null |
null |
Android 通知图标资源名,支持 drawable / mipmap |
intervalMs |
number \| null |
1000 |
实时回调最小间隔,0 表示单次定位 |
distanceMeters |
number \| null |
0 |
最小位移过滤,0 表示不按距离过滤 |
backgroundMode |
boolean \| null |
false |
是否启用后台定位模式 |
emitCachedFirst |
boolean \| null |
false |
启动监听时是否先下发缓存定位 |
参数行为说明
intervalMs = 0:触发单次实时定位,拿到一条实时结果后自动停止distanceMeters > 0:App 端会按位移阈值过滤回调,Web 端不依赖该参数做严格距离过滤backgroundMode = true:启动前应先调用requestBackgroundMode()emitCachedFirst = true:适合先展示最近位置,再等待实时结果
权限参数说明
推荐按平台使用以下权限名。
| 平台 | 推荐前台权限名 | 备注 |
|---|---|---|
| Android | android.permission.ACCESS_FINE_LOCATION |
插件内部同时声明了粗略定位、后台定位与前台服务权限 |
| iOS | location |
申请前台定位;后台定位请使用 requestBackgroundMode() |
| Harmony | ohos.permission.LOCATION |
插件会联动申请精确/近似定位能力 |
| Web | location |
由浏览器授权流程决定 |
插件已包含的原生权限声明
Android 已声明:
android.permission.ACCESS_FINE_LOCATIONandroid.permission.ACCESS_COARSE_LOCATIONandroid.permission.ACCESS_BACKGROUND_LOCATIONandroid.permission.FOREGROUND_SERVICEandroid.permission.FOREGROUND_SERVICE_LOCATIONandroid.permission.POST_NOTIFICATIONS
iOS 已声明:
NSLocationWhenInUseUsageDescriptionNSLocationAlwaysUsageDescriptionNSLocationAlwaysAndWhenInUseUsageDescriptionUIBackgroundModes -> location
Harmony 已声明:
ohos.permission.LOCATIONohos.permission.APPROXIMATELY_LOCATIONohos.permission.LOCATION_IN_BACKGROUNDohos.permission.KEEP_BACKGROUND_RUNNING
后台定位说明
Android
- 使用后台定位时会启动前台服务
notificationTitle、notificationText、notificationIconName会体现在系统通知栏- Android 10 及以上需要后台定位权限
- Android 13 及以上如果系统通知权限被禁用,前台服务通知展示可能受到系统限制
iOS
- 后台定位依赖
Always授权与location后台模式 - 通知栏参数不会生效
- 建议在用户明确知情的业务场景中再申请后台能力
Harmony
- 后台定位依赖
LOCATION_IN_BACKGROUND与KEEP_BACKGROUND_RUNNING - 插件会进入后台运行状态保持持续定位
- 通知栏参数不会生效
Web
- 不支持后台定位模式
requestBackgroundMode()固定回调false
阶段值与错误码
阶段值
| tuple 阶段 | 对象阶段 | 含义 |
|---|---|---|
0 |
cached |
缓存定位结果 |
1 |
live |
实时定位结果 |
2 |
error |
失败或不可用 |
错误码语义
| 错误码 | 含义 |
|---|---|
9201 |
定位权限尚未授予 |
9202 |
定位服务当前不可用 |
9203 |
暂时没有可用的定位结果 |
9204 |
后台定位能力未获授权 |
9205 |
当前平台不支持此操作 |
9206 |
定位参数不合法 |
说明:
- 对象回调会通过
message返回错误文本 - tuple 回调只用
stage = 2表示失败,不携带详细错误文本 - 需要精确区分失败原因时,优先使用
readLastSnapshot()与startWatch()
使用示例
查询运行时能力
const runtime = describeRuntime()
console.log(runtime.platformName)
console.log(runtime.supportsBackgroundMode)
console.log(runtime.supportsOpenSettings)
console.log(runtime.usesNativeEngine)
读取最近一次定位
readLastSnapshot((reading) => {
if (reading.stage == 'error') {
console.log('读取失败', reading.message)
return
}
console.log('最近定位', reading.latitude, reading.longitude)
})
启动后台定位
requestBackgroundMode((granted : boolean) => {
if (granted == false) {
console.log('后台定位能力未授予')
return
}
startWatch({
intervalMs : 3000,
distanceMeters : 10,
backgroundMode : true,
emitCachedFirst : true,
notificationTitle : '后台定位中',
notificationText : '正在持续获取位置信息',
notificationIconName : null
}, (reading) => {
console.log(reading.stage, reading.latitude, reading.longitude)
})
})
示例页面
插件内置了一个完整演示页,可用于直接验证权限、缓存定位、实时监听与后台能力:
- 页面路径:
uni_modules/laoqianjunzi-gps/pages/index
演示页包含:
- 运行时能力展示
- 权限状态展示
- 系统定位开关状态展示
- 最近一次定位读取
- tuple 监听与对象监听
- 后台模式申请
- 日志输出与参数面板
平台差异说明
- Web 端的
hasPermission()仅反映当前运行期内是否成功获取过定位结果 - Web 端不支持后台定位,也不提供系统设置跳转
- Android 后台模式依赖前台服务,通知栏参数只在 Android 有效果
- iOS 后台定位由系统授权流程决定,建议配合业务提示文案使用
- Harmony 连续监听的时间粒度会按秒级请求系统能力
distanceMeters在 Harmony 端由插件层按位移阈值过滤回调
接入建议
- 首次进入页面时先调用
prepare() - 先申请前台定位权限,再启动定位监听
- 需要后台持续定位时,单独调用
requestBackgroundMode() - 页面离开、页面隐藏或业务结束时及时调用
stopWatch() - 需要保留错误细节、精度字段时,优先使用对象回调接口
- 需要最简数值结果时,可使用 tuple 回调接口
隐私与数据说明
- 插件只负责读取系统定位结果
- 插件本身不内置远程上传、账号绑定、轨迹存储与服务端同步逻辑
- 若业务需要上传轨迹或保存历史位置,应由业务侧自行实现并补充隐私说明

收藏人数:
https://gitee.com/laoqianjunzi/laoqianjunzi-gps
下载插件并导入HBuilderX
下载示例项目ZIP
赞赏(0)
下载 1144
赞赏 2
下载 12099050
赞赏 1918
赞赏
京公网安备:11010802035340号