更新记录

1.0.0(2026-07-11)

  • 首发:Android、iOS、HarmonyOS、Web、微信小程序五端统一系统定位 API。
  • 公开 API 采用 get / request / watch / initLocation 命名(如 getLastLocationrequestPermissionwatchLocationinitLocation)。
  • 支持权限申请、后台定位、缓存读取、对象/元组监听与停止监听。
  • HarmonyOS 原生能力独立到 app-harmony/Bridge.etsindex.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),其中 stage0 缓存、1 实时、2 错误。

典型场景

缓存读取

不启动监听,直接读取最近一次定位结果:

getLastLocation((reading : XviewLocationReading) => {
    console.log(reading.stage, reading.latitude, reading.longitude)
})

单次定位

intervalMs0 表示单次定位;建议 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/towgs84 / 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 通知权限尚未授予

注意事项

  1. 页面卸载时调用 stopLocationWatch(true),避免后台监听泄漏。
  2. Android 后台定位依赖前台服务;不会申请 REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,若被系统终止请检查厂商白名单。
  3. 定位数据默认仅在设备本地处理;主动调用 reverseGeocode 时会将 GCJ-02 坐标发送至高德 Web Service。
  4. 插件所需 Android 权限见 package.jsondcloudext.declaration.permissions

隐私、权限声明

1. 本插件需要申请的系统权限列表:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/> <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION"/> <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WAKE_LOCK"/>

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。