如何通过浏览器启动应用程序?


在电脑里面,类似阿里旺旺,QQ, App Store,这类程序,在浏览器中点击相应的按钮就会启动本地应用程序,是如何实现的?

开发 浏览器 浏览器启动应用程序

西園寺风莉 10 years, 8 months ago

一般情况下,浏览器中是无法直接和本机的其他的程序进行交互的,在IE中,我们可以通过ActiveX对象的方式进行。但是这个方式只适用于IE浏览器,另一种比较通用的方式便是URL协议的方式,我们将某种URL的协议注册给某个程序来进行处理,比如将myapp://这样的协议注册给myapp程序来进行处理,当浏览器需要访问这样的协议的时候就转给myapp程序进行处理。

这种URL协议的方式是可以跨平台的,比如在Windows上你需要添加注册表项;而在Mac系统中上,你需要在对应的Application的属性列表文件 info.plist 中增加URL处理协议项CFBundleURLTypes,当你将程序丢入Applications目录,或者自动被Mac系统扫描到的时候,会将URL以及相应的App注册到对应的数据库中。 一些细节可以查看http://kb.mozillazine.org/Register_protocol

举个例子,

[HKEY_CLASSES_ROOT\myapp]
@="URL:my Protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\myapp\shell]

[HKEY_CLASSES_ROOT\myapp\shell\open]

[HKEY_CLASSES_ROOT\myapp\shell\open\command]
@="\"C:\\Program Files\\Application\\program.exe\" \"%1\"" 

我还不知道系统中有没有安装相应程序

如果我们不考虑应用的健壮性,那么我们可以直接在页面上这么搞

< a href="myapp://blah/?args1=blah&args2=blah...">
< img src="你想显示的图标的地址"/>
< /a>

这样当你点这个图标的时候,就会呼出myapp程序,但是如果我根本没有安装程序呢?那么什么都不会出现。 所以我们需要在启动url协议之前,检测处理相应url协议的程序是否安装了,如果没有安装就跳到软件的下载页面或者软件的web版。

那么现在的问题就是如何检测本机是否已经安装了对应程序,和1中类似,在IE中我们可以通过ActiveX的方式来检测,但是在其他浏览器中我们无法进行,我们肯定需要浏览器和本地api进行交互,好在我们有NPAPI这个跨平台跨浏览器的标准接口,所以我们可以开发一个浏览器的插件,使用js和npapi插件进行交互,npapi插件再调用本地api来检查程序是否安装(比如在windows中查看注册表,或者mac中查看系统是否有程序能够响应相应的URL)。然后js中根据判断的返回值来进行下一步操作。

战场D女武神 answered 10 years, 8 months ago

Your Answer