我创建了一个自定义 URL 协议处理程序。
http://
mailto://
custom://
我已经注册了一个 WinForms 应用程序来做出相应的响应。这一切都很好。
但我希望能够优雅地处理用户尚未安装自定义 URL 协议处理程序的情况。
为了能够做到这一点,我需要能够检测浏览器的注册协议处理程序,我会从 JavaScript 假设。但是我一直无法找到轮询信息的方法。我希望找到解决这个问题的方法。
感谢您提供任何可以分享的想法。
我创建了一个自定义 URL 协议处理程序。
http://
mailto://
custom://
我已经注册了一个 WinForms 应用程序来做出相应的响应。这一切都很好。
但我希望能够优雅地处理用户尚未安装自定义 URL 协议处理程序的情况。
为了能够做到这一点,我需要能够检测浏览器的注册协议处理程序,我会从 JavaScript 假设。但是我一直无法找到轮询信息的方法。我希望找到解决这个问题的方法。
感谢您提供任何可以分享的想法。
这将是一个非常,非常 哈克做到这样......但将这项工作?
远非防弹......但它可能有帮助吗?
没有很好的跨浏览器方式来做到这一点。在 Win8+ 上的 IE10+ 中,新的msLaunchUri
api 使您能够启动协议,如下所示:
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进行讨论。
HTML5 定义了自定义方案和内容处理程序(据我所知,到目前为止,Firefox 是唯一的实现者),但不幸的是,目前没有办法检查处理程序是否已经存在——它已被提出,但没有后续行动。这似乎是有效使用自定义处理程序的关键功能,我们作为开发人员应该注意这个问题以实现它。
似乎没有直接的方法通过 javascript 来检测已安装的已注册协议处理程序的应用程序的存在。
在 iTunes 模型中,Apple 为其服务器提供 url,然后这些服务器提供运行一些 javascript 的页面:
http://ax.itunes.apple.com/detection/itmsCheck.js
因此,iTunes 安装程序显然为主要浏览器部署了插件,然后可以检测到它们的存在。
如果您的插件已安装,那么您可以合理地确定重定向到特定于应用程序的 url 会成功。
最简单的解决方案是第一次询问用户。
每个示例使用 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/'