以下三种方式都是称为URL scheme,windows和mac下访问通过如下方式:xxxx://argument (xxxx就是我们自定义的URL名,argument就是参数。windows和mac下的参数均为argument。),而linux下是xxxx:argument这种方式(Linux下的参数是xxxx:argument。)。
一、windows下打开某个应用程序
要想在windows下实现这个功能,我们需要修改注册表,然后在应用程序中处理相应的参数。
参考:https://www.cnblogs.com/wang726zq/archive/2012/12/11/UrlProtocol.html
要实现这个功能一共分3步。(我们注册一个xishui:// 这样的 protocol-handler,实现在网页中点击xishui://hello,就弹出一个对话框,上面显示“hello”)
1 按照如下结构建立注册表
其中 [xishui] 是建立在注册表的 [HKEY_CLASSES_ROOT] 主键下。
2 给相关的键赋值
大家注意到上面 command 项的值为 c:\test.exe "%1" ,这个"%1"是传递给test.exe的参数。如果我们点击xishui://hello这样的链接 那么%1的值就是“xishui://hello” 这个字符串。
到此我们改写程序生成test.exe了,我们的目标是弹出一个对话框,显示xishui://hello链接中的hello字样。 也就是说我们要用正则表达式来取出"xishui://hello" 中 “xishui://” 后面的部分
我们来写一个控制台程序
using System;
using System.IO;
using System.Windows.Forms;
using System.Text.RegularExpressions;
namespace test
{
class Program
{
static void Main(string[] args)
{
string key = Regex.Match(args[0], @"(?<=://).+?(?=:|/|\Z)").Value;
MessageBox.Show(key);
}
}
}
让我把编译生成的test.exe 复制到c:\下
然后 我写了个test.html
<a href="xishui://hello">xishui://hello</a>
然后我在浏览器中点这个链接 ,啥效果?你猜
哇咔咔 真的调用了我的test.exe,并且显示了hello !
也可以在运行窗口输入:xishui://hello 调用
那么关于注册表的修改,方法有很多,我们一般都在安装程序的时候就设置好,如何通过API接口修改,百度例子很多。
二、mac下打开本地应用程序
参考:Mac os URL Schemes 浏览器启动本地app
前面写的python操作注册表(Url protocol浏览器启动本地程序)已经说了在windows上面启动本地app的方法,下面准备写一下在Mac os上如何在浏览器启动本地的app。
Mac os上浏览器启动本地app主要是通过URL Shemes,每个打包好的app文件中都会存在一个info.plist文件,如图:
image.png
这个是Google Chrome.app文件中的内容,里面就包含了info.plist文件,这个文件主要是提供app运行时的一些配置,是比较重要的文件,而Mac os就是通过这个文件来配置启动对应的app的,具体配置很简单,结构如下:
在info.plist文件中添加:
<key>CFBundleIdentifier</key>
<string>com.mycompany.AppleScript.XXXX</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>自定义的url名字</string>
<key>CFBundleURLSchemes</key>
<array>
<string>XXXX</string>
</array>
</dict>
</array>
下面是对这些字段的官方解释,想要知道更多关于info.plist文件配置的可以看这里:https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/TP40009249-SW1
image.png
最后,想要在浏览器访问你自定义的URL Schemes分两步:
1、双击你的app,打开info.list文件,现将这个自定义的URL Schemes注册进去。(这个应该在安装的时候就通过脚本设置好,而不是通过手动。)
2、在浏览器访问:自定义的url名字://something,就能够打开对应的本地app。
三、linux gnome下打开本地程序
参考:https://blog.csdn.net/chenjialin00001/article/details/100997221 linux下都是通过修改desktop文件,在其中加入字段来实现。https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables
首先是desktop文件,里面需要加入一个字段来注册协议
MimeType=x-scheme-handler/myapp
接着在Exec字段中加入 %u来接受参数
Exec=/usr/local/Test/test %u
如果需要root权限则需要使用gksu,它可以让应用程序启动的时候弹出对话框输入root密码,从而以root权限启动程序,如下图
ubuntu18.04例如:在/usr/share/applications/ 目录下建立如下内容的文件,取名为myapp.desktop
[Desktop Entry]
Name=myapp
Exec=/usr/share/applications/myapp.sh %u
Type=Application
Terminal=false
MimeType=x-scheme-handler/myapp;
然后,在~/.config/mimeapps.list中加入一行:
x-scheme-handler/myapp=myapp.desktop
接着需要运行一个命令更新协议
sudo update-desktop-database /usr/share/applications/
然后是html里面,代码如下
<html>
<head>
<title>sdfasdfasdfasdf</title>
</head>
<body>
<a href="myapp://">open myapp </a>
<p></p>
<p></p>
</html>
这样点击调用后,是类似 /usr/local/myapp 'myapp://'
(myapp://就是linux下的参数,我们再对应的应用中处理的时候,需要注意一下。)这种调用方式。切记应用参数处理。