深层链接是唤醒已安装app并跳转至指定页面的技术,区别于普通网页跳转:前者通过url scheme或intent协议触发系统级唤端,需预注册协议且依赖app已安装;后者仅在浏览器内导航。

什么是深层链接,它和普通跳转有什么区别
深层链接(Deep Link)不是打开网页,而是唤醒已安装的外部APP,并跳转到指定页面或执行特定操作。比如点击按钮后直接唤起微信并打开某个公众号文章,或者唤起支付宝完成一笔支付。这和 window.location.href 跳转到网页完全不同——后者走的是浏览器,前者走的是系统级 URL Scheme 或 Intent 协议。
关键区别在于:必须提前知道目标 APP 注册的协议名(如微信是 weixin://),且用户设备上必须已安装该 APP,否则会失败或降级为网页 fallback。
用 location.href 触发 URL Scheme 最简方案
最轻量的做法就是给按钮绑定 onclick,直接赋值 location.href 为目标 APP 的协议地址。浏览器会尝试启动对应 APP,失败时通常静默忽略(部分 iOS 会弹“无法打开链接”提示)。
- 微信公众号文章示例:
weixin://dl/business/?t=xxx(需服务号开通权限,且 t 参数由微信后台生成) - 支付宝支付跳转:
alipays://platformapi/startapp?appId=20000067&url=xxx - 飞书打开文档:
snssdk://open?schema=feishu%3A%2F%2Fxxx
注意:& 是 HTML 中 & 的实体编码,写在属性里必须转义;实际跳转前建议加 setTimeout 延迟 100ms,避免部分安卓浏览器因页面重绘中断唤端。
iOS 和 Android 行为差异及 fallback 处理
Android 对 URL Scheme 支持较宽松,多数情况下能唤起;iOS 从 iOS 9 开始限制未声明的 Scheme,且 iOS 10+ 更倾向用 Universal Links 替代。单纯靠 location.href 在 iOS 上失败率高,且无回调通知。
真正可靠的 fallback 方案不是“跳转失败就 alert”,而是:
- 先用 iframe src 指向 Scheme(隐蔽触发,不打断当前页)
- 立即启动定时器检测页面是否失焦或 visibilityState 变化
- 若 2s 内无响应,则跳转 fallback 网页或提示“请手动打开 APP”
示例片段:
const iframe = document.createElement('iframe');
iframe.src = 'weixin://';
iframe.style.display = 'none';
document.body.appendChild(iframe);
setTimeout(() => { document.body.removeChild(iframe); }, 100);
这个 iframe 方式比直接改 location.href 更容易触发唤端,但 iOS 14+ 仍可能拦截,不能完全依赖。
为什么你测试成功了,上线却失效
深层链接失效常不是代码问题,而是环境或配置卡点:
- 开发时用 Safari 测试微信 Scheme?无效——Safari 不支持第三方 Scheme 唤起微信,必须用微信内置浏览器或 QQ 浏览器
- Android 上点了没反应?检查目标 APP 是否被禁用了“外部调用”权限(尤其 MIUI、EMUI 默认关闭)
- URL 中含中文或特殊字符?必须用
encodeURIComponent()编码参数值,否则解析失败 - 使用了
http://或https://开头却想唤端?不可能,只有自定义协议(如weixin://)或 intent:// 才有效
最麻烦的其实是协议本身:微信、钉钉、企业微信等对 Scheme 调用有白名单机制,未接入官方 SDK 或未配置业务域名,即使链接正确也会被拦截。这时候前端再怎么写都绕不过去。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











