更新记录
1.0.0(2026-07-11)
- 首发:Android、iOS、HarmonyOS、Web、微信小程序五端统一系统定位 API。
- 公开 API 采用 get / request / watch / initLocation 命名(如
getLastLocation、requestPermission、watchLocation、initLocation)。 - 支持权限申请、后台定位、缓存读取、对象/元组监听与停止监听。
- HarmonyOS 原生能力独立到
app-harmony/Bridge.ets,index.uts仅保留统一 API 包装。 - 提供 uni-app / uni-app x 示例页面。
平台兼容性
uni-app(5.06)
| Vue2 | Vue2插件版本 | Vue3 | Vue3插件版本 | Chrome | Chrome插件版本 | Safari | Safari插件版本 | app-vue | app-vue插件版本 | app-nvue | app-nvue插件版本 | Android | Android插件版本 | iOS | 鸿蒙 | 鸿蒙插件版本 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | 1.0.0 | √ | 1.0.0 | √ | 1.0.0 | √ | 1.0.0 | √ | 1.0.0 | √ | 1.0.0 | 5.0 | 1.0.0 | - | √ | 1.0.0 |
| 微信小程序 | 微信小程序插件版本 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | 1.0.0 | × | × | × | × | × | × | × | × | × | × | × |
uni-app x(5.06)
| Chrome | Chrome插件版本 | Safari | Safari插件版本 | Android | Android插件版本 | iOS | iOS插件版本 | 鸿蒙 | 鸿蒙插件版本 | 微信小程序 | 微信小程序插件版本 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | 1.0.0 | √ | 1.0.0 | 5.0 | 1.0.0 | √ | 1.0.0 | √ | 1.0.0 | √ | 1.0.0 |
其他
| 多语言 | 暗黑模式 | 宽屏模式 |
|---|---|---|
| √ | √ | √ |
xview-location
面向 uni-app / uni-app x 的系统定位 UTS 插件。Android、iOS、HarmonyOS、Web、微信小程序五端 API 与返回结构一致,不依赖第三方定位 SDK。
能力概览
- 权限申请、后台定位、系统设置跳转
- 缓存读取、单次定位、持续监听(对象 / 元组双回调)
- WGS84 / GCJ-02 / BD-09 坐标转换
- 可选高德 Web Service 逆地理编码
- Android 息屏持续定位(前台服务 + 原生队列回灌)
典型流程
initLocation() → 检查/申请权限 → watchLocation() 或 getLastLocation() → stopLocationWatch()
快速开始
import {
requestPermission,
checkPermission,
initLocation,
watchLocation,
stopLocationWatch,
type XviewLocationReading,
type XviewLocationOptions
} from '@/uni_modules/xview-location'
let permissionName = 'location'
// #ifdef APP-ANDROID
permissionName = 'android.permission.ACCESS_FINE_LOCATION'
// #endif
// #ifdef APP-IOS
permissionName = 'ios.location.whenInUse'
// #endif
// #ifdef APP-HARMONY
permissionName = 'ohos.permission.LOCATION'
// #endif
// #ifdef MP-WEIXIN
permissionName = 'scope.userLocation'
// #endif
initLocation()
if (checkPermission(permissionName) == false) {
requestPermission(permissionName, (granted : boolean) => {
if (granted == false) {
return
}
startLocationWatch()
})
} else {
startLocationWatch()
}
function startLocationWatch() {
const options : XviewLocationOptions = {
intervalMs : 1000,
distanceMeters : 0,
backgroundMode : false,
emitCachedFirst : true,
notificationTitle : '定位服务运行中',
notificationText : '应用正在持续获取位置信息',
notificationIconName : null
}
watchLocation(options, (reading : XviewLocationReading) => {
if (reading.stage === 'error') {
console.log(reading.message)
return
}
console.log(reading.stage, reading.latitude, reading.longitude)
})
}
// 页面卸载时停止监听
stopLocationWatch(true)
对象回调适合页面展示;需要更轻量的签名时,使用 watchLocationTuple / getLastLocationTuple,回调参数为 (stage, latitude, longitude, speed, altitude, heading),其中 stage:0 缓存、1 实时、2 错误。
典型场景
缓存读取
不启动监听,直接读取最近一次定位结果:
getLastLocation((reading : XviewLocationReading) => {
console.log(reading.stage, reading.latitude, reading.longitude)
})
单次定位
intervalMs 传 0 表示单次定位;建议 emitCachedFirst: false,每次点击重新调用 watchLocation / watchLocationTuple:
const options : XviewLocationOptions = {
intervalMs : 0,
distanceMeters : 0,
backgroundMode : false,
emitCachedFirst : false,
notificationTitle : null,
notificationText : null,
notificationIconName : null
}
watchLocation(options, (reading : XviewLocationReading) => {
if (reading.stage === 'live') {
console.log(reading.latitude, reading.longitude)
}
})
再次调用 watchLocation / watchLocationTuple 会先停止上一次监听。
持续监听
按间隔持续回调,emitCachedFirst: true 时启动后会先返回缓存定位:
watchLocation({
intervalMs : 5000,
distanceMeters : 0,
backgroundMode : false,
emitCachedFirst : true
}, (reading : XviewLocationReading) => {
// cached / live / error
})
intervalMs 是系统定位请求的最小间隔,不是固定周期定时器;卫星信号、静止状态、省电策略可能导致实际间隔变长。
息屏持续定位
息屏定位仍使用 watchLocation(),关键参数为 backgroundMode: true。需先申请后台定位;Android 还需通知权限(API 33+)以展示前台服务通知。
import { readPendingLocations, requestBackgroundMode } from '@/uni_modules/xview-location'
const options : XviewLocationOptions = {
intervalMs : 5000,
distanceMeters : 0,
backgroundMode : true,
emitCachedFirst : false,
notificationTitle : 'Xview Location 息屏定位',
notificationText : '正在持续获取位置信息',
notificationIconName : null
}
requestBackgroundMode((granted : boolean) => {
if (granted == false) {
return
}
watchLocation(options, (reading : XviewLocationReading) => {
console.log(reading.stage, reading.latitude, reading.longitude)
})
})
坐标转换
定位结果默认 WGS84。高德、腾讯等国内地图通常用 GCJ-02,百度地图用 BD-09:
const gcj02 = convertCoordinate(39.908823, 116.397470, 'wgs84', 'gcj02')
console.log(gcj02.latitude, gcj02.longitude)
convertCoordinates 支持批量转换;isGcj02OffsetRegion 判断是否在常用 GCJ-02 偏移算法范围内。算法存在米级误差,不适用于测绘;范围外 WGS84 与 GCJ-02 转换会原样返回。
逆地理编码
reverseGeocode 使用高德 Web Service,传入 WGS84 或 BD-09 时会先转为 GCJ-02:
reverseGeocode({
latitude : 39.908823,
longitude : 116.397470,
coordinateType : 'wgs84',
apiKey : '你的高德 Web Service Key',
radiusMeters : 1000
}, (result : XviewLocationReverseGeocodeResult) => {
if (result.success && result.address != null) {
console.log(result.address!.formatted)
}
})
- Key 由业务方申请和保管,插件只用于本次请求,不会持久化。
- 请求发送至
https://restapi.amap.com;Web 需处理跨域与 Key 安全配置;微信小程序需将该域名加入合法 request 域名。 - 不建议在每次
watchLocation回调中直接请求,应在业务层按距离或时间节流。
公开 API
初始化与运行时
| 方法 | 说明 |
|---|---|
initLocation() |
初始化当前平台定位上下文,建议在页面 onLoad 调用。 |
getRuntimeProfile() |
返回平台名、后台/息屏/逆地理编码等运行时能力。 |
XviewLocationRuntimeProfile 主要字段:
| 字段 | 说明 |
|---|---|
platformName |
当前平台名称 |
supportsBackgroundMode |
是否支持后台持续定位 |
supportsScreenOffTracking |
是否具备息屏持续定位能力(需权限与系统条件) |
supportsReverseGeocode |
是否支持逆地理编码 |
supportsOpenSettings |
是否支持打开系统设置 |
usesNativeEngine |
是否使用平台原生定位入口(非 uni.getLocation 封装) |
权限与系统设置
| 方法 | 说明 |
|---|---|
checkPermission(permissionName) |
检查指定权限是否已授权 |
requestPermission(permissionName, callback) |
申请定位权限,回调 (granted: boolean) |
isLocationEnabled() |
检查系统或平台定位总开关 |
openLocationSettings() |
打开系统或平台定位设置页 |
requestBackgroundMode(callback) |
申请后台定位能力 |
requestNotificationPermission(callback) |
Android 13+ 申请通知权限 |
getAndroidDiagnostics() |
Android 诊断快照;其他平台返回 null |
openNotificationSettings() |
打开当前应用通知设置页 |
openBatterySettings() |
打开当前应用电池/后台限制设置页 |
各平台 permissionName:
| 平台 | permissionName |
|---|---|
| Web | location |
| Android | android.permission.ACCESS_FINE_LOCATION |
| iOS | ios.location.whenInUse |
| HarmonyOS | ohos.permission.LOCATION |
| 微信小程序 | scope.userLocation |
读取与监听
| 方法 | 说明 |
|---|---|
getLastLocation(callback) |
读取最近一次定位,对象形式 |
getLastLocationTuple(callback) |
读取最近一次定位,元组形式 |
watchLocation(options, callback) |
启动对象形式监听 |
watchLocationTuple(options, callback) |
启动元组形式监听 |
stopLocationWatch(dismissNotification) |
停止监听;Android 传 true 可移除前台服务通知 |
readPendingLocations() |
Android:亮屏/onShow 回灌息屏缓存,返回回灌条数;其他平台恒为 0 |
坐标转换
| 方法 | 说明 |
|---|---|
convertCoordinate(lat, lng, from, to) |
单点转换,from/to 为 wgs84 / gcj02 / bd09 |
convertCoordinates(points, from, to) |
批量转换 |
isGcj02OffsetRegion(lat, lng) |
是否在 GCJ-02 偏移算法常用范围 |
逆地理编码
| 方法 | 说明 |
|---|---|
reverseGeocode(options, callback) |
高德 Web Service 逆地理编码 |
类型说明
XviewLocationOptions
| 字段 | 类型 | 说明 |
|---|---|---|
intervalMs |
number |
最小回调间隔(毫秒),0 为单次定位,默认 1000 |
distanceMeters |
number |
最小位移(米),0 为不过滤,默认 0 |
backgroundMode |
boolean |
是否启用后台定位,默认 false |
emitCachedFirst |
boolean |
启动时是否先回调缓存定位,默认 true |
notificationTitle |
string \| null |
Android 前台服务通知标题 |
notificationText |
string \| null |
Android 前台服务通知内容 |
notificationIconName |
string \| null |
Android 通知图标资源名,不传则用应用图标 |
XviewLocationReading
| 字段 | 类型 | 说明 |
|---|---|---|
stage |
'cached' \| 'live' \| 'error' |
缓存 / 实时 / 错误 |
message |
string |
结果或错误说明 |
latitude / longitude |
number |
纬度 / 经度 |
speed |
number |
速度(m/s),不可用为 0 |
altitude |
number |
海拔(米),不可用为 0 |
heading |
number |
方向角,不可用为 0 |
accuracy |
number |
水平精度(米),不可用为 0 |
verticalAccuracy |
number |
垂直精度(米),不可用为 0 |
XviewLocationAndroidDiagnostics
| 字段 | 说明 |
|---|---|
sdkInt / targetSdkVersion |
系统 API 级别 / targetSdk |
fineLocationGranted |
精确/粗略定位权限 |
backgroundLocationGranted |
后台定位权限 |
notificationGranted |
通知权限(API 33 以下恒为 true) |
foregroundServiceRunning |
定位前台服务是否运行 |
batteryOptimizationIgnored |
是否已忽略电池优化(只读) |
screenInteractive |
屏幕是否处于交互状态 |
错误码
stage === 'error' 或元组 stage === 2 时,message 含对应说明:
| 错误码 | 说明 |
|---|---|
| 9201 | 定位权限尚未授予 |
| 9202 | 定位服务当前不可用 |
| 9203 | 暂时没有可用的定位结果 |
| 9204 | 后台定位能力未获授权 |
| 9205 | 当前平台不支持此操作 |
| 9206 | 定位参数不合法 |
| 9207 | 当前运行环境没有可用的原生定位对象 |
| 9208 | 逆地理编码配置缺失 |
| 9209 | 逆地理编码网络请求失败 |
| 9210 | 逆地理编码服务返回失败 |
| 9211 | 通知权限尚未授予 |
注意事项
- 页面卸载时调用
stopLocationWatch(true),避免后台监听泄漏。 - Android 后台定位依赖前台服务;不会申请
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,若被系统终止请检查厂商白名单。 - 定位数据默认仅在设备本地处理;主动调用
reverseGeocode时会将 GCJ-02 坐标发送至高德 Web Service。 - 插件所需 Android 权限见
package.json中dcloudext.declaration.permissions。

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 18
赞赏 0
下载 12416161
赞赏 1933
赞赏
京公网安备:11010802035340号