调用Android应用遇net::ERR_UNKNOWN_URL_SCHEME错误求助
解决Android APP唤起时的
net::ERR_UNKNOWN_URL_SCHEME错误 嘿,我来帮你搞定这个问题!首先咱们得弄明白为啥会出现这个错误:当你点击带有自定义scheme的链接时,如果设备上没装对应的APP,浏览器识别不了这个scheme,就会抛出net::ERR_UNKNOWN_URL_SCHEME的错误。而且你当前的代码不管APP有没有被成功唤起,500ms后都会弹出确认框,逻辑上也不够严谨。
下面是优化后的解决方案,主要从错误捕获和唤起状态判断两个核心点来改进:
方案一:用iframe加载scheme(彻底避免错误提示)
这种方式不会在浏览器里弹出错误提示,因为iframe加载失败不会显示错误信息,同时我们结合页面可见性变化来判断APP是否被成功唤起:
<html> <head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> <script type="text/javascript"> function redirectToApp() { var appScheme = "<scheme>://<package>/?<parameters>"; var downloadUrl = "https://play.google.com/store/apps/details?id=123"; // 创建隐藏iframe加载scheme,避免直接点击链接抛出错误 var iframe = document.createElement('iframe'); iframe.style.display = 'none'; iframe.src = appScheme; document.body.appendChild(iframe); // 监听页面可见性变化:如果页面被隐藏,说明APP成功唤起 var hasAppLaunched = false; function onVisibilityChange() { if (document.hidden) { hasAppLaunched = true; document.removeEventListener('visibilitychange', onVisibilityChange); document.body.removeChild(iframe); } } document.addEventListener('visibilitychange', onVisibilityChange); // 超时判断:如果一段时间后页面仍可见,说明唤起失败 setTimeout(function() { document.removeEventListener('visibilitychange', onVisibilityChange); document.body.removeChild(iframe); if (!hasAppLaunched) { if (confirm('您似乎未安装该应用,是否立即下载?')) { window.location = downloadUrl; } } }, 800); // 延长超时时间,给设备足够的唤起响应时间 } </script> </head> <body onload="redirectToApp()"> </body> </html>
方案二:用try-catch包裹导航操作(适配部分浏览器)
有些浏览器允许在try-catch中处理自定义scheme的导航错误,这种方式也可以尝试:
<html> <head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> <script type="text/javascript"> function redirectToApp() { var appScheme = "<scheme>://<package>/?<parameters>"; var downloadUrl = "https://play.google.com/store/apps/details?id=123"; var hasAppLaunched = false; // 监听页面可见性变化,判断APP是否唤起成功 function onVisibilityChange() { if (document.hidden) { hasAppLaunched = true; document.removeEventListener('visibilitychange', onVisibilityChange); } } document.addEventListener('visibilitychange', onVisibilityChange); try { // 尝试打开APP window.location.href = appScheme; } catch (e) { // 捕获到错误,直接提示下载 if (confirm('您似乎未安装该应用,是否立即下载?')) { window.location = downloadUrl; } document.removeEventListener('visibilitychange', onVisibilityChange); return; } // 超时判断唤起是否失败 setTimeout(function() { document.removeEventListener('visibilitychange', onVisibilityChange); if (!hasAppLaunched) { if (confirm('您似乎未安装该应用,是否立即下载?')) { window.location = downloadUrl; } } }, 800); } </script> </head> <body onload="redirectToApp()"> </body> </html>
关键改进点说明
- 消除错误提示:用iframe加载scheme或者try-catch捕获错误,彻底解决
net::ERR_UNKNOWN_URL_SCHEME的问题; - 更精准的唤起判断:通过
visibilitychange事件判断页面是否被隐藏(APP唤起后浏览器会进入后台,页面变为隐藏状态),比单纯依赖setTimeout更可靠; - 优化超时逻辑:把500ms调整到800ms,给设备足够的时间完成APP唤起操作,减少误判情况。
内容的提问来源于stack exchange,提问作者Swathi Delampady
相关产品推荐
相关产品推荐

