uni.getlocation在app端不支持返回速度字段,因底层封装未透出speed属性;需改用plus.geolocation并正确配置权限与参数才能获取实时速度。

uni.getLocation 在 App 端无法返回速度字段,这是官方已知限制,不是你参数写错或权限没开——它压根不支持。
为什么 uni.getLocation 拿不到速度
该 API 在 App 平台(Android/iOS)底层调用的是系统定位服务,但 uni-app 封装时未透出 speed 字段。即使原生 SDK 支持(如 iOS 的 CLLocation.speed 或 Android 的 Location.getSpeed()),uni.getLocation 的 success 回调里也永远没有 speed 属性。
- 常见错误现象:打印
res对象,发现只有latitude、longitude、altitude、accuracy,唯独缺speed - 文档没写 ≠ 实现了;uni-app 官方文档中从未承诺 App 端支持速度返回
- H5 和微信小程序更不用试——浏览器和微信定位 API 本身就不提供实时速度
App 端真正能拿到速度的唯一可靠方式:用 plus.geolocation
这是 HTML5+ 原生扩展提供的接口,可完整访问设备定位能力,包括实时速度。但必须注意:它只在 App 端生效,且需真机调试(模拟器通常返回 0 或 undefined)。
- 调用前先检查是否存在:
if (typeof plus !== 'undefined' && plus.geolocation) - 关键参数要设
enableHighAccuracy: true,否则部分 Android 设备可能不返回速度 - 速度单位是 m/s,需自行换算为 km/h(乘以 3.6)
- 不要依赖单次调用结果——移动中定位有抖动,建议连续采样 3–5 秒再取均值
plus.geolocation.getCurrentPosition((position) => {
const speed = position.coords.speed; // 单位:m/s
if (speed > 0) {
console.log(`当前速度:${(speed * 3.6).toFixed(1)} km/h`);
}
}, (e) => {
console.error('获取位置失败', e.message);
}, {
enableHighAccuracy: true,
timeout: 10000
});
自己算速度?别信“两点距离除以时间”的方案
有人试图用 uni.getLocation 频繁轮询,再通过经纬度算距离、除以时间差来估算速度。这在实际场景中基本不可用:
- 定位精度波动大(尤其室内/高楼区),10 米误差 → 速度计算偏差超 50%
- GPS 启动冷热机差异大,首次定位可能延迟 10–30 秒,期间速度全为 0
- 安卓某些厂商系统(如华为 EMUI)会主动限制定位频率,轮询反而被系统降权
uni.getLocation 调用间隔不能低于 1000ms,而人步行起步/停止阶段速度变化极快,低频采样直接丢失关键动态权限和 manifest.json 配置容易漏掉的关键项
即使代码写对,plus.geolocation 在 Android 上仍可能返回 speed: 0 或静默失败,大概率是 manifest 缺配置:
- Android:必须在
manifest.json→ “Android 设置” → “权限配置” 中勾选android.permission.ACCESS_FINE_LOCATION和android.permission.ACCESS_COARSE_LOCATION - iOS:需在
manifest.json→ “iOS 设置” → “描述信息” 中填写NSLocationWhenInUseUsageDescription,否则真机直接拒绝定位 - 注意:
plus.geolocation不需要额外申请scope.location这类 uni-app 权限,它走的是原生层,和uni.authorize无关
真机测试时,如果 speed 持续为 0,先看定位是否成功(position.coords.latitude 有值)、再查 manifest 权限、最后确认手机 GPS 是否开启并处于开阔环境——速度字段依赖高质量定位源,信号弱时系统宁可不填也不给错误值。











