uni.openlocation仅支持单点定位,无法画路线;需用url scheme唤起高德/百度地图实现导航,注意坐标系转换、ios白名单配置及三端差异化处理。

uni.openLocation 只能打开单点,别指望它画路线
很多人试过 uni.openLocation 传两个坐标,结果地图只标了一个点——这不是 bug,是设计如此。它本质是「跳转到某地并标记」,参数里根本没有 startLat、startLng 这类字段,iOS 和 Android 行为一致,但功能边界清晰:仅支持单点定位。如果你要的是「从我当前位置导航到目的地」,这个 API 就不够用。
构造 URL Scheme 是唯一可行的路线规划方案
想唤起高德或百度地图做路径规划,必须手动拼接合法的 URL Scheme(iOS)或 Intent URL(Android),再用 plus.runtime.openURL 触发。关键点不是“能不能跳”,而是“参数对不对、平台判得准不准、编码有没有漏”。
Map RTOS SDK - 高德地图嵌入式 Map SDK 接入助手,支持栅格/矢量 Map 地图渲染、覆盖物绘制、轨迹导航及适配器实现指南
- 高德 Android 路由必须用
androidamap://navi,iOS 必须用iosamap://navi;百度则是baidumap://map/direction(Android/iOS 通用) - 经纬度顺序不能错:高德要求
lat=xxx&lon=yyy,百度是origin=lat,lng&destination=lat,lng - 中文地址必须
encodeURIComponent,否则 iOS 直接静默失败 - 起点若用用户当前定位,需先调
uni.getLocation,且注意坐标系:高德认 GCJ-02,百度认 BD-09,直接传 WGS84 坐标大概率偏移 500 米以上
iOS 白名单和安卓 Intent 写法最容易踩坑
iOS 上不配 urlschemewhitelist,iosamap:// 或 baidumap:// 会被系统拦截,连错误回调都不会触发;安卓端则容易忽略 Intent 的包名校验逻辑,比如高德在某些国产 ROM 上需要额外加 &dev=0 才能唤起。
- manifest.json 中 iOS 白名单必须写成数组形式:
"urlschemewhitelist": ["iosamap", "baidumap"],少一个引号或逗号就失效 - 安卓跳转前建议用
plus.runtime.isApplicationInstalled检测是否安装,避免白屏;iOS 无法检测安装状态,只能靠 fallback 到uni.openLocation -
百度地图 Android 端若传了
coord_type=gcj02却没转坐标,会显示“位置无效”;高德 iOS 的style=2才启用驾车导航,style=0是步行,别默认抄样例
H5 和小程序要单独处理,不能复用 App 路由逻辑
App 端走原生跳转,H5 端只能靠高德/百度的 Web URI(如 https://uri.amap.com/navi?from=&to=),而微信小程序必须用 wx.openLocation,它不支持第三方地图选择,只走微信内置地图。三端混写时,#ifdef APP-PLUS、#ifdef H5、#ifdef MP-WEIXIN 这三个条件编译指令不是可选项,是必填项。
- H5 的高德 Web URI 必须带
callnative=1才能尝试唤起 App,否则永远停留在网页版 - 微信小程序里传经纬度给
wx.openLocation,名称和地址字段不能为空字符串,否则定位失败 - 不要在 H5 里用
plus.runtime.openURL,它在非 App 环境下直接报plus is not defined










