Javascript Safari 12.1中是否更改了跨域iframe mic权限?
Safari 12.1似乎已停止记住跨域iFrame的getUserMedia(本例中为麦克风)权限 给出两个站点的简化示例: 域A: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
<!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中请求权限,则枚举设备
不会返回有效的设备名称。因此,一个完整的解决方法(如果需要枚举)是有两个权限提示:
你找到解决办法了吗?我也遇到了同样的问题。我为这个Hello RYFN填充了WebKit bug,你找到解决这个问题的方法了吗?@Dean nope,我们放弃了对Safari的支持(不幸的是,问题是关于“跨域iframe”,这在那里不起作用。Kaido是正确的,此解决方案仅在iframe不从另一个来源加载资源时起作用,但是这对您希望在单独的iframe中运行的沙盒小部件起作用。