uniGetLocation({
type = 'wgs84',
...moreOptions
} = {}) {
return new Promise((resolve) => {
uni.getLocation({
type,
success({
longitude,
latitude,
speed
}) {
resolve({
longitude,
latitude,
speed
});
},
fail(err) {
console.log('定位错误', err);
resolve(false);
},
...moreOptions,
});
});
},
- 发布:2026-04-20 09:05
- 更新:2026-04-20 09:08
- 阅读:27
产品分类: uniapp/App
PC开发环境操作系统: Windows
PC开发环境操作系统版本号: 10.0.8.100
HBuilderX类型: 正式
HBuilderX版本号: 4.87
手机系统: Android
手机系统版本号: Android 12
手机机型: 暂无
页面类型: vue
vue版本: vue2
打包方式: 云端
项目创建方式: HBuilderX
示例代码:
操作步骤:
请看bug描述
请看bug描述
预期结果:
能拿到对应时间真实的经纬度和速度信息
能拿到对应时间真实的经纬度和速度信息
实际结果:
不同时间拿到的经纬度和速度相同,切速度不为0
不同时间拿到的经纬度和速度相同,切速度不为0
bug描述:
使用uni.getLocation获取所在位置的经纬度和速度信息,但是不同的时间返回的经纬度和速度完全相同,而且速度都不为0,这是为什么?
作为DCloud官方人员,对该bug反馈评审如下:
评审意见
该反馈存在信息不完整和场景描述不清的问题,目前无法直接判定为框架bug,需要用户补充关键信息后方可进一步定位。
1. 反馈内容完整性评估
缺陷项:
- 复现步骤缺失:仅标注"请看bug描述",未提供具体操作流程(如调用间隔、测试场景、设备状态等)。
- 关键代码上下文缺失:代码示例仅为封装函数,未展示调用频率(是否定时轮询?间隔多久?)、调用时机(onShow? onLoad?)以及是否配置了定位SDK。
- 测试场景不明确:未说明测试时设备是静止状态还是移动状态,未说明两次获取位置的时间间隔。
需补充的信息:
- 两次调用
uni.getLocation的具体时间间隔(毫秒/秒级) - 测试时设备是否实际发生位移
- manifest.json中是否配置了高德定位SDK(Android平台App需配置第三方SDK才能获取精准定位)
- 使用的是标准基座、自定义基座还是正式打包的apk
- 是否开启
isHighAccuracy高精度定位参数
2. 技术可能性分析(基于知识库)
Android平台特殊机制:
- Android由于谷歌服务被墙,真机运行时基座使用DCloud申请的高德SDK可正常定位,但打包后必须开发者自行在manifest中配置高德定位SDK(AppKey),否则可能使用系统定位导致精度低或返回缓存数据。
- 使用
type: 'wgs84'时,Android系统定位可能返回缓存坐标,特别是未配置第三方定位SDK时。
关于速度返回:
speed字段为GPS原生返回速度值,若经纬度相同但速度不为0,可能是:- 获取的是缓存位置数据(坐标相同),但速度字段为实时计算值或上一次有效移动速度
- GPS信号漂移导致的微小位移被过滤(坐标未更新),但速度计算基于原始信号
注意: 知识库中cacheTimeout参数仅飞书小程序、支付宝小程序支持,App平台(Android/iOS)不支持该参数,无法通过此参数控制缓存。
3. 初步判断与建议
可能非Bug的情况:
- 若两次调用间隔较短(如1秒内),且未配置高德SDK,Android系统定位可能返回相同缓存坐标,这是系统层行为。
- 若设备实际静止,经纬度相同是预期结果;速度不为0可能是GPS噪点(常见于室内或信号不佳环境)。
建议验证步骤:
- 在manifest.json的App模块配置中配置高德定位SDK后重新打包测试
- 添加
isHighAccuracy: true和highAccuracyExpireTime: 5000参数尝试获取更高精度 - 若需持续跟踪位置变化,应使用
uni.onLocationChange而非频繁调用uni.getLocation - 测试时确保设备实际发生大于10米的位移(GPS定位存在精度阈值)
结论: 当前反馈不足以认定为框架bug,建议用户补充上述信息后重新评估,或前往插件市场搜索定位增强插件进行测试对比。