移动端外部浏览器唤起app必须分平台实现:android用intent://协议(需包名、scheme与manifest严格一致且fallback url编码),ios必须用universal links(https域名+apple-app-site-association文件+associated domains配置),禁用iframe等静默触发方式,fallback应以显式用户操作引导为主。

移动端外部浏览器(非微信)唤起APP,不能只靠 a 标签写个 myapp:// 就完事——90% 的失败都卡在协议触发被拦截、fallback 逻辑失效、或 Android/iOS 行为不一致上。
Android 端用 intent:// 协议才真正可靠
Android 原生支持 intent://,它比自定义 scheme 更健壮:能指定包名、Activity、flags,还能带 browser_fallback_url。但必须满足几个硬性条件:
-
scheme和package必须与AndroidManifest.xml中<intent-filter></intent-filter>完全一致(大小写敏感) -
S.browser_fallback_url必须 URL 编码,否则整个 intent 解析失败 - Chrome 80+ 要求跳转必须由真实用户点击触发,
setTimeout+window.location.href会静默失败 - 华为、小米等定制 ROM 可能拦截
intent://,此时需降级为scheme+ 手动 fallback
示例链接(已编码):intent://open?param=1#Intent;scheme=myapp;package=com.example.myapp;S.browser_fallback_url=https%3A%2F%2Fplay.google.com%2Fstore%2Fapps%2Fdetails%3Fid%3Dcom.example.myapp;end
iOS 端必须用 Universal Links,scheme 基本不可用
iOS 13+ 主动拦截所有非用户手势触发的 scheme 跳转,且 Safari 会静默丢弃 location.href 调用。唯一稳定路径是 Universal Links:
- 服务器根目录或
/.well-known/下放apple-app-site-association(无扩展名),Content-Type 必须是application/json - Xcode 中开启
Associated Domains,添加格式为applinks:yourdomain.com - HTML 中仍用普通 HTTPS 链接:
@#@#@#@#@#@#@#@#@#@0,系统自动接管 - 配置出错时(如 JSON 格式错误、HTTP 状态码不是 200、证书不匹配),不会报错,而是直接退化成网页跳转——这是最常被忽略的调试盲区
iframe 触发方案在 Android 上有效,在 iOS 上基本失效
曾广泛使用的 iframe.src = 'myapp://...' 方式,在 Android 多数浏览器中仍可触发(尤其旧版 Chrome),但在 iOS Safari 中已被彻底限制:
- iOS 要求跳转必须由用户真实点击触发,
iframe属于静默行为,直接被忽略 - 即使绕过检测,也无法可靠判断是否唤起成功(
document.hidden、页面失焦等信号在 iOS 上不可靠) - 若坚持用此法,仅建议作为 Android 端的备用兜底,且必须配合
setTimeout+window.location.hreffallback 到下载页
典型写法:const iframe = document.createElement('iframe'); iframe.src = 'myapp://home'; iframe.style.display = 'none'; document.body.appendChild(iframe); setTimeout(() => document.body.removeChild(iframe), 300);
fallback 检测不能只靠时间延迟
所谓“2s 后跳转到下载页”的逻辑,在真实设备上误差极大:
- Android 上部分机型唤起后页面会短暂失焦再恢复,导致误判
- iOS 上页面从不真正失焦,
document.hidden始终为false,无法用于检测 - 微信/QQ 内置浏览器会拦截所有 scheme 跳转并弹窗,此时你根本等不到 2s
更务实的做法是:优先走 Universal Links(iOS)和 intent://(Android),对唤起失败场景,直接提供显式按钮引导用户手动操作(如“复制链接 → 打开微信 → 粘贴”),而不是依赖不可靠的自动 fallback。
真正难的不是写对那行 href,而是让同一套 HTML 在不同系统、不同浏览器、不同 ROM 版本下都给出确定性响应——这要求你放弃“一套代码通吃”的幻想,按平台分层设计唤起路径,并把验证点落到服务器返回头、AASA 文件结构、AndroidManifest 声明这些具体可查的位置上。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











