如何检测浏览器的协议处理程序?

IT技术 javascript browser protocols moniker
2021-02-05 01:43:49

我创建了一个自定义 URL 协议处理程序。

http://

mailto://

custom://

我已经注册了一个 WinForms 应用程序来做出相应的响应。这一切都很好。

但我希望能够优雅地处理用户尚未安装自定义 URL 协议处理程序的情况。

为了能够做到这一点,我需要能够检测浏览器的注册协议处理程序,我会从 JavaScript 假设。但是我一直无法找到轮询信息的方法。我希望找到解决这个问题的方法。

感谢您提供任何可以分享的想法。

6个回答

这将是一个非常非常 哈克做到这样......但将这项工作?

  • 照常放链接...
  • 但是附加一个 onclick 处理程序,它设置一个计时器并为窗口添加一个 onblur 处理程序
  • (理论上)如果浏览器处理链接(应用程序 X)将加载从窗口窃取焦点......
  • 如果 onblur 事件触发,请清除计时器...
  • 否则在 3-5 秒后让您的超时触发...并通知用户“嗯,看起来您没有安装 Mega Uber Cool 应用程序...您想现在安装它吗?(好的)(取消)”

远非防弹......但它可能有帮助吗?

对于 Chrome 来说,这是一个不错的解决方案,因为它没有任何类型的协议错误处理。这已与此处其他浏览器的检测结合使用:rajeshsegu.com/2012/09/browser-detect-custom-protocols/...
2021-03-17 01:43:49
协议检测最近一直是一个令人头疼的问题。;) 上面的方法似乎有点工作......使用rajesh 's live example在rajeshsegu.com/fun/code/browser/detect.html上找到我在Chrome中获得“真实”。但是,如果我重构以便没有 results() 函数(它反过来使用一个警报框 - 一个阻塞调用)并让它只返回一个布尔值,我就会得到错误。我以某种方式感觉到阻塞警报也是一种以某种方式强制计时的hacky方式......任何见解,@scunliffe?
2021-03-24 01:43:49
在 Mac 上的 Firefox(可能有更多浏览器)中,即使使用自定义协议的应用程序无法启动,窗口也会失去焦点并触发 onblur。
2021-03-28 01:43:49
:D 这是一个聪明的主意。似乎会有一种方法,因为它似乎是一种普遍的需求。
2021-03-31 01:43:49
对于那些正在寻找不再可用的 rajeshsegu 页面的人,我使用 archive.org 获取源代码并将其导入到 jsfiddle 中:jsfiddle.net/stefansundin/0uca4h2o
2021-04-01 01:43:49

没有很好的跨浏览器方式来做到这一点。在 Win8+ 上的 IE10+ 中,新的msLaunchUriapi 使您能够启动协议,如下所示:

navigator.msLaunchUri('skype:123456', 
  function() 
  { 
    alert('success');
  }, 
  function()
  {
    alert('failed');
  } 
); 

如果未安装该协议,则会触发失败回调。否则,协议将启动并触发成功回调。

我在这里进一步讨论这个话题:https : //web.archive.org/web/20180308105244/https : //blogs.msdn.microsoft.com/ieinternals/2011/07/13/understanding-protocols/

这个话题是最近(2021)感兴趣的;请参阅https://github.com/fingerprintjs/external-protocol-flooding进行讨论。

链接已死。
2021-03-12 01:43:49
它不起作用 - 在 Windows 7、IE 浏览器中测试
2021-03-23 01:43:49
msLaunchUri 仅适用于 Windows 8+。
2021-04-10 01:43:49

HTML5 定义了自定义方案和内容处理程序(据我所知,到目前为止,Firefox 是唯一的实现者),但不幸的是,目前没有办法检查处理程序是否已经存在——它已被提出,但没有后续行动。这似乎是有效使用自定义处理程序的关键功能,我们作为开发人员应该注意这个问题以实现它。

似乎没有直接的方法通过 javascript 来检测已安装的已注册协议处理程序的应用程序的存在。

在 iTunes 模型中,Apple 为其服务器提供 url,然后这些服务器提供运行一些 javascript 的页面:

http://ax.itunes.apple.com/detection/itmsCheck.js

因此,iTunes 安装程序显然为主要浏览器部署了插件,然后可以检测到它们的存在。

如果您的插件已安装,那么您可以合理地确定重定向到特定于应用程序的 url 会成功。

这应该是最可靠的解决方案。但我的意思是你需要为大多数浏览器安装并创建一个插件,这有点棘手。我可以更友好地将用户重定向到下载页面。
2021-03-16 01:43:49
为什么不使用这里提到的 FireBreath?stackoverflow.com/a/14758085/427793
2021-04-08 01:43:49

最简单的解决方案是第一次询问用户。

每个示例使用 Javascript 确认对话框:

You need this software to be able to read this link. Did you install it ?

if yes: create a cookie to not ask next time; return false and the link applies
if false: window.location.href = '/downloadpage/'
我认为vscode使用这种方法,检查他们的网站marketplace.visualstudio.com
2021-03-12 01:43:49
饼干可以每天取出干净。有没有更好的方法可以制作基于 Flash 的 cookie?
2021-03-19 01:43:49
好吧,如果 cookie 被删除,用户将再次被提示。
2021-04-07 01:43:49