如何在跳转前验证Deep Link(深度链接)的有效性?
解决iOS Safari中深度链接无效时的错误提示问题
首先明确:无法在调用window.location前直接验证自定义深度链接(如myzone://open)的有效性,因为这类协议不是HTTP/HTTPS,浏览器无法通过常规请求校验判断是否有对应APP处理该链接。但可以通过以下方法规避错误提示:
方法1:使用隐藏iframe尝试唤起APP
直接修改window.location会触发浏览器错误提示,改用隐藏iframe加载深度链接,加载失败不会显示错误,到期后再跳转应用商店。
修改后的iOS处理代码:
function attemptRedirect() { const OS = getMobileOperatingSystem(); if (OS === 'IOS') { const timer = setTimeout(() => { window.location.href = content.ios_store_link; }, 500); // 创建隐藏iframe尝试唤起APP const iframe = document.createElement('iframe'); iframe.style.display = 'none'; iframe.src = content.ios_app_link; document.body.appendChild(iframe); // 清理iframe setTimeout(() => { document.body.removeChild(iframe); }, 1000); } if (OS === 'Android') { // Android端Chrome不会显示此类错误,可直接沿用原逻辑 setTimeout(() => window.location.href = content.android_store_link, 500); window.location.href = content.android_app_link; } }
方法2:通过页面可见性判断唤起结果
当APP被成功唤起时,当前网页会进入后台,document.hidden会变为true。监听visibilitychange事件,若检测到页面隐藏,就取消跳转应用商店的定时器,避免不必要的跳转。
结合后的优化代码:
function attemptRedirect() { const OS = getMobileOperatingSystem(); if (OS === 'IOS') { let timer = setTimeout(() => { window.location.href = content.ios_store_link; }, 500); // 监听页面可见性变化 function handleVisibilityChange() { if (document.hidden) { // 页面被隐藏,说明APP唤起成功,取消定时器 clearTimeout(timer); document.removeEventListener('visibilitychange', handleVisibilityChange); } } document.addEventListener('visibilitychange', handleVisibilityChange); // 用iframe尝试唤起APP const iframe = document.createElement('iframe'); iframe.style.display = 'none'; iframe.src = content.ios_app_link; document.body.appendChild(iframe); setTimeout(() => { document.body.removeChild(iframe); document.removeEventListener('visibilitychange', handleVisibilityChange); }, 1000); } if (OS === 'Android') { setTimeout(() => window.location.href = content.android_store_link, 500); window.location.href = content.android_app_link; } }
补充说明
- iOS 14+的Safari对iframe唤起APP的限制有所加强,需确保
attemptRedirect函数是在用户主动操作(如按钮点击)时调用的,否则可能无法生效。 - Android端无需额外处理,Chrome在深度链接无效时不会显示类似错误提示,直接使用原逻辑即可。
内容的提问来源于stack exchange,提问作者KAT
相关产品推荐
相关产品推荐

