测试navigator.getUserMedia是否需要https,而不需要浏览器用户代理嗅探

时间:2016-10-17 18:13:01

标签: javascript google-chrome firefox https getusermedia

我想使用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视频功能的浏览器?

2 个答案:

答案 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');
}

然而,这会在运行时弹出一个权限气泡,这是不可取的,我想找到一个解决方案,它不会打扰用户的检测过程。