Регистрация обработчика протокола URL на нескольких платформах - PullRequest
17 голосов
/ 22 декабря 2009

Я хочу создать приложение Java, которое будет установлено на нескольких платформах (Windows, Mac OS, Linux) в рамках этой установки. Я хочу зарегистрировать обработчик протокола URL, чтобы мое приложение загружалось при нажатии на ссылки.

т.е. Я хочу что-то вроде этого: myprotocol: //example.com

Есть ли какой-нибудь консолидированный способ сделать это? Или какая-то платформа, которая экстраполирует разницу между разными ОС.

Ответы [ 6 ]

14 голосов
/ 30 декабря 2011

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

В Linux с Gnome 3 (Ubuntu 11.04+) ситуация немного отличается , полагаясь на файл exampleapp.desktop, помещенный в папку /usr/share/applications, за которым следует sudo update-desktop-database.

Хватит говорить - дай мне код!

Вы можете найти его в MultiBit исходном коде . Я не потрудился вытащить его в свой собственный проект, но достаточно свернуть пакет platform и просто вытащить код оттуда (достаточно автономно). Приложение устанавливается с использованием IzPack, поэтому также можно использовать записи реестра для Windows.

Код был , впервые введенный в ветке v0.3 , но он станет основным с 1 квартала 2012 года. Это все лицензия MIT, так что вы можете делать с ней все что угодно. Если вы обнаружите ошибки, сообщите о них или, что еще лучше, исправьте их и предложите запрос на извлечение информации, чтобы другие могли получить выгоду.

2 голосов
/ 06 января 2012

Для 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"
1 голос
/ 22 декабря 2009

В качестве альтернативы, используя проект 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

0 голосов
/ 22 декабря 2009

Вам, вероятно, придется делать это в зависимости от платформы. Вот как это сделать в OS X

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

0 голосов
/ 22 декабря 2009

В Firefox вы можете зарегистрировать свой собственный протокол .

Эта статья описывает подробнее о регистрации протокола. Вероятно, вы могли бы автоматизировать это оттуда.

0 голосов
/ 22 декабря 2009

Я бы порекомендовал использовать Java Webstart , а не пытаться придумать новую схему ссылок. Он уже поддерживается любым браузером, в котором установлена ​​Sun Java.

...