uni.openLocation在H5端仅打开Web地图,App端才能唤起原生地图;iOS无法可靠检测地图App安装状态,需白名单+尝试跳转+兜底;高德与百度URL Scheme参数、坐标系、起点及导航模式均不兼容,须严格区分处理。

uni.openLocation 在 H5 和 App 端表现完全不同
直接调用 uni.openLocation 是最简路径,但它在不同端行为差异极大:H5 端根本不会跳转地图 App,只会打开一个基于浏览器的地图页(通常是高德 Web 版);App 端(iOS/Android)才真正能唤起本地地图应用。很多人卡在这一步,以为“写了就通”,结果测试 H5 时发现没反应,其实是预期错误。
- H5 端:强制走 Web 地图,
uni.openLocation的name、address参数有效,但无法指定高德或百度,也无法触发驾车/步行导航模式 - App 端:才能真正调起原生地图 App,但必须依赖 URL Scheme,且 iOS 要提前在
manifest.json的urlschemewhitelist里声明amapuri://和baidumap:// - 微信小程序端:不支持 URL Scheme,只能用
wx.openLocation(仅限微信内置地图),无法跳转高德/百度 App
Android 和 iOS 唤起地图的判断逻辑不能共用
iOS 无法可靠检测「是否已安装高德/百度」,plus.runtime.isApplicationExist 在 iOS 上返回恒为 false 或不可靠;而 Android 可以用它准确判断。所以你不能写一个「先检测再跳转」的统一函数,必须按平台拆开处理。
- Android:可安全调用
plus.runtime.isApplicationExist({ action: 'amapuri://' }),返回true就直接plus.runtime.openURL - iOS:必须放弃检测,改为「白名单 + 尝试跳转 + 错误兜底」。若
plus.runtime.openURL失败(回调进fail),再提示用户手动安装或跳转网页版 - 别在 iOS 上加超时重试——系统不允许重复尝试未声明的 Scheme,第二次调用会静默失败
高德和百度的 URL Scheme 参数命名和坐标系不兼容
两家地图的跳转协议看起来像,但关键字段名、默认行为、坐标系要求全都不一样。混用会导致定位偏移几百米,或者直接解析失败。
- 高德(
amapuri://)用sourceApplication标识来源,dev=1关闭纠偏,lat/lon必须是 GCJ-02 坐标(国内标准),不接受 WGS84 - 百度(
baidumap://)用src标识来源,coordinate指定坐标系(gcj02或wgs84),location字段格式是纬度,经度(注意顺序反了!) - 起点参数:高德用
from=我的位置,百度必须传origin=latlng:才能带起点,否则只显示终点 - 导航模式:高德靠
navigate=yes,百度靠mode=driving(可选walking/bicycling)
uni-app 项目里必须配 manifest.json 和权限,缺一不可
很多开发者只改了代码,忘了改配置,导致 App 端白屏或跳转无声无息。这不是代码 bug,是打包时就被系统拦截了。
- Android 权限:
manifest.json的app-plus → distribute → android → permissions必须包含 - iOS 白名单:
manifest.json的mp-weixin下不用管,但app-plus下必须有urlschemewhitelist,值为["amapuri", "baidumap"](注意去掉了://) - H5 端不需要这些,但要确保你在
config.js里配好了高德 Web Key,并在页面中引入了AMap.WebMap或使用uni.openLocation的 Web 回退逻辑
实际跳转逻辑里最易被忽略的是坐标系转换——如果你的经纬度来自 GPS 设备或后端 WGS84 原始数据,直接喂给高德 Scheme 会严重偏移。必须用 coordtransform 类库转成 GCJ-02,百度则要看你传的是哪种 coordinate 类型。这点没处理好,用户导航到隔壁小区,比功能没实现还致命。










