在多个平台上注册URL协议处理程序

23

我想创建一个Java应用程序,可以安装在多个平台上(Windows、Mac OS、Linux),并在安装过程中注册一个URL协议处理程序,以便当链接被点击时加载我的应用程序。

也就是说,我想要像这样的东西:myprotocol://example.com

有没有一种统一的方法来实现这个目标?或者有没有一种框架可以推断不同操作系统之间的差异。


你期望得到什么?类似 <a href=youprotocol://server.com>启动我的应用程序</a>` 这样的东西吗? - OscarRyz
2
是的?就像Spotify一样。这是个问题吗? - Dan
嗨!我目前正在调查同样的问题。你找到了一个好的跨平台解决方案吗? - mahju
我已经添加了一个答案,提供了访问必要的源代码,以便在Mac、Windows和Linux上实现任意协议。 - Gary
6个回答

16

MultiBit 在多个平台上实现了此功能

我刚刚为 MultiBit 项目(一个轻量级 Bitcoin 客户端)走过这条路,需要实现根据自定义 URI(在我的情况下是 bitcoin:1sdfjsdfdkfdkjfdjfkjertn?amount=0.5&label=Some%20Text)启动和更新应用程序。

我必须创建一种通用的方法来接收操作系统事件。其中大部分工作都基于 Macify library ,然后重写以支持多个任意平台。

首先,需要了解协议处理程序通常在操作系统侧注册,而不是浏览器侧。这是因为协议不仅限于浏览器,因此需要一种通用的支持机制。因此,您需要为每个要支持的平台创建处理程序。

例如,在Mac世界中,有一个名为EAWT的库,它不能被分发,但提供对本地事件API的访问。这意味着您的应用程序需要能够在运行时定位此库,然后通过反射与本地类一起工作(您无法硬编码它们,因为您无法保证将应用程序构建在具有支持库的平台上,并且由于许可限制,您无法包含它)。如果这听起来很辛苦-相信我就是这样。
在Windows上,您需要更新注册表,以便在某人使用该协议时启动您的应用程序。微软提供了一组有用的说明详细说明了这个过程。
在Linux上,这些命令通常适用于Gnome 2(在命令行中传递URI):
gconftool-2 -t string -s /desktop/gnome/url-handlers/bitcoin/command "bin/multibit %s"
gconftool-2 -s /desktop/gnome/url-handlers/bitcoin/needs_terminal false -t bool
gconftool-2 -t bool -s /desktop/gnome/url-handlers/bitcoin/enabled true

2014年7月修订

在Linux上,如果使用Gnome 3桌面环境(例如Ubuntu 11.04+),情况会有些许不同。需要将exampleapp.desktop文件放在/usr/share/applications文件夹中,并跟随sudo update-desktop-database命令。

别说废话了,给我代码!

可以在MultiBit源码中找到它。我没有将其独立成自己的项目,但深入到platform包并从那里提取代码就足够了(它是自包含的)。该应用程序使用IzPack安装,因此Windows的注册表条目也可以使用。

这段代码最初是在v0.3分支中首次引入的,但将从2012年第一季度开始成为主流。它的所有权属于MIT许可证,因此您可以随意使用它。如果您发现了错误,请报告它们或更好地修复它们并提供拉取请求,以便其他人受益。


我没有看到任何与Mac相关的代码,尽管你提到了EAWT的启动有多么困难。那在哪里? - fatuhoku
1
寻找MacApplication类。 - Gary
Windows注册表修改怎么样?它们是从Java代码中执行的吗? - Jaime Hablutzel
1
不,你必须使用自定义安装程序,例如Install4j来完成此操作。 - Gary

4

对于Windows,您可以在安装程序中修改注册表。

REGEDIT4

[HKEY_CLASSES_ROOT\your_protocol]
@="URL: your_protocol"
"URL Protocol"="Your protocol name"

[HKEY_CLASSES_ROOT\your_protocol\DefaultIcon]
@="your_prog_location\your_prog.exe"

[HKEY_CLASSES_ROOT\your_protocol\shell]

[HKEY_CLASSES_ROOT\your_protocol\shell\open]

[HKEY_CLASSES_ROOT\your_protocol\shell\open\command]
@="your_prog_location\your_prog.exe %1"

2
作为一种替代方案,使用JDIC项目,您可以将文件与特定应用程序关联起来。这可能对您有所帮助。但是,您可以仅注册文件类型而不是整个协议(可能有些复杂)。因此,像这样的链接:
 <a href="http://example.com/file.dan">Dan File</a>

这个文件可以用你的应用程序打开。

以下是注册你的应用程序打开该文件类型的示例代码:

AssociationService serv = new AssociationService();
Association logassoc = new Association();

logassoc.addFileExtension("DAN"); 
logassoc.addAction( new Action("open", "C:\\WINDOWS\\JAVA.EXE -jar C:\\dan.jar %1"));

以下是完整的文章:了解JDIC文件类型关联


使用文件下载而非协议将会引发其他问题。出于安全原因,不是所有的浏览器都允许设置默认操作,它们总是提示用户打开或保存文件。该文件也将被保存到下载文件夹中,这可能需要进行清理。使用URI方案可自动将文件保存到临时文件夹中,并与文件下载相比,更多的浏览器将允许您设置默认操作,这意味着用户只需收到一次提示。 - KC Wong

0
我建议您使用Java Webstart,而不是尝试发明新的链接方案。它已经被任何安装了Sun Java的浏览器支持。

2
我认为Webstart不够用,因为应用程序需要执行超出Webstart安全限制的操作,我认为需要进行安装。 - Dan
1
通过签署您的应用程序,您可以获得完全访问权限。 - Thorbjørn Ravn Andersen
只要用户按下“确定”按钮,Webstart应用程序就与其他任何应用程序没有区别。 - kdgregory
1
Webstart不起作用,因为如果没有安装Java,则无法识别jnlp文件,这会使普通用户感到困惑。此外,我需要文件\utl关联。 - Dan
JNLP URI方案是在1.7的某个版本中添加的,因此可能有一些安装了Java但没有URI方案的用户。 - KC Wong

0

谢谢,但是一个FF扩展不够全面。 - Dan
@Thorbjørn 不依赖于 Firefox 的安装,需要假设用户可能正在使用任何主要的浏览器——需要是已安装的应用程序(我想)。 - Dan
@Dan:第二篇文章就是讲这个的。如果你能够自动化注册过程,那么你就完成了。不过还有一种替代方案,不是基于协议名称,而是基于文件扩展名。我会在另一个答案中发布链接。 - OscarRyz

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接