为什么Linux上的Chrome会显示未知协议的"外部协议请求"对话框?

IT *_*DAV 11 linux ubuntu google-chrome protocols

我正在为Linux上的Google Chrome创建自定义协议处理程序.我的链接看起来像这样:

<a href="myprotocol:someargument">Trigger my app with param</a>
Run Code Online (Sandbox Code Playgroud)

我注意到如果'myprotocol:'未注册(我的应用未安装),Linux上的Google Chrome会显示"外部协议请求"对话框,并尝试使用xdg-open:

在此输入图像描述

在其他操作系统上,例如Windows 10和OS X El Capitan,如果未注册协议,则不会显示任何内容.

我还验证了Firefox在Windows,OS X和Linux上一致地处理未知协议 - 没有显示任何内容.

Linux上的Chrome行为对用户来说非常混乱.

知道为什么Linux上的Chrome(我在Ubuntu 14.04上测试)与其他任何操作系统和Web浏览器的行为不同?

los*_*der 5

问题实际上是,如果Chrome缺少本地协议处理程序,则它想使用在用户环境中配置的处理程序。没有两个操作系统提供完全相同的API来启动默认处理程序。在实际启动该程序之前弄清楚该程序是什么,在Windows或Linux上甚至都不是一个清晰的API。

“ Mac”和Windows实现最终都知道哪个外部应用程序最终负责该协议,因此可以在不发出呼叫警告的情况下抑制未处理的呼叫。但是Windows实现实际上是一个依赖于Windows现有版本上的Windows注册表观察结果的麻烦。在Linux上,这种类型的API违例更为危险,因为在Linux上,许多类型具有不同的相关设置工具分支。

Windows和OsX不会发出警告,称它们什么都没叫,这实际上被认为是一个错误,因此,如果您认为这是正确的行为,则可能需要在此处进行注释。

这是我根据当前来源对这三个系统如何工作的观察:

的Linux

在Linux中,当您向(window)系统注册协议处理程序时,您将执行以下操作:

xdg-settings set default-url-scheme-handler myprotocol evolution.desktop
Run Code Online (Sandbox Code Playgroud)

现在,应用程序的发展负责您的协议,任何事情都可以调用:

 xdg-open myprotocol:...
Run Code Online (Sandbox Code Playgroud)

现在打开这些链接上的演变。其他OS具有类似的机制,但可能没有外部程序作为调用存根。

这很好,很抽象,知道/说出您正在调用的外部应用程序是xdg-open可以防止linux实现中的很多复杂性。但这并不完全是用户可能想要的信息。获取该信息将需要使用它xdg-settings来替代,并且如果有的话,或者曾经有过这种错误,就有可能在该系统的某些版本中有条件地覆盖默认处理程序。

视窗

在Windows处理程序中,显然您可以在注册表中窥探一下,然后对调用api的实际作用做出有根据的猜测。从技术上讲,chrome必须执行此操作,因为它通过系统API打开外部程序的方式,因此没有像xdg-open警告中所引用的外部存根。

苹果电脑

在“陆委会”处理程序中,有一个适当的API来询问您的具体URL将会启动应用程式,因此Chrome 确实,那么如果应用程序名称为空字符串就可以生成警告之前完全挂断电话。