iOS上DeepLink打不开App,主因是系统拦截静默跳转,必须通过真实用户点击触发;推荐改用Universal Links,需配置apple-app-site-association文件并启用Associated Domains。

deeplink 在 iOS 上打不开 App 怎么办
iOS 的 a href 触发 deeplink 失败,大概率不是链接写错了,而是系统或 Safari 主动拦截了跳转。iOS 13+ 默认禁止网页通过 location.href 或 <a></a> 标签静默唤起 App,除非用户手动点击且满足“用户手势(user gesture)”条件。
关键点:必须是真实、可感知的用户点击事件,不能是 JS 自动触发、延迟跳转、或在 setTimeout 里调用 window.location。
- 避免用
onclick="window.location='myapp://...'"—— Safari 可能忽略非直接点击路径 - 用原生
<a href="myapp://open?param=1">打开 App</a>,且确保该元素可点击(不被pointer-events: none遮挡) - 如果需要 fallback 到 App Store,得在跳转后 2500ms 内检测是否成功(靠页面是否失焦 + 是否还在前台判断),再重定向 —— 但 iOS 下这个检测不可靠,更推荐用「Universal Links」替代
Android 上 intent:// 链接怎么写才稳定
Android 原生支持 intent:// 协议,比自定义 scheme 更健壮,能指定包名、Activity、flags,还能 fallback 到 Play 商店。
示例链接:
立即学习“前端免费学习笔记(深入)”;
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
注意几个硬性要求:
-
scheme和package必须与 App 的 AndroidManifest.xml 中<intent-filter></intent-filter>完全一致(大小写敏感) -
S.browser_fallback_url必须 URL 编码,否则链接解析失败 - 某些定制 ROM(如华为、小米)会拦截
intent://,此时需降级为普通 scheme 链接 + 手动 setTimeout fallback - Chrome 80+ 对非用户手势触发的
intent://跳转会静默失败,所以仍要确保是点击触发
为什么 Universal Links / App Links 比 scheme 更推荐
因为 scheme 链接无法验证 App 是否真正安装,也无法绕过系统弹窗(Android)或拦截(iOS),而 Universal Links(iOS)和 Android App Links 是基于 HTTPS 域名校验的,系统级信任,无弹窗、可精准 fallback、支持未安装时跳转官网。
核心前提:
- iOS:在域名根目录放
apple-app-site-association文件(无扩展名,application/json类型),且 Web 服务器返回正确 header - Android:在
https://yourdomain.com/.well-known/assetlinks.json放签名校验文件,并在 App 的AndroidManifest.xml中声明android:autoVerify="true" - HTML 中仍用普通链接:
<a href="https://yourdomain.com/open?param=1">打开 App</a>,系统自动接管
一旦配置出错(比如证书不匹配、HTTP 状态码不是 200、JSON 格式有误),整个机制就退化成普通网页跳转,且没有任何提示 —— 这是最容易被忽略的调试盲区。
fallback 到网页或商店的时机和方式
纯 scheme 或 intent 链接唤起失败时,不能等“跳转超时”,而应利用页面生命周期信号做近似判断:用户点击后页面是否失去焦点(document.hidden)、是否触发 blur、是否在 2s 内未重获 focus。
- 不要依赖
setTimeout等固定时间 —— 低端机或后台进程多时,App 启动可能超过 3s - 推荐逻辑:点击 → 立即跳转 → 监听
pagehide或visibilitychange→ 若 2500ms 内未触发,再 redirect 到商店或 H5 页面 - Android 上可加一层
navigator.getInstalledRelatedApps()(仅 Chromium 93+,需 HTTPS + 用户授权),但兼容性太差,不建议作为主逻辑
真正难的不是写对一个链接,而是让不同系统、不同浏览器、不同安装状态下的行为都收敛到预期路径 —— 很多坑藏在 HTTP 响应头、TLS 证书链、JSON 文件权限这些看似无关的环节里。



















