Регистрация обработчика протокола URL на нескольких платформах
Я хочу создать приложение Java, которое будет установлено на нескольких платформах (Windows,Mac OS, Linux) в рамках этой установки. Я хочу зарегистрировать обработчик протокола URL, чтобы мое приложение загружалось при нажатии на ссылки.
т.е. я хочу что-то вроде этого: myprotocol://example.com
Есть ли какой-то консолидированный способ сделать это? Или какая-то структура, которая экстраполирует разницу между различными ОС.
6 ответов
MultiBit реализует это на разных платформах
Я только что пошел по этому пути для проекта MultiBit (облегченный клиент Bitcoin), где мне пришлось реализовать запуск и обновление приложения в ответ на пользовательский 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, поэтому вы можете делать с ней все что угодно. Если вы обнаружите ошибки, сообщите о них или, что еще лучше, исправьте их и предложите запрос на извлечение информации, чтобы другие могли воспользоваться.
Для 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"
В качестве альтернативы, используя проект 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
В Firefox вы можете зарегистрировать свой собственный протокол.
Эта статья описывает больше о регистрации протокола. Вероятно, вы могли бы автоматизировать это оттуда.
Я бы порекомендовал вам использовать Java Webstart, а не пытаться придумать новую схему ссылок. Он уже поддерживается любым браузером, в котором установлена Sun Java.
Вам, вероятно, нужно будет сделать это в зависимости от платформы. Вот как это сделать в OS X