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

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

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

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

这是我为 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

答案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

先尝试一下。

此外,我还立即发现了其他一些问题:

  1. 您是在注册该myapp计划还是注册该myprotocol计划?

    您提到了这两者,但您到底想要打开哪些 URL,这有点令人困惑。

    我假设您想使用该myprotocol方案,例如myprotocol://abcd

  2. 您的桌面文件的“Exec”条目。

    Exec=sh -c "$HOME/.my-handler.sh %u"
    

    如果在您的 中,则$HOME/没有必要。.my-handler.sh$PATH

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

    shebang 行将其列为 bash 脚本 ( #!/bin/bash),但您却使用sh它来执行它。我看不出脚本的任何部分会有什么不同,但默认情况下shdash,与 不同的 shell 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。)

    你的shebang将在Ubuntu上运行:

    $ type -a bash
    bash is /bin/bash
    

    #!/usr/bin/env bash但为了便于携带,这是一个很好的习惯。

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

    您的脚本从未使用"$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 如何处理您从网络下载的文件或浏览时使用的应用程序。

应用

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

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

我尝试过以下位置

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

  • ~/.config/mimeapps.list(进行更改的正确位置)
  • ~/.local/share/application/mimeapps.list(这已弃用的位置
  • ~/.local/share/applications/mimeinfo.cache(已弃用位置的缓存)
  • ~/.local/share/application/defaults.list(这较旧的弃用位置

我们将在下面讨论这个问题。

我一直在做一些 使用自定义 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 意味着您不必在桌面文件中包含完整的绝对路径,因此如果脚本的路径发生变化,您的桌面文件也不需要更改。

    我使用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. 使用 mimetype 注册桌面文件 x-scheme-handler/myprotocol

    $ 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 会提示您查找桌面文件。

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

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

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

    我的协议处理程序.desktop

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

    使用我的启动器(默认)

  11. 使用远程 HTML 文件在浏览器中进行测试。

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

相关内容