Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Safari 12.1中是否更改了跨域iframe mic权限?_Javascript_Html_Safari_Getusermedia - Fatal编程技术网

Javascript Safari 12.1中是否更改了跨域iframe mic权限?

Javascript Safari 12.1中是否更改了跨域iframe mic权限?,javascript,html,safari,getusermedia,Javascript,Html,Safari,Getusermedia,Safari 12.1似乎已停止记住跨域iFrame的getUserMedia(本例中为麦克风)权限 给出两个站点的简化示例: 域A: <!DOCTYPE html> <html> <head></head> <body> <button onclick="triggerUserMedia()">Get User Media</button> <scrip

Safari 12.1似乎已停止记住跨域iFrame的getUserMedia(本例中为麦克风)权限

给出两个站点的简化示例:

域A:

<!DOCTYPE html>
<html>
    <head></head>
    <body>

        <button onclick="triggerUserMedia()">Get User Media</button>

        <script>
            function triggerUserMedia(){
                const constraints = { audio: true, video: false };
                navigator.mediaDevices.getUserMedia(constraints)
                .then(function(stream) {
                    console.log('got stream');
                })
                .catch(function(err) {
                    console.log('couldn\'t get the stream');
                });
            }
        </script>
    </body>
</html>

获取用户媒体
函数triggerUserMedia(){
常量约束={audio:true,video:false};
navigator.mediaDevices.getUserMedia(约束)
.then(函数(流){
log('got stream');
})
.catch(函数(err){
log('无法获取流');
});
}
域B:

<!DOCTYPE html>
<html style="height:100%">
    <head></head>
    <body>
        <iframe src="https://domain-a/index.html" allow="microphone"></iframe>
    </body>
</html>

在Safari 12.1之前的版本和当前的Chrome等版本中,当嵌入域B时,多次按下按钮将导致一次“允许”域A“使用您的麦克风?”,只需第一次按下

但是,现在每次按下按钮都会弹出一个权限窗口

有人知道Safari 12.1中的具体变化是什么导致了这种行为的变化吗?(这是新的webkit安全限制吗?)

我们可以做些什么来确保像以前一样只请求一次许可


(在一个计划嵌入不同站点的项目中,我们多次调用getUserMedia,因此这会对用户体验造成重大影响)

我无法回答浏览器供应商在每次请求媒体流时都会对iframe getUserMedia请求重新申请许可的具体情况,但是我们发现解决方案是使用父mediaDevices单例请求流

function getRootWindow(window) {
    if (window.parent === window) {
        return window;
    }

    return getRootWindow(window.parent);
}

getRootWindow(window).navigator.mediaDevices.getUserMedia().then(...);

我们已经在iOS、FF、Chrome、Safari上对此进行了测试,一旦授予了对媒体设备的后续请求的权限,它就可以正常工作。从iFrames DOM调用它会导致它发出每个请求的提示。

即使对于同一个域iframe,我也会看到同样的问题-只需从iframe内部请求
getUserMedia
总是请求权限

我想出了一个丑陋的解决方法,即使是跨域的:如果你至少一次在“主机”页面上请求许可,它将在iframe内部开始工作。它要求您有一些“主机页”脚本,可以与iframe通信(通过窗口消息避免跨域问题),但它可以工作

即使使用我的变通方法,另一个奇怪的行为是,如果先在主机页上请求权限,然后在iframe中请求权限,则
枚举设备
不会返回有效的设备名称。因此,一个完整的解决方法(如果需要枚举)是有两个权限提示:

  • 首先询问iframe内部(这将确保枚举有效)
  • 然后在主机页上(这将确保Safari记住权限,并且不会显示下一次调用的提示)

  • 你找到解决办法了吗?我也遇到了同样的问题。我为这个Hello RYFN填充了WebKit bug,你找到解决这个问题的方法了吗?@Dean nope,我们放弃了对Safari的支持(不幸的是,问题是关于“跨域iframe”,这在那里不起作用。Kaido是正确的,此解决方案仅在iframe不从另一个来源加载资源时起作用,但是这对您希望在单独的iframe中运行的沙盒小部件起作用。