无法在 Ubuntu 上创建自定义 URI 方案

Ven*_*lli 5 command-line scheme

我在 RedHat Linux 上创建了自定义 URI 方案处理程序,它按预期工作。例如,当用户被重定向到自定义 URI 时:myapp://abcd浏览器打开类似于 mailto: handler 的应用程序启动器弹出窗口。

在 Ubuntu 中执行类似的步骤并不容易,我尝试了所有可能的解决方案,但都没有奏效。

这是我为 RedHat 所做的工作,它完美地工作:

  1. 在 中添加条目~/.local/share/applications/mimeapps.list

    [Added Associations]
    x-scheme-handler/myprotocol=myprotocol-handler.desktop
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建~/.my-handler.sh

    [Added Associations]
    x-scheme-handler/myprotocol=myprotocol-handler.desktop
    
    Run Code Online (Sandbox Code Playgroud)

我已经在 Ubuntu 上尝试了上述步骤,但它不起作用,方案处理程序仅适用于xdg-open命令,如果我在浏览器上尝试相同的 URI,则它不起作用。

我尝试了以下位置:

~/.config/
~/.local/share/applications/
~/.local/share/applications/packages
sudo update-desktop-database
xdg-mime command
Run Code Online (Sandbox Code Playgroud)

没有一种方法按预期工作。有人能指出我正确的方向吗,我的 Ubuntu 版本是16.04.4

Nat*_*ver 5

\n

我已经在 Ubuntu 上尝试了上述步骤,但不起作用

\n
\n\n

如果我不得不猜测,我会说你的桌面文件可能无法执行

\n\n
$ if test -x ~/.local/share/applications/myprotocol-handler.desktop; then echo \'executable\'; else echo \'not executable\'; fi\n
Run Code Online (Sandbox Code Playgroud)\n\n

你可以像这样解决这个问题:

\n\n
$ chmod +x ~/.local/share/applications/myprotocol-handler.desktop\n
Run Code Online (Sandbox Code Playgroud)\n\n

首先尝试一下。

\n\n

此外,我还可以立即看到其他一些问题:

