Невозможно создать пользовательскую схему URI в Ubuntu
Я создал собственный обработчик схемы URI в RedHat Linux, и он работал как положено. Когда пользователь перенаправляется на пользовательский URI, например: myapp://abcd браузер открывает всплывающее окно запуска приложений, подобное mailto: handler.
Нелегко было сделать подобные шаги в Ubuntu, я попробовал все возможные решения, но ни одно из них не сработало.
Вот что я сделал для 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
0 ответов
Я пробовал вышеуказанные шаги на 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
Попробуйте сначала.
Кроме того, я вижу сразу несколько других проблем:
Вы регистрируете
myappсхема илиmyprotocolсхема?Вы упоминаете оба из них, и это несколько сбивает с толку, какие именно URL вы хотите открыть.
Я предполагаю, что вы хотите использовать
myprotocolсхема, напримерmyprotocol://abcd,Запись "Exec" вашего рабочего стола.
Exec=sh -c "$HOME/.my-handler.sh %u"$HOME/не нужно, если.my-handler.shв вашем$PATH,sh -cне нужен, если ваш скрипт исполняемый, так как в верхней части он содержит строку shebang. Это также добавляет еще один уровень сложности, поскольку все URL-адреса будут расширяться оболочкой до того, как они попадут в сценарий вашего обработчика URL-адресов.Строка shebang перечисляет это как скрипт bash (
#!/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означает, что вам не нужно будет указывать полный абсолютный путь в файле рабочего стола, поэтому вам не потребуется изменять файл рабочего стола, если путь к вашему сценарию изменится.Я использую
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/myprotocolMimeType.$ 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,Также установите флажок "Запомнить мой выбор для моих протокольных ссылок".
Это должно выглядеть так, когда вы закончите.
Протестируйте его в браузере с помощью удаленного HTML-файла.
Существуют некоторые различия в безопасности между локальными и удаленными файлами HTML, поэтому хорошо проверить оба. Вы можете настроить хостинг для этого, или просто использовать Github или аналогичный, но это выходит за рамки этого вопроса.
