一、问题描述:
最近做的项目要求从网页端启动本地的应用程序(windows系统下),同时会给应用程序传递某些参数,所以接触到了URL Protocol这个东西。
二、所处条件:
1、本地的应用程序是unity3D开发的软件。
2、目标平台是windows PC端。
3、使用AdvancedInstaller制作软件安装包。
二、主要问题的解决过程:
1、编写注册表处理文件,即*.reg文件,所有代码如下:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Simu]
"URL Protocol"="X:\\xx.exe"
@="SimuProtocol"
[HKEY_CLASSES_ROOT\Simu\DefaultIcon]
@="X:\\xx.exe,1"
[HKEY_CLASSES_ROOT\Simu\shell]
[HKEY_CLASSES_ROOT\Simu\shell\open]
[HKEY_CLASSES_ROOT\Simu\shell\open\command]
@="\"x:\\xx.exe\" \"%1\""
注意上面每一行原则上缺一不可,但实际上有些是可以省略的。不过最好都写上,否则有可能会出问题。
2、在AdvancedInstaller中导入此reg文件,并将上面的路径有关的字符串改成advancedInstaller中的“变量”
3、build安装包进行安装。
4、在目标机器上安装该软件。
5、测试URL Protocol是否成功写入注册表:在txt中写入"<a href="Simu://canshu">点击打开目标程序</a>"并保存成html文件,用浏览器打开此网页,点击链接,若出现提示请求打开本地程序,则代表成功。
6、写接受参数的代码。C#中从System.Environment.commandLine这个字符串中来获取传过来的参数。这个字符串的格式是"X:\...\XX.exe Simu://canshu",用正则表达式截取即可。如果使用控制台程序接受参数,可以从main函数的参数argus[0]里获取上面的字符串。
三、遇到的其他问题及处理办法:
1、参考资料1中也有提及,参数如果是中文,某些浏览器会对其进行URL编码,而某些则不会,所以最好统一先将参数进行一些编码,且最好不是URL编码,因为在获取参数的时候可能又会把URL编码出来的字符串再次转换成其他编码,会乱码。
2、主要是AdvancedInstaller的使用问题,比如把程序安装进入C盘时会出现权限问题等,有时间再总结一下。
四、主要参考资料:
1、微软官方文档
五、其他说明
1、iPhone SDK中似乎也有对这种URI Scheme的支持,详见通过自定义的URL Scheme启动你的App
2、在Chrome、edge、360浏览器上测试有效