这种现象的原因是浏览器在处理类似 xxx://oauth/callback? 这种自定义协议来接收OAuth回调的过程中, 找不到对应的处理程序, 于是fallback到了浏览器自身去打开这个连接, 结果就是打开了一个新浏览器窗口.
在Debian+i3的配置下, 因为i3是极简的一个窗口管理器, 没有XDG MIME/协议自动注册机制, 并且xdg-open找不到桌面环境, 最终导致浏览器无法正确跳转.
下面以 vikunja 这个程序为例子, 通过deb安装后会在下面目录中创建一个desktop文件
$ find /usr/share/applications ~/.local/share/applications -name "*vikunja*"
/usr/share/applications/vikunja-desktop.desktop我们通过cat输出并过滤内容, 可以找到对应的MimeType
$ cat /usr/share/applications/vikunja-desktop.desktop | grep "MimeType"
MimeType=x-scheme-handler/vikunja-desktop;那么我们就可以直接通过命令将协议注册到 ~/.config/mimeapps.list 中
xdg-mime default vikunja-desktop.desktop x-scheme-handler/vikunja-desktop
# 如果xdg无效时, 可以使用同功能的 gio 命令
gio mime x-scheme-handler/vikunja-desktop vikunja-desktop.desktop然后确认是否注册成功
grep vikunja ~/.config/mimeapps.list
# 应该输出
# x-scheme-handler/vikunja-desktop=vikunja-desktop.desktop
xdg-mime query default x-scheme-handler/vikunja-desktop
# 应该输出
# vikunja-desktop.desktop添加环境变量, 告诉系统当前的桌面环境
在i3 config配置中添加: exec --no-startup-id dbus-update-activation-environment --systemd --all
在 ~/.profile 中添加: export XDG_CURRENT_DESKTOP=i3
重启系统可能就正常了, 但是我的情况似乎更复杂一些, 重启后还是无法正常跳过, 因此要继续
先测试下面这两个命令能否正确弹出应用
# 系统默认的
xdg-open "vikunja-desktop://test"
# gio 方式
gio open "vikunja-desktop://test"在我的系统里, xdg-open 是无法打开的, 但是 gio 却可以, 因此我使用了一个取巧的方法, 将 xdg-open 替换为 gio
在这之前先找到原本的 xdg-open 命令的位置, 我的系统中位于 /usr/bin/xdg-open , 因此我可以创建一个同名的脚本放在 /usr/local/bin/xdg-open 位置, 以替换系统默认的命令.
于是编写一个脚本, 先使用 gio 命令尝试, 如果出错了, 就切换原本的 xdg-open 命令执行.
sudo tee /usr/local/bin/xdg-open << 'EOF'
#!/bin/bash
gio open "$@" 2>/dev/null || /usr/bin/xdg-open "$@"
EOF
sudo chmod +x /usr/local/bin/xdg-open此时重启系统后就一切正常了