我在 RedHat Linux 上创建了自定义 URI 方案处理程序,它按预期工作。当用户重定向到自定义 URI 时,例如:myapp://abcd
浏览器打开类似于 mailto 的应用程序启动器弹出窗口:处理程序。
在 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
答案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
先尝试一下。
此外,我还立即发现了其他一些问题:
您是在注册该
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 处理程序脚本之前都会被 shell 扩展。shebang 行将其列为 bash 脚本 (
#!/bin/bash
),但您却使用sh
它来执行它。我看不出脚本的任何部分会有什么不同,但默认情况下sh
是dash
,与 不同的 shellbash
。$ type -a sh sh is /bin/sh $ file /bin/sh /bin/sh: symbolic link to dash
剧本
.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 如何处理您从网络下载的文件或浏览时使用的应用程序。
handlers.json
正如您提到的,它存储在中。
我尝试过以下位置
如果xdg-open
已经运行,这应该不是问题,但自定义 URL 处理程序的一个棘手问题是,关联可能存储在至少四个文件中,具体取决于应用程序所使用的应用程序/库:
~/.config/mimeapps.list
(进行更改的正确位置)~/.local/share/application/mimeapps.list
(这已弃用的位置)~/.local/share/applications/mimeinfo.cache
(已弃用位置的缓存)~/.local/share/application/defaults.list
(这较旧的弃用位置)
我们将在下面讨论这个问题。
我一直在做一些 使用自定义 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
这是作为安全措施是必要的。
使用 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]
。检查是否注册成功。
$ 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 或类似的东西,但这超出了这个问题的范围。