\n\n
    \n
  1. 您是注册myapp计划还是myprotocol计划?

    \n\n

    您提到了这两个内容,但您想要打开的 URL 确实有些令人困惑。

    \n\n

    我假设您想使用该myprotocol方案,\ne.g。myprotocol://abcd

  2. \n
  3. 桌面文件的“Exec”条目。

    \n\n
    Exec=sh -c "$HOME/.my-handler.sh %u"\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    如果$HOME/.my-handler.sh您的$PATH.

    \n\n

    如果您的脚本是可执行的,则sh -c没有必要,\n因为它的顶部有 shebang 行。\n这还增加了另一层复杂性,\n因为任何 URL 在到达您的 URL 处理程序脚本之前都将被 shell 扩展\n。

    \n\n

    shebang 行将其列为 bash 脚本 ( #!/bin/bash),\n但您正在使用sh它来执行它。\n我没有看到脚本的任何部分会产生影响,\n但默认情况下shdash\n不同外壳来自bash.

    \n\n
    $ type -a sh\nsh is /bin/sh\n$ file /bin/sh\n/bin/sh: symbolic link to dash\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
  5. 剧本.my-handler.sh

    \n\n

    您不需要将其设置为隐藏文件;\n 这样的文件名my-handler.sh就可以了。\n因为我怀疑您的主目录位于 中$PATH,\n将它放在您的主目录中没有任何优势,除了使绝对路径短一点。\n(请参阅$PATH下面的更多信息。)

    \n\n

    你的 shebang 将在 Ubuntu 上运行:

    \n\n
    $ type -a bash\nbash is /bin/bash\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    但为了可移植性,这是一个好习惯#!/usr/bin/env bash

    \n\n

    您正在使用未初始化的变量“$code”\n并将其附加到名为 的文件中file。\n这样做的目的是什么?\n由于file是相对路径,\n这将取决于工作目录,\n这可能不是您想要的\n(对于从 Firefox 启动的 URL,\n这将取决于浏览器启动的目录,\n可能是主目录,但也可能是几乎任何其他目录。)

    \n\n

    您的脚本从不使用"$1"或任何其他参数。\n这意味着它本质上是丢弃所传递的 URL\n并打开https://redirect.site.com

    \n\n

    但也许这只是一个占位符脚本,这是故意的?\n如果是这样,我会建议使用这个测试脚本:

    \n\n
    $ cat .my-handler.sh\n#! /usr/bin/env bash\nURL="$1"\nzenity --info --text "URL: ${URL}\\nPWD=${PWD}"\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    这样您就可以看到传递的 URL 以及运行它的目录。

  6. \n
\n\n
\n

方案处理程序仅适用于xdg-open命令,如果我在浏览器上尝试相同的 URI,则它不起作用。

\n
\n\n

如果xdg-open有效,那么只需配置浏览器即可。\n根据您的评论,您似乎使用的是 Firefox,\n它在“首选项”下处理此问题:

\n\n

选择 Firefox 如何处理您从网络下载的文件或浏览时使用的应用程序。

\n\n
\n

应用领域

\n\n

选择 Firefox 如何处理您从网络下载的文件或\n 浏览时使用的应用程序。

\n
\n\n

handlers.json正如您提到的,它存储在 中。

\n\n
\n

我尝试了以下位置

\n
\n\n

如果xdg-open已经可以工作,\n这应该不是问题,\n但是关于自定义 URL 处理程序的一个棘手的问题\n是,至少有四个文件可能存储关联,\n具体取决于应用程序使用的应用程序/库:

\n\n
    \n
  • ~/.config/mimeapps.list(修改正确的地方)
  • \n
  • ~/.local/share/application/mimeapps.list已弃用的位置
  • \n
  • ~/.local/share/applications/mimeinfo.cache(已弃用位置的缓存)
  • \n
  • ~/.local/share/application/defaults.list较旧的已弃用位置
  • \n
\n\n

我们将在下面解决这个问题。

\n\n

我最近在自定义 URL 处理程序方面做了一些工作,因此我为此目的调整了其中的一些工作。下面是一些可能对您有所帮助的分步说明:

\n\n
    \n
  1. 检查协议是否已注册。

    \n\n
    $ gio mime x-scheme-handler/myprotocol\nNo default applications for \xe2\x80\x9cx-scheme-handler/myprotocol\xe2\x80\x9d\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    就我而言,该协议尚未注册。

  2. \n
  3. 直接测试脚本。

    \n\n

    您可能需要使其可执行,如下所示:

    \n\n
    $ chmod +x ~/.my-handler.sh\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    然后使用示例 URL:

    \n\n
    $ ~/.my-handler.sh \'myprotocol://abcd\'\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    在继续之前先解决此处的任何问题。

  4. \n
  5. 将脚本添加到您的脚本中$PATH,以便桌面文件可以找到它。

    \n\n

    此步骤是可选的,\n但这是一个值得养成的好习惯。\n将脚本放入$PATH\n意味着您不必在桌面文件中包含完整的绝对路径,\n因此您的桌面文件将不需要更改\n如果脚本的路径发生变化。

    \n\n

    我使用bin这样的目录:

    \n\n
    $ mkdir ~/bin/\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    并将其添加到~/.profile\n(请注意,您需要注销并再次登录才能看到更改):

    \n\n
    PATH="$HOME/bin:$PATH"\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    最后将脚本复制或符号链接到~/bin

    \n\n
    $ ln -s $PWD/.my-handler.sh ~/bin/\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    如果你做得正确,你应该做类似这样的事情:

    \n\n
    $ type -a .my-handler.sh\n.my-handler.sh is /home/nathaniel/bin/.my-handler.sh\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    不是这个:

    \n\n
    $ type -a .my-handler.sh\nbash: type: .my-handler.sh: not found\n
    Run Code Online (Sandbox Code Playgroud)
  6. \n
  7. 安装桌面文件。

    \n\n

    看起来您已经完成了此操作,\n但为了将来参考,您可以使用包desktop-file-install中的\n命令desktop-file-utils

    \n\n
    $ desktop-file-install --dir=$HOME/.local/share/applications/ myprotocol-handler.desktop\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    这些是桌面文件中最重要的行:

    \n\n
    Exec=.my-handler.sh %u\nMimeType=x-scheme-handler/myprotocol\n
    Run Code Online (Sandbox Code Playgroud)
  8. \n
  9. 确保桌面文件是可执行的。

    \n\n

    这样做:

    \n\n
    $ chmod +x ~/.local/share/applications/myprotocol-handler.desktop\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    作为一项安全措施,这是必要的。

  10. \n
  11. 使用 mimetype\n 注册桌面文件x-scheme-handler/myprotocol

    \n\n
    $ gio mime x-scheme-handler/myprotocol myprotocol-handler.desktop\nSet myprotocol-handler.desktop as the default for x-scheme-handler/myprotocol\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    这实际上所做的只是更改组下的~/.config/mimeapps.list[Default Applications],因此它是这样的:

    \n\n
    x-scheme-handler/myprotocol=myprotocol-handler-desktop\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    一些较旧的应用程序使用~/.local/share/application/mimeapps.list,\n但这已被正式弃用。\n但是,该xdg-mime命令仍然使用此位置:

    \n\n
    $ xdg-mime default myprotocol-handler.desktop x-scheme-handler/myprotocol\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    还有一个更旧的已弃用文件\n称为defaults.list\n,某些应用程序仍在使用该文件。\n使用文本编辑器编辑此文件:

    \n\n
    $ edit ~/.local/share/applications/defaults.list\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    并手动添加这些行:

    \n\n
    x-scheme-handler/myprotocol=myprotocol-handler.desktop\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    集团下[Default Applications]

  12. \n
  13. 检查是否注册成功。

    \n\n
    $ gio mime x-scheme-handler/myprotocol\nDefault application for \xe2\x80\x9cx-scheme-handler/myprotocol\xe2\x80\x9d: myprotocol-handler.desktop\nRegistered applications:\n        myprotocol-handler.desktop\nRecommended applications:\n        myprotocol-handler.desktop\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    检查xdg-mime也。

    \n\n
    $ xdg-mime query default x-scheme-handler/myprotocol\nmyprotocol-handler.desktop\n
    Run Code Online (Sandbox Code Playgroud)
  14. \n
  15. 从命令行测试一些 URL。

    \n\n
    $ gio open \'myprotocol://abcd\'\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    现在使用以下命令测试相同的 URL xdg-open

    \n\n
    $ xdg-open \'myprotocol://abcd\'\n
    Run Code Online (Sandbox Code Playgroud)
  16. \n
  17. 更新 mimeinfo 缓存。

    \n\n

    某些应用程序读取~/.local/share/applications/mimeinfo.cache\而不是~/.config/mimeapps.list。\n因此更新缓存:

    \n\n
    $ update-desktop-database ~/.local/share/applications/\n
    Run Code Online (Sandbox Code Playgroud)
  18. \n
  19. 使用本地 HTML 文件在浏览器中进行测试。

    \n\n
    <!DOCTYPE html>\n<html lang="en">\n  <head>\n    <meta charset="utf-8">\n    <title>Example URL</title>\n  </head>\n  <body>\n    <a href="myprotocol://abcd">myprotocol://abcd</a>\n  </body>\n</html>\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    第一次打开链接时,\nFirefox 将提示您查找桌面文件。

    \n\n

    该链接需要使用应用程序打开。

    \n\n

    导航至~/.local/share/applications/并单击myprotocol-handler.desktop

    \n\n

    还要勾选“记住我对我的协议链接的选择”框。

    \n\n

    myprotocol-handler.desktop

    \n\n

    完成后它应该看起来像这样。

    \n\n

    使用我的启动器(默认)

  20. \n
  21. 使用远程 HTML 文件在浏览器中对其进行测试。

    \n\n

    本地和远程 HTML 文件之间存在一些安全差异,\n因此最好检查两者。\n您可以为此设置一些托管,\n也可以仅使用 Github 或类似的,但这超出了范围这个问题。

  22. \n
\n