我想使用Javascript来确定浏览器是否支持通过http访问网络摄像头(navigator.getUserMedia),如果它不想将用户重定向到https。但是,如果浏览器支持网络摄像头访问而不需要https(例如firefox),我不想将用户重定向到https。我想使用http专门为网站服务。我目前的解决方案是浏览一个浏览器的用户代理la:
var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
我目前的解决方案理论上会崩溃,因为Firefox可能会在接下来的几年内修补对网络摄像头访问的http支持。
Theres是我不愿意在所有浏览器上推送https的原因,此时此刻我不会进入,但是我知道浏览器世界正朝着有朝一日需要https的方向发展。
!!navigator.getUserMedia
这返回真的我在http或https中运行chrome,我想在当前版本的chrome上运行http而不是firefox时产生一个假值,我想这样做的原因而不是用户代理嗅探是因为浏览器补丁支持对http的网络摄像头访问我想让我的代码适应而不需要修补。
简而言之,如何在不查找特定浏览器用户代理的情况下检测支持http视频功能的浏览器?
答案 0 :(得分:2)
以下内容将检测Chrome今天的https行为,但没有提示:
(在Chrome中使用fiddle,因为SO片段中的getUserMedia因某些原因无法在Chrome中运行)
if ('https:' == document.location.protocol) {
console.log("Page is https.");
} else {
navigator.mediaDevices.getUserMedia({video: {width: {min: 2, max: 1}}})
.then(stream => {
log("Detection failed!");
stream.getTracks().forEach(t => t.stop());
})
.catch(e => {
switch (e.name) {
case "NotSupportedError":
case "NotAllowedError":
case "SecurityError":
console.log("getUserMedia in http is disallowed");
break;
case "OverconstrainedError":
default:
console.log("getUserMedia in http is allowed");
break;
}
});
}

这很有效,因为Chrome在今天考虑约束之前,今天在https 中的"NotSupportedError"
失败了。我们传递了不可能的约束,因此在允许http的情况下,我们会失败并使用"OverconstrainedError"
,因此无论如何都没有向用户显示任何提示。
你会注意到我有点对冲,因为" NotSupportedError"根据{{3}},实际上不是有效错误。我认为一旦Chrome更新符合规范,它就会因"SecurityError"
而不是"NotSupportedError"
而失败,但我不确定。它有可能首先考虑约束,在这种情况下,这个测试可能会停止工作。
答案 1 :(得分:0)
我想我找到了一个解决方案,我在safari,firefox和chrome上测试了这个:
if(navigator.mediaDevices){
navigator.mediaDevices.getUserMedia({video:true}).then(function(){
//firefox, chrome in https
alert('success!');
}, function(){
//chrome in http
alert('failure!');
});
} else {
//safari, ie
alert('not supported');
}
然而,这会在运行时弹出一个权限气泡,这是不可取的,我想找到一个解决方案,它不会打扰用户的检测过程。