Не удалось создать пользовательскую схему URI на Ubuntu

Я создал пользовательский обработчик схем URI на Redhat Linux, и он работал как ожидалось. Когда пользователь перенаправляется к пользовательскому URI, например: myapp://abcd браузер открывает всплывающее окно средства запуска приложения, подобное mailto: обработчик.

Не было легко сделать подобные шаги в Ubuntu, я попробовал все возможные решения, доступные только bu, ни один из них не работал.

Вот то, что я сделал для Redhat, который работал отлично:

  1. Включите запись ~/.local/share/applications/mimeapps.list:

    [Added Associations]
    x-scheme-handler/myprotocol=myprotocol-handler.desktop
    
  2. Включите 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
    
  3. Создать ~/.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

5
задан 13 December 2017 в 09:06

1 ответ

Я попробовал вышеупомянутые шаги на 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, видят сразу же:

  1. Вы регистрируетесь myapp схема или myprotocol схема?

    Вы упоминаете оба из них, и это несколько сбивает с толку точно, какие URL Вы хотите открыть.

    Я предположу, что Вы хотите использовать myprotocol схема, например. myprotocol://abcd.

  2. "Исполнительная" запись Вашего файла на рабочем столе.

    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
    
  3. .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 который обрабатывает это под Предпочтениями:

Choose how Firefox handles the files you download from the web or the applications you use while browsing.

Приложения

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

Это хранится в handlers.json, как Вы упоминаете.

Я попробовал ниже местоположений

Если xdg-open уже работает, это не должно быть проблемой, но одна хитрая вещь о пользовательских обработчиках URL состоит в том, что существует по крайней мере четыре файла, в которых могли бы быть сохранены ассоциации, в зависимости от приложения / библиотека использование приложения:

Мы решим эту проблему ниже.

Я делал некоторую работу над пользовательскими обработчиками URL в последнее время, таким образом, я адаптировал часть этого с этой целью. Вот некоторые пошаговые инструкции, которые могут помочь Вам:

  1. Проверьте, регистрируется ли протокол уже.

    $ gio mime x-scheme-handler/myprotocol
    No default applications for “x-scheme-handler/myprotocol”
    

    В моем случае уже не регистрируется протокол.

  2. Протестируйте сценарий непосредственно.

    Вы, возможно, должны сделать это исполняемым файлом, как это:

    $ chmod +x ~/.my-handler.sh
    

    Затем используйте URL в качестве примера:

    $ ~/.my-handler.sh 'myprotocol://abcd'
    

    Решите любые проблемы здесь перед продвижением.

  3. Добавьте сценарий к Вашему $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
    
  4. Установите файл на рабочем столе.

    Уже похоже на выполнение этого но для дальнейшего использования можно использовать 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
    
  5. Удостоверьтесь, что файл на рабочем столе является исполняемым файлом.

    Сделайте это как так:

    $ chmod +x ~/.local/share/applications/myprotocol-handler.desktop
    

    Это необходимо как меры безопасности.

  6. Зарегистрируйте файл на рабочем столе с 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] группа.

  7. Проверьте, было ли это успешно зарегистрировано.

    $ 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
    
  8. Протестируйте некоторые URL из командной строки.

    $ gio open 'myprotocol://abcd'
    

    Теперь протестируйте тот же URL с xdg-open:

    $ xdg-open 'myprotocol://abcd'
    
  9. Обновите mimeinfo кэш.

    Некоторое чтение приложений ~/.local/share/applications/mimeinfo.cache вместо ~/.config/mimeapps.list. Так обновите кэш:

    $ update-desktop-database ~/.local/share/applications/
    
  10. Протестируйте его в браузере с локальным файлом 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 предложит Вам находить файл на рабочем столе.

    This link needs to be opened with an application.

    Перейдите к ~/.local/share/applications/ и нажмите myprotocol-handler.desktop.

    Также отметьте поле, которое говорит, "Помнят мой выбор за ссылки myprotocol".

    myprotocol-handler.desktop

    Должно быть похожим на это, когда Вы сделаны.

    Use My Launcher (default)

  11. Протестируйте его в браузере с удаленным файлом HTML.

    Существуют некоторые различия в безопасности между локальными и удаленными файлами HTML, таким образом, хорошо проверить обоих. Вы могли настроить некоторый хостинг для этого или просто использовать GitHub или подобный, но это выходит за рамки этого вопроса.

0
ответ дан 23 November 2019 в 10:53

Другие вопросы по тегам:

Похожие вопросы: