JS实现 浏览器判断本地是否安装程序,并下载与启动 Chrome,IE,360可用


场景需求:

最近工程的一个需求,用户点击链接:

  • 软件已经存在,则打开软件
  • 软件未安装,则提示用户下载;

问题可以拆分成两部分:

  • 判断软件是否存在,未安装时会提示用户安装;

这里写图片描述

  • 已安装软件,则点击打开软件;

这里写图片描述


超链接打开本地程序

<a href="glcloud://"></a>
<a href="mailto://[email protected]:"></a>

点击即可启动本地软件,很神奇,找到软件注册表的信息,写入根目录名称即可打开,蛋疼的是该方法没返回值,软件不存在不会有任何反应,无法作为判断依据。


检测软件是否存在;

这部分才是难点,最简单的办法是使用navigator.plugins去检查对应的dll是否加载。但是在各大浏览器全面拒绝npapi之后,之前通过npapi加载本地dll插件的方法基本都不能用了,360浏览器极速内核支持可用。找了好久,参考了各路方式和StackOverflow的解法,在MIT大牛的基础上找到的解决方案:

StackOverFlow解决方案:
https://stackoverflow.com/questions/27489665/approaches-of-detection-of-custom-protocol-in-chrome-and-safari-browsers
Custom Protocol Detection in Browser源码:
https://github.com/ismailhabib/custom-protocol-detection


IE系列:

Win7 IE

<script>
        function findPlugins(){
        var shell = new ActiveXObject("WScript.shell");
        var reg=shell.RegRead("HKEY_CLASSES_ROOT\\glcloud\\URL Protocol");
}
</script>

更正一下,网上好多错的,是HKEY_CLASSES_ROOT\glcloud\URL Protocol
不是HKEY_LOCAL_MACHINE\SOFTWARE\Classes\glcloud\shell\open\command
command里没有任何可执行属性


Win8,Win10 IE

IE自带API判断
navigator.msLaunchUri(uri)


Chrome:

这个实现比较巧妙。当软件存在,点击链接会打开软件,鼠标跳出。因而创建一个SetTimeOut任务,当3s内鼠标仍未跳出,说明软件不存在。
navigator.plugins只能载入native client(nacl)、chrome PDF等几个组件,不支持npapi


360极速浏览器:

可以使用navigator.plugins载入所有插件(包括npapi),也可以同chrome使用相同解法

<script>
            function findPlugins(){
                var plugins = navigator.plugins;
                for (var i = 0; i <plugins.length; i++) {
                    var plugin_name=plugins[i].name;
                    console.log(plugin_name);
                    if (plugin_name=="Access Client") {
                        alert(plugin_name+"   已找到");
                        break;}}
}
</script>

火狐:

火狐在软件不存在时也会弹出选择框,目前还未解决欢迎大家贡献才智

最后附上本人的源码地址:

https://github.com/evanxuhe/Native-App-Protocal-Detection

猜你喜欢

转载自blog.csdn.net/evanxuhe/article/details/79240051
今日推荐