Я создал пользовательский обработчик схем URI на Redhat Linux, и он работал как ожидалось. Когда пользователь перенаправляется к пользовательскому URI, например: myapp://abcd
браузер открывает всплывающее окно средства запуска приложения, подобное mailto: обработчик.
Не было легко сделать подобные шаги в Ubuntu, я попробовал все возможные решения, доступные только bu, ни один из них не работал.
Вот то, что я сделал для Redhat, который работал отлично:
Включите запись ~/.local/share/applications/mimeapps.list
:
[Added Associations]
x-scheme-handler/myprotocol=myprotocol-handler.desktop
Включите myprotocol-handler.desktop ~/.local/share/applications/myprotocol-handler.desktop
:
[Desktop Entry]
Version=1.0
Type=Application
Exec=sh -c "$HOME/.my-handler.sh %u"
Icon=
StartupNotify=true
Terminal=false
Categories=Utility;X-XFCE;X-Xfce-Toplevel;
MimeType=x-scheme-handler/myprotocol
Name=My Launcher
Comment=Launch MyProtocol
Создать ~/.my-handler.sh
:
#!/bin/bash
printf "$code" >> file
xdg-open https://redirect.site.com
Я попробовал вышеупомянутые шаги на Ubuntu, и она не работает, обработчик схем только работает на xdg-open
команда это не работает, если я пробую тот же URI на браузере.
Я попробовал ниже местоположений:
~/.config/
~/.local/share/applications/
~/.local/share/applications/packages
sudo update-desktop-database
xdg-mime command
Ни один из подхода не работает как ожидалось. Может кто-то указывать на меня на правильное направление, моя версия Ubuntu 16.04.4
Я попробовал вышеупомянутые шаги на Ubuntu, и она не работает
Если бы я должен был предположить, то я сказал бы, что Ваш файл на рабочем столе не мог бы быть исполняемым файлом.
$ if test -x ~/.local/share/applications/myprotocol-handler.desktop; then echo 'executable'; else echo 'not executable'; fi
Можно зафиксировать это как так:
$ chmod +x ~/.local/share/applications/myprotocol-handler.desktop
Дайте этому попытку сначала.
Кроме того, существует несколько других проблем I, видят сразу же:
Вы регистрируетесь myapp
схема или myprotocol
схема?
Вы упоминаете оба из них, и это несколько сбивает с толку точно, какие URL Вы хотите открыть.
Я предположу, что Вы хотите использовать myprotocol
схема, например. myprotocol://abcd
.
"Исполнительная" запись Вашего файла на рабочем столе.
Exec=sh -c "$HOME/.my-handler.sh %u"
$HOME/
не необходимо если .my-handler.sh
находится в Вашем $PATH
.
sh -c
не необходимо, если Ваш сценарий является исполняемым файлом, так как он имеет строку хижины наверху. Это также добавляет другой слой сложности, так как любые URL будут расширены оболочкой, прежде чем они доберутся до Вашего сценария обработчика URL.
Строка хижины перечисляет его как сценарий удара (#!/bin/bash
), но Вы используете sh
выполнить его вместо этого. Я не вижу части сценария, где это будет иметь значение, но по умолчанию sh
dash
, другая оболочка от bash
.
$ type -a sh
sh is /bin/sh
$ file /bin/sh
/bin/sh: symbolic link to dash
.my-handler.sh
сценарий.
Вы не должны делать это скрытым файлом; имя файла как my-handler.sh
будет прекрасен. Так как я сомневаюсь, что Ваш корневой каталог находится в $PATH
, нет никакого преимущества для помещения его в Вашем корневом каталоге кроме создания полного пути немного короче. (См. больше о $PATH
ниже.)
Ваша хижина будет работать над Ubuntu:
$ type -a bash
bash is /bin/bash
но это - хорошая привычка использовать #!/usr/bin/env bash
для мобильности.
Вы используете неинициализированную переменную "$code" и добавляете его в названный файл file
. Какова цель этого? С тех пор file
относительный путь, это будет зависеть от рабочего каталога, который является, вероятно, не, что Вы хотите. (Для URL, запущенных из Firefox, это будет зависеть, на каком каталоге браузер был запущен от, который мог бы быть корневым каталогом, но мог быть почти где-либо еще, также.)
Ваш сценарий никогда не использует "$1"
или любые другие аргументы. Это означает, что по существу отбрасывает URL, это передается и открытие https://redirect.site.com
вместо этого.
Но возможно это - просто сценарий заполнителя, и это было намеренным? Если так, я предложил бы этот сценарий тестирования вместо этого:
$ cat .my-handler.sh
#! /usr/bin/env bash
URL="$1"
zenity --info --text "URL: ${URL}\nPWD=${PWD}"
таким образом, Вы видите, что URL передал и каталог, он выполняется от.
Обработчик схем только работает на
xdg-open
команда это не работает, если я пробую тот же URI на браузере.
Если xdg-open
работает, затем это - просто вопрос конфигурирования браузера. На основе Ваших комментариев похоже на использование Firefox который обрабатывает это под Предпочтениями:
Приложения
Выберите, как Firefox обрабатывает файлы, которые Вы загружаете с сети или приложений, которые Вы используете при просмотре.
Это хранится в handlers.json
, как Вы упоминаете.
Я попробовал ниже местоположений
Если xdg-open
уже работает, это не должно быть проблемой, но одна хитрая вещь о пользовательских обработчиках URL состоит в том, что существует по крайней мере четыре файла, в которых могли бы быть сохранены ассоциации, в зависимости от приложения / библиотека использование приложения:
~/.config/mimeapps.list
(правильное место для внесения изменений)~/.local/share/application/mimeapps.list
(местоположение устаревшее)~/.local/share/application/defaults.list
(более старое местоположение устаревшее)~/.local/share/applications/mimeinfo.cache
(кэш)Мы решим эту проблему ниже.
Я делал некоторую работу над пользовательскими обработчиками URL в последнее время, таким образом, я адаптировал часть этого с этой целью. Вот некоторые пошаговые инструкции, которые могут помочь Вам:
Проверьте, регистрируется ли протокол уже.
$ gio mime x-scheme-handler/myprotocol
No default applications for “x-scheme-handler/myprotocol”
В моем случае уже не регистрируется протокол.
Протестируйте сценарий непосредственно.
Вы, возможно, должны сделать это исполняемым файлом, как это:
$ chmod +x ~/.my-handler.sh
Затем используйте URL в качестве примера:
$ ~/.my-handler.sh 'myprotocol://abcd'
Решите любые проблемы здесь перед продвижением.
Добавьте сценарий к Вашему $PATH
таким образом, файл на рабочем столе может найти его.
Этот шаг является дополнительным, но это - хорошая привычка войти. Помещение сценариев в $PATH
средства Вы не должны будете включать полный полный путь в свой файл на рабочем столе, таким образом, Ваш файл на рабочем столе не должен будет быть изменен, если путь к Вашему сценарию изменится.
Я использую a bin
каталог как это:
$ mkdir ~/bin/
и добавьте это к ~/.profile
(обратите внимание, что необходимо будет выйти из системы и войти в систему снова для наблюдения изменений):
PATH="$HOME/bin:$PATH"
и наконец или копия или символьная ссылка сценарий к ~/bin
:
$ ln -s $PWD/.my-handler.sh ~/bin/
Если бы Вы сделали это правильно, то Вы должны что-то подобное этому:
$ type -a .my-handler.sh
.my-handler.sh is /home/nathaniel/bin/.my-handler.sh
не это:
$ type -a .my-handler.sh
bash: type: .my-handler.sh: not found
Установите файл на рабочем столе.
Уже похоже на выполнение этого но для дальнейшего использования можно использовать desktop-file-install
команда от desktop-file-utils
пакет:
$ desktop-file-install --dir=$HOME/.local/share/applications/ myprotocol-handler.desktop
Это самые важные строки в файле на рабочем столе:
Exec=.my-handler.sh %u
MimeType=x-scheme-handler/myprotocol
Удостоверьтесь, что файл на рабочем столе является исполняемым файлом.
Сделайте это как так:
$ chmod +x ~/.local/share/applications/myprotocol-handler.desktop
Зарегистрируйте файл на рабочем столе с x-scheme-handler/myprotocol
mimetype.
$ gio mime x-scheme-handler/myprotocol myprotocol-handler.desktop
Set myprotocol-handler.desktop as the default for x-scheme-handler/myprotocol
Все это действительно делает изменить строки в ~/.config/mimeapps.list
под [Default Applications]
группа, таким образом, это говорит это:
x-scheme-handler/myprotocol=myprotocol-handler-desktop
Некоторое более старое использование приложений ~/.local/share/application/mimeapps.list
, но это официально удерживается от использования. Однако xdg-mime
управляйте использует это местоположение так или иначе:
$ xdg-mime default myprotocol-handler.desktop x-scheme-handler/myprotocol
Существует также еще более старый названный файл устаревший defaults.list
это все еще используется некоторыми приложениями. Отредактируйте этот файл с текстовым редактором:
$ edit ~/.local/share/applications/defaults.list
и вручную добавьте эти строки:
x-scheme-handler/myprotocol=myprotocol-handler.desktop
под [Default Applications]
группа.
Проверьте, было ли это успешно зарегистрировано.
$ gio mime x-scheme-handler/myprotocol
Default application for “x-scheme-handler/myprotocol”: myprotocol-handler.desktop
Registered applications:
myprotocol-handler.desktop
Recommended applications:
myprotocol-handler.desktop
Проверить xdg-mime
также.
$ xdg-mime query default x-scheme-handler/myprotocol
myprotocol-handler.desktop
Протестируйте некоторые URL из командной строки.
$ gio open 'myprotocol://abcd'
Теперь протестируйте тот же URL с xdg-open
:
$ xdg-open 'myprotocol://abcd'
Обновите mimeinfo кэш.
Некоторое чтение приложений ~/.local/share/applications/mimeinfo.cache
вместо ~/.config/mimeapps.list
. Так обновите кэш:
$ update-desktop-database ~/.local/share/applications/
Протестируйте его в браузере с локальным файлом HTML.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Example URL</title>
</head>
<body>
<a href="myprotocol://abcd">myprotocol://abcd</a>
</body>
</html>
В первый раз, когда Вы открываете ссылку, Firefox предложит Вам находить файл на рабочем столе.
Перейдите к ~/.local/share/applications/
и нажмите myprotocol-handler.desktop
.
Также отметьте поле, которое говорит, "Помнят мой выбор за ссылки myprotocol".
Должно быть похожим на это, когда Вы сделаны.
Протестируйте его в браузере с удаленным файлом HTML.
Существуют некоторые различия в безопасности между локальными и удаленными файлами HTML, таким образом, хорошо проверить обоих. Вы могли настроить некоторый хостинг для этого или просто использовать GitHub или подобный, но это выходит за рамки этого вопроса.