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

Chr*_*aft 77 javascript browser protocols moniker

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

http://

mailto://

custom://

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

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

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

感谢您提供的任何想法.

scu*_*ffe 32

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

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

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

  • 在Mac上的Firefox(可能是更多浏览器)中,即使带有自定义协议的应用程序无法启动,窗口也会失去焦点并触发模糊处理。 (2认同)
  • 对于那些寻找不再可用的 rajeshsegu 页面的人,我使用 archive.org 获取源代码并将其导入到此处的 jsfiddle 中:https://jsfiddle.net/stefansundin/0uca4h2o/ (2认同)

Eri*_*Law 17

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

navigator.msLaunchUri('skype:123456', 
  function() 
  { 
    alert('success');
  }, 
  function()
  {
    alert('failed');
  } 
); 
Run Code Online (Sandbox Code Playgroud)

如果未安装协议,则将触发故障回调.否则,协议将启动,并且将触发成功回调.

我在这里进一步讨论这个主题:http: //blogs.msdn.com/b/ieinternals/archive/2011/07/14/url-protocols-application-protocols-and-asynchronous-pluggable-protocols-oh-my的.aspx

  • msLaunchUri仅适用于Windows 8+. (6认同)

Hug*_*ney 16

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


jto*_*son 13

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

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

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

因此,iTunes安装程序显然会为主要浏览器部署插件,然后可以检测其存在.

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

  • 这应该是最可靠的解决方案.但我的意思是你需要安装并为大多数浏览器创建一个插件,这有点棘手.我可以更友好地将用户重定向到下载页面. (2认同)

Dav*_*ith 13

您可以使用嵌入式iframe在自定义协议和已知协议(Web或应用商店)之间自动切换,请参阅https://gist.github.com/2662899

  • 问题不在于iOS或Android. (3认同)

Nat*_*tim 10

什么接缝最简单的解决方案是第一次询问用户.

每个示例使用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/'
Run Code Online (Sandbox Code Playgroud)

  • 饼干可以每天取出干净。有没有更好的方法可以制作基于 Flash 的 cookie? (2认同)

hab*_*bsq 6

我基于自定义协议处理程序将触发一个新窗口将焦点从浏览器中取出的假设,为此问题创建了一个通用库.

https://github.com/ismailhabib/custom-protocol-detection


qua*_*ano 5

如果您可以控制正在尝试运行的程序(代码),那么查看用户是否成功运行应用程序的一种方法是:

  1. 试图打开自定义的协议之前,请一个AJAX请求到服务器脚本,节省用户的意图在数据库(例如,保存用户名和他想做的事).

  2. 尝试打开程序,并传递意图数据.

  3. 让程序向服务器发出请求以删除数据库条目(使用intent数据查找正确的行).

  4. 让javascript轮询服务器一段时间,看看数据库条目是否已经消失.如果条目消失,您将知道用户成功打开了应用程序,否则该条目将保留(您可以稍后使用cronjob将其删除).

我没有尝试过这种方法,只是想到了.