最近在 Fedora(GNOME + Wayland)环境下遇到了一个比较烦人的问题。
浏览器(Flatpak版的Chromium)访问抖音网页时,页面会尝试调用自定义协议,例如:
bytedance://...bitbrowser://...
如果系统中没有对应应用,每次重新打开抖音页面都会弹出"选择应用程序"或"打开外部应用"的窗口,影响使用体验。
问题原因
抖音网页会尝试打开:
bytedance://bitbrowser://
这类 URI 并不是普通网页链接(https://),而是 自定义协议(Custom URI Scheme)。
浏览器允许后,会调用:
xdg-desktop-portal ↓org.freedesktop.portal.OpenURI ↓Linux MIME Handler
如果系统没有对应 handler,就可能不断弹出选择应用程序的窗口。
解决方案
① 创建一个空的 Handler
在:
~/.local/share/applications/
新建文件:
null-handler.desktop
内容如下:
[Desktop Entry]Name=Null HandlerType=ApplicationExec=trueNoDisplay=trueMimeType=x-scheme-handler/bytedance;x-scheme-handler/bitbrowser;
其中:
Exec=true
表示什么也不做,立即退出。
② 更新 Desktop Database
执行:
update-desktop-database ~/.local/share/applications
这一步非常重要。
它会扫描当前目录所有 .desktop 文件中的:
MimeType=
字段,并生成:
~/.local/share/applications/mimeinfo.cache
之后系统就知道:
x-scheme-handler/bytedance ↓null-handler.desktop
完成后,抖音再次尝试打开:
bytedance://...
系统会直接调用:
null-handler.desktop
因为:
Exec=true
程序立即结束,因此不会再弹出选择应用程序窗口。
最开始以为需要修改:
~/.config/mimeapps.list
例如填加:
[Default Applications]x-scheme-handler/bytedance=null-handler.desktopx-scheme-handler/bitbrowser=null-handler.desktop
后来实验发现:
删除这两行以后,拦截依然有效。
说明真正起作用的并不是这里。
真正关键的是:
null-handler.desktop ↓update-desktop-database ↓mimeinfo.cache
也就是说,只要系统已经把 null-handler.desktop 注册成了对应协议的合法 Handler,GNOME 在很多情况下就能够直接找到它。
Chromium 自己还有一套权限
浏览器第一次遇到:
bytedance://...
通常会询问:
是否允许此网站打开外部应用?
如果勾选:
始终允许
Chromium 会把这个权限写入 Profile 中名为Preferences的文件中(Profile的位置可通过访问chrome://version 查找Profile Path)
例如:
"protocol_handler": { "allowed_origin_protocol_pairs": { "https://www.douyin.com": { "bytedance": true } }}
它表示:
www.douyin.com │ └── 可以直接调用 bytedance://
这是 浏览器自己的权限管理,和 Linux MIME 系统是两回事。
如果想恢复第一次询问,只需要关闭浏览器,删除对应的:
protocol_handler.allowed_origin_protocol_pairs
即可。