如何在Node.js中注册一个url协议处理程序
我正在开发一个命令行节点模块,并希望能够通过网站上的链接启动它。
我想注册一个自定义的协议my-module://
这样链接将有以下格式: my-module://action:some-action
并点击它们将启动节点包。
如果没有一个节点API(我敢肯定不会有),那么有没有办法通过调用系统命令从节点执行?
它必须在Windows,Linux和MacOS上运行。
这是一个有趣的想法。 我不认为目前有一个跨平台的node.js解决scheme。 我遇到过这样的人,他们要求同样的事情:
https://github.com/rogerwang/node-webkit/issues/951
Electron现在支持macOS和Windows的app.setAsDefaultProtocolClient
API( 自v0.37.4以来 )。
写图书馆来做这件事并不难。
Windows :
在Windows端,您必须将应用程序注册为处理该URIscheme的应用程序。
您需要为您的应用程序设置一个registry项:
HKEY_CLASSES_ROOT 警报 (默认)=“URL:警报协议” URL协议=“” 的DefaultIcon (默认)=“alert.exe,1” 贝壳 打开 命令 (默认)=“C:\ Program Files \ Alert \ alert.exe”“%1”
然后,当您的应用程序由Windows运行时,您应该能够在process.argv[]
看到参数。 确保启动一个shell来运行节点,而不是直接运行你的应用程序。
原始的MSDN文章
请注意,这需要pipe理员权限并设置系统范围的处理程序。 要做到这一点,每个用户可以使用HKEY_CURRENT_USER\Software\Classes
来代替,就像Electron的实现一样 。
苹果:
引用的github中的“OS X”文章实际上是针对iOS的。 关于注册一个应用程序来处理URLscheme的信息,我会看看下面的编程指南:
Apple Dev文档
总之,您需要创build一个启动服务,并使用CFBundleURLTypes
填充.plist文件,这个字段是一个数组,并且应该填充协议名称,例如http
下面的超级用户问题有更好的解决scheme,但是是每个用户设置。
“你要找的文件是〜/ Library / Preferences / com.apple.LaunchServices.plist。
它包含一个名为LSHandlers的数组,并且可以使用LSHandlerRole相应地修改定义LSHandlerURLScheme的Dictionary子元素。
Linux的:
从我可以告诉,有几种方法可以在Linux中完成这个(惊喜?)
Gnome有一个工具,可以让你注册一个url处理程序w3档案
gconftool-2 -t string -s /desktop/gnome/url-handlers/tel/command "bin/vonage-call %s" gconftool-2 -s /desktop/gnome/url-handlers/tel/needs_terminal false -t bool gconftool-2 -t bool -s /desktop/gnome/url-handlers/tel/enabled true
一些轻量级pipe理者看起来像允许你创build假的MIMEtypes并将它们注册为URI协议处理程序。
“假的MIMEtypes是为这样的各种scheme的URI创build的:application / x-xdg-protocol-支持特定的URI协议的应用程序可以在他们的桌面条目文件中添加假的MIMEtypes到他们的MimeType键。通过查看mimeinfo.cache文件,将所有安装在系统上的应用程序支持一个URIscheme。再次,defaults.list文件可以用来指定一个默认的指定URItypes的程序。 wiki.lxde.org
KDE也支持自己的URL协议处理器处理方法:
创build一个文件: $KDEDIR/share/services/your.protocol
并填入相关数据:
[协议] exec = / path / to / player“%u” 协议= LastFM等 input=无 输出=无 助手=真 上市= 读= FALSE 写= FALSE MAKEDIR = FALSE 删除= FALSE
来自last.fm所有地方的论坛
希望有所帮助。
以下是我在Mac OS上使用应用程序NW.js所做的工作:
-
打开应用程序
/Applications/Utilities/Script Editor
在编辑器中键入以下代码
on open location this_URL do shell script "/Applications/X.app/Contents/MacOS/x '" & this_URL & "'" end open location
将Xreplace为您的应用程序的名称。
将脚本另存为应用程序包
-
转到脚本,右键单击“ Show Package Contents ”,然后编辑
Contents/info.plist
在
</dict></plist>
之前的文件末尾添加这些行:<key>CFBundleIdentifier</key> <string>com.mycompany.AppleScript.AppName</string> <!-- edit here --> <key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLName</key> <string>AppName</string> <!-- edit here --> <key>CFBundleURLSchemes</key> <array> <string>myurlscheme</string> <!-- your url scheme here --> </array> </dict> </array>
-
你现在可以打开一个从myurlscheme开始的链接:并看到你的应用程序正在开放!
首先创build你自己的协议是疯狂的,不要这样做。
看起来你想要做的就是能够从networking浏览器启动你的节点包。 从networking浏览器启动外部程序的正常方式是编写一个浏览器插件。
这是如何PDF,山洪,iTunes从您的浏览器启动。
所以总而言之,要做你想做的事情,你将不得不编写一个插件,并让你的用户进行安装。 不是一个好主意,我会说。