uni.openLocation仅支持单点标记跳转,无法实现A→B路线规划;必须手动拼接高德/百度等地图的URL Scheme,严格遵循坐标系(GCJ-02)、参数顺序、编码规范及平台差异逻辑。

不能直接在 uni-app App 内“嵌入”高德或百度地图做路线规划,必须跳转到已安装的第三方地图 App;uni.openLocation 只能打开单点,要实现 A→B 路线导航,必须手动拼 URL Scheme,并严格遵循各地图的参数规则和坐标系要求。
uni.openLocation 为什么只能标点、不能画路线
它本质是调用系统级「显示位置」能力,不是导航 SDK。参数只有 latitude、longitude、name、address,不接受起点、模式(驾车/步行)、路径规划等字段。传两个坐标?它只取第一个。iOS 上甚至会忽略 scale 参数,缩放级别由地图 App 自行决定。
- 适合场景:门店定位、打卡点跳转、附近服务展示
- 不适合场景:起点+终点路线、指定高德/百度导航、切换步行/骑行模式
- H5 端自动降级为网页地图(如百度地图网页版),微信小程序只能走
uni.openLocation→ 微信内置地图
Android 端跳转高德/百度必须校验坐标系和参数顺序
GCJ-02 坐标系是硬性前提——如果你的经纬度来自 GPS 设备、海外 API(WGS84)或未转换的百度坐标(BD09),跳转后目的地偏移 300–500 米是常态,用户真会迷路。
- 高德 Android:
androidamap://route?sourceApplication=xxx&navigate=yes&lat=<lat>&lon=<lon>&dev=0,lat/lon顺序不能反,dev=0表示启用纠偏 - 百度 Android:
baidumap://map/direction?origin=latlng:<lat>,<lon>&destination=latlng:<lat>,<lon>&mode=driving&coordinate=gcj02,注意origin和destination中的纬度在前、经度在后(反序!) - 所有中文、空格、逗号必须
encodeURIComponent(),否则 URL 解析失败,白屏或跳转无响应 - 可用
plus.runtime.isApplicationExist({ action: 'amapuri://' })安全检测是否安装,返回true后再plus.runtime.openURL()
iOS 端跳转不能依赖 isApplicationExist 检测
plus.runtime.isApplicationExist 在 iOS 上基本失效,强行调用两次(先检测、再跳转)会导致第二次 openURL 静默失败。manifest.json 必须提前声明白名单,否则系统直接拦截。
- manifest.json 中需配置:
"urlschemewhitelist": ["iosamap", "baidumap", "qqmap"] - 高德 iOS Scheme:
iosamap://path?sourceApplication=xxx&destlat=<lat>&destlon=<lon>&dev=1,dev=1关闭纠偏(与 Android 相反) - 百度 iOS Scheme:
baidumap://map/direction?origin=latlng:<lat>,<lon>&destination=latlng:<lat>,<lon>&mode=driving&src=yourappname,src是必填来源标识 - 跳转逻辑只能是:尝试
plus.runtime.openURL()→ 进fail回调 → 提示用户安装或打开网页版,不要加超时重试
最易被忽略的坑:坐标系转换和平台行为差异
没人会告诉你,同一个经纬度在高德、百度、腾讯地图里显示位置不同,根源就是坐标系不统一。WGS84 → GCJ-02 转换不是可选步骤,而是强制前置条件。另外,Android 允许你“先判断再跳”,iOS 要求“先跳再兜底”,这两个平台逻辑不能共用一套判断分支。别把 H5 或小程序的写法直接复制到 App 端,uni.openLocation 在 App 端不走系统选择弹窗,而是直接唤起默认地图,这点也常被误判。


















