23

作为此安装的一部分,我想创建一个安装在多个平台(Windows、Mac OS、Linux)上的 Java 应用程序,我希望注册一个 URL 协议处理程序,以便在单击链接时加载我的应用程序。

即我想要这样的东西:myprotocol://example.com

有没有一种统一的方式来做到这一点?或者某种可以推断不同操作系统之间差异的框架。

4

6 回答 6

16

MultiBit在一系列平台上实现了这一点

我刚刚为 MultiBit 项目(一个轻量级比特币客户端)走上了这条道路,我必须实现启动和更新应用程序以响应自定义 URI(在我的例子中bitcoin:1sdfjsdfdkfdkjfdjfkjertn?amount=0.5&label=Some%20Text)。

我必须实现它的方式是创建一个通用的方法来接收操作系统事件。很多这项工作是基于Macify 库,然后重写以支持多个任意平台。

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

例如,在 Mac 世界中,有一个 EAWT 库,它不可用于分发,但提供对本机事件 API 的访问。这意味着您的应用程序需要能够在运行时找到此库,然后反射性地使用本机类(您不能对它们进行硬编码,因为您不能保证您将在具有支持的平台上构建您的应用程序库,由于许可证限制,您不能包含它)。如果这听起来像是艰苦的工作——相信我。

在 Windows 上,您需要更新注册表,以便在有人使用该协议时启动您的应用程序。Microsoft 提供了一组有用的说明,详细说明了此过程。

在 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 月

在带有 Gnome 3(Ubuntu 11.04+)的 Linux 上,情况有点不同,依​​赖于exampleapp.desktop放置在/usr/share/applications文件夹中的文件,其后跟sudo update-desktop-database.

说够了 - 给我代码!

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

该代码最初是在 v0.3 分支中引入的,但将从 2012 年第一季度开始成为主流。它都是 MIT 许可证,所以你可以用它做任何你喜欢的事情。如果您发现错误,请报告它们,或者更好的是,修复它们并提供拉取请求,以便其他人受益。

于 2011-12-30T13:02:59.467 回答
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"
于 2012-01-06T02:01:33.017 回答
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 文件类型关联

于 2009-12-22T17:15:40.473 回答
0

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

于 2009-12-22T15:52:47.953 回答
0

在 Firefox 中,您可以注册自己的协议

本文介绍了有关协议注册的更多信息。也许你可以从那里自动化它。

于 2009-12-22T15:57:11.303 回答
0

您可能需要以特定于平台的方式执行此操作。这是在 OS X 中的操作方法

http://www.cocoadev.com/index.pl?HowToRegisterURLHandler

于 2009-12-22T19:20:22.103 回答