495 字
2 分钟
Web 中判断 DeepLink 是否成功打开
2024-11-21

在 Web 中判断是否成功打开了 DeepLink(深度链接)通常比较困难,因为 DeepLink 的本质是通过 URL 来尝试打开一个 App,如果 App 没有安装,浏览器可能不会有任何反馈。常见的判断方法主要是基于 页面可见性定时器 机制。以下是几种常用的方案:

1. 定时器降级处理#

由于不同设备、浏览器对 DeepLink 的处理时间不同,通常会设置一个短暂的定时器(如300ms - 3s),如果在这个时间内没有检测到页面被隐藏,就认为唤起失败,并执行降级处理(如跳转到应用商店)。

function openApp() {
    let timer = setTimeout(() => {
        window.location.href = '';
    }, 2000);

    // 尝试打开App
    window.location.href = 'myapp://';

    window.addEventListener('visibilitychange', () => {
        if (document.hidden) {
            clearTimeout(timer); // 页面隐藏,认为 App 唤起成功,清除定时器
        }
    });
}

2. 使用 iframe 隐藏加载#

另一种方式是通过创建一个隐藏的 iframe 来加载 DeepLink URL,这样可以避免页面跳转的影响。

const iframe = document.createElement('iframe');
iframe.style.display = 'none';
iframe.src = 'myapp://';
document.body.appendChild(iframe);

setTimeout(() => {
    document.body.removeChild(iframe);
}, 3000);

这种方式与直接修改 window.location.href 类似,但可以避免页面刷新或跳转。

3. Chrome Intents(仅限Android)#

对于 Android 设备,可以使用 Chrome Intents 来尝试打开 App,并提供备用方案。如果 App 未安装,可以指定一个备用 URL(如应用市场链接)。

<a href="intent://example.com#Intent;scheme=myapp;package=com.example.app;end;">
    打开App
</a>

总结#

  • visibilitychange 事件 是目前最常用的方法之一,通过检测页面是否变为不可见来判断是否唤起了App。
  • 定时器降级处理 可以有效应对不同设备和浏览器之间的差异,在一定时间内未成功唤起则引导用户去下载App。
  • iframe 隐藏加载 是一种较为隐蔽的方法,可以避免页面刷新或跳转。
  • 对于Android设备,还可以使用 Chrome Intents 来提供更好的兼容性。
Web 中判断 DeepLink 是否成功打开
https://blog.lpkt.cn/posts/web-deeplink-open-callback/
作者
lollipopkit
发布于
2024-11-21
许可协议
CC BY-NC-SA 4.0