2013-08-30 86 views
17

我正在开发命令行节点模块,并希望能够通过网站上的链接启动它。如何在Node.js中注册url协议处理程序

我想注册一个自定义协议my-module://,这样链接将具有以下格式:my-module://action:some-action并点击它们将启动节点包。

如果没有为此的节点API(我敢肯定不会有),那么有没有办法通过调用系统命令从节点执行?

它必须在Windows,Linux和MacOS上运行。

+0

这不会是一个节点的API,这将是一个浏览器设置。 – hexacyanide

+1

@hexacyanide地址协议是由OS不是浏览器处理,我已经成功地实现了它的Windows(你必须添加一些注册表项),但想知道是否有一个跨平台的API节点,而不是单独实现每个平台。 –

+0

这似乎是不一致的,因为协议处理程序可以通过设置在Chrome和Firefox中添加。 – hexacyanide

回答

20

它是一个有趣的想法。我不认为目前有一个跨平台的node.js解决方案。我也碰到过这个线程的人问同样的事情:

https://github.com/rogerwang/node-webkit/issues/951 

电子现在用app.setAsDefaultProtocolClient API(since v0.37.4)适用于MacOS和Windows支持它。

要编写库来做到这一点并不难。

的Windows

在窗户边你必须注册应用程序作为处理该URI方案的应用。

您需要为您的应用程序的注册表项:

 
HKEY_CLASSES_ROOT 
    alert 
     (Default) = "URL:Alert Protocol" 
     URL Protocol = "" 
     DefaultIcon 
     (Default) = "alert.exe,1" 
     shell 
     open 
      command 
       (Default) = "C:\Program Files\Alert\alert.exe" "%1" 

然后,当你的应用程序是由Windows上运行,你应该能够看到process.argv[]的参数。确保你启动一个shell来运行节点,而不是直接运行你的应用程序。

Original MSDN article

注意这需要管理员权限,并设置处理系统范围。要为每个用户执行此操作,您可以使用HKEY_CURRENT_USER\Software\Classes代替Electron的实施does it

苹果:在GitHub的评论

所引用的 “OS X” 的文章实际上是为iOS。我想看看下面的节目指南信息上注册应用程序来处理URL方案:

Apple Dev Documentation

总之,你需要创建一个启动服务,并与CFBundleURLTypes填充的.plist文件,这个字段是一个数组,应该只填写协议名称,即http

以下Super User Question有一个更好的解决方案,但是是一个用户设置。

“你所寻求的文件是〜/库/首选项/ com.apple.LaunchServices.plist。

它拥有一个数组叫LSHandlers和定义的LSHandlerURLScheme字典的孩子可以用LSHandlerRole相应修改“。

的Linux:(?惊讶)

据我所知,有几种方法可以在Linux中实现这个

侏儒有一个工具,可以让你注册一个URL处理器w3 archives

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 

一些较轻的权重管理器看起来像允许您创建假的MIME类型并将它们注册为URI协议处理程序。

“假MIME类型都与这样的各种方案的URI创建: 应用程序/ x-XDG-协议 - 应用支持特定URI协议可以在他们的桌面项文件中的假MIME类型添加到他们的MimeType键。因此,通过查看mimeinfo.cache文件,可以很容易地找出系统上安装的所有支持URI方案的应用程序。再次,defaults.list文件可用于指定默认程序,以指定URI类型。 wiki.lxde.org

KDE也支持自己处理URL协议处理程序方法:

创建一个文件:$KDEDIR/share/services/your.protocol和相关数据来填充它:从所有地方的last.fm forums

希望

 
[Protocol] 
exec=/path/to/player "%u" 
protocol=lastfm 
input=none 
output=none 
helper=true 
listing= 
reading=false 
writing=false 
makedir=false 
deleting=false 

这有助于。

+0

好的,这似乎回答了MacOS和Windows部件。如果您可以提供有关Linux的更多信息,包括如何在使用更轻桌面环境的系统上工作,例如Linux上的XFCE和LXDE;我会奖励赏金。 (另外,这主要是基于链路,因此,请在链接腐烂的情况下引用这些资源。) – FakeRainBrigand

+0

从研究,它看起来像Windows可能处理这个是最好的,在Mac方面,它应该不会太困难。在Linux方面,如果你知道最终用户将使用什么,你应该能够找到一个幸福的中位数,并且可能会运行一个有效的系统。这将是一个非常棒的npm模块,如果你最终创造了一些东西,那么请关注它,我很乐意看到它!我甚至愿意为编码和测试而努力。 – jeremy

+0

太棒了!这有很大帮助。我想我会把所有这些都包含在一个节点模块中,当它完成时我会在这里再次发表评论。不过,我暂时无法做到这一点。 – FakeRainBrigand

-17

首先创建自己的协议是疯狂的,不要这样做。

看来你想要做的就是能够从网络浏览器启动你的节点包。 从网络浏览器启动外部程序的正常方式是编写一个浏览器插件。

这是pdf,torrents,iTunes从浏览器启动的方式。

因此,总而言之,要做你想做的事情,你将不得不编写一个插件并让用户安装。不是特别的,我会说。

+6

我不同意,一个浏览器插件最好的办法是,它必须是一个本地扩展,而不是一个普通的扩展。 iTunes使用协议,而不是插件(itms://),github,spotify等也是如此。虽然注册协议处理程序可能相当困难,但它肯定不是不可能的,编写浏览器插件会更困难(你需要为每个平台单独一个)。 –

3

这里是我是如何做到在Mac OS与应用NW.js:

  1. 打开应用/Applications/Utilities/Script Editor

    型编辑器

    on open location this_URL 
        do shell script "/Applications/X.app/Contents/MacOS/x '" & this_URL & "'" 
    end open location 
    

    更换X下面的代码由您的应用程序的名称。

    保存脚本作为应用程序捆绑随时随地

  2. 转到脚本,请右键单击,然后“显示包内容”然后编辑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> 
    
  3. 现在你可以打开一个链接从myurlscheme开始:并看到您的应用程序正在启用!

+0

所以你让一个应用程序打开另一个应用程序? 为什么不把这些info.plist文件放在你想打开的应用程序的info.plist中?由于某种原因,这不起作用吗? – Houseman

相关问题