# 前端一键启动本地应用——自定义协议

经常使用迅雷的同学应该知道,网页上点击某个下载链接,会弹出询问窗口,问是否打开迅雷下载

前端是怎么调起迅雷应用的?——靠的是一个叫自定义协议的东西。

我们熟知的网络协议有TCP/IP、HTTP、FTP协议,什么是自定义协议?所谓的自定义协议,就是自己定义的协议。它和URL地址一样,也可以在浏览器地址栏访问(也可以通过a链接访问),不一样的是,URL的http协议访问的是网络资源,自定义协议,是唤起本地应用

比如qq://就是自定义协议,它可以唤起QQ,单个应用可以定义多个自定义协议,比如唤起迅雷的自定义协议有thunder://ed2k://magnet://,不同类型的下载链接可以选择对应的自定义协议唤起迅雷并下载。

# 本地注册自定义协议

Mac系统,右键应用程序-显示包内容,打开Contents,有个info.plist配置文件,自定义协议配置都写入到info.plist,这个配置只能由应用开发者配置,用户手动修改不生效

<!-- 截取部分配置 -->
	<array>
		<dict>
			<key>CFBundleTypeRole</key>
			<string>Editor</string>
			<key>CFBundleURLName</key>
			<string>thunder url</string>
			<key>CFBundleURLSchemes</key>
			<array>
				<string>thunder</string> // 自定义协议
			</array>
		</dict>
		<dict>
			<key>CFBundleTypeRole</key>
			<string>Editor</string>
			<key>CFBundleURLName</key>
			<string>emule url</string>
			<key>CFBundleURLSchemes</key>
			<array>
				<string>ed2k</string> // 自定义协议
			</array>
		</dict>
		<dict>
			<key>CFBundleTypeRole</key>
			<string>Editor</string>
			<key>CFBundleURLName</key>
			<string>magnet url</string>
			<key>CFBundleURLSchemes</key>
			<array>
				<string>magnet</string> // 自定义协议
			</array>
		</dict>
	</array>

window则是通过修改注册表来定义自定义协议,用户可以自己配置。

# JS检测自定义协议

用户安装了应用,可以通过自定义协议唤起,如果没有安装,就引导用户去安装,怎么检测用户是否安装了应用?换句话说,JS如何检测自定义协议是否注册?IE可以通过ActiveX检测注册表,chrome没有直接检测的办法,而是通过一种非常Hack的方法:点击自定义协议链接,延时一定时间,判断window是否失去焦点,如果没有失去焦点,说明这个自定义协议没有注册,如果弹出了唤起确认窗口,window一定会失去焦点。有人把这种方法封装 (opens new window)好了,省去兼容的烦恼

上次更新: 10/23/2021, 10:33:11 PM