Safari跳转google.navigation导航链接提示地址无效问题咨询
问题根因
你遇到的报错核心是两个问题:
- 你当前使用的
google.navigation:q=...是安卓端谷歌地图专属的自定义URL Scheme,iOS端Safari无法识别这个格式的协议头,直接判定为无效地址 - 你的代码里经纬度参数中间多了一个多余空格,即
${latitude}, ${longitude}里逗号后面的空格,会进一步导致iOS端URL解析失败
这个问题和浏览器缓存、应用权限无关,是平台URL协议格式不兼容导致的,所以你清缓存、授权所有权限也无法解决。
修复步骤
- 去掉经纬度参数里逗号后的多余空格,避免URL解析异常
- 区分iOS、安卓平台使用对应平台支持的谷歌地图唤起协议:iOS端使用适配苹果生态的
comgooglemaps://协议头,不要用安卓专属的google.navigation协议头 - 替换
window.open的唤起方式:Safari对window.open唤起非HTTP/HTTPS协议的拦截规则非常严格,改成动态创建<a>标签触发点击的方式唤起,同时增加兜底逻辑,唤起失败时自动跳转到网页版谷歌地图导航,避免用户卡在报错页
可直接复用的修复代码
// 替换成你实际拿到的经纬度值 const latitude = 0; const longitude = 0; // 识别iOS设备 const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; let jumpUrl; if (isIOS) { // iOS端谷歌地图导航协议,directionsmode可切换为transit/walking等出行方式 jumpUrl = `comgooglemaps://?daddr=${latitude},${longitude}&directionsmode=driving`; } else { // 安卓端保留原有导航协议 jumpUrl = `google.navigation:q=${latitude},${longitude}`; } // 创建a标签触发跳转,规避Safari拦截 const trigger = document.createElement('a'); trigger.href = jumpUrl; trigger.rel = 'noopener'; document.body.appendChild(trigger); trigger.click(); document.body.removeChild(trigger); // 兜底:300ms内未成功唤起本地应用,就跳转网页版谷歌地图 setTimeout(() => { if (!document.hidden) { window.location.href = `https://www.google.com/maps/dir/?api=1&destination=${latitude},${longitude}&travelmode=driving`; } }, 300);
补充说明
如果需要兼容Waze导航,iOS端Waze的唤起协议为waze://?ll=${latitude},${longitude}&navigate=yes,同样不能直接套用安卓端的协议格式。
内容的提问来源于stack exchange,提问作者Leonardo Baptista
相关产品推荐
相关产品推荐

