首页 > 解决方案 > Safari 14.0.3 getUserMedia (WebRTC) 权限提示在第一次被禁止后第二次

问题描述

我认为在 Safari 中有一个意外的 getUserMedia 行为,我想知道我是否错过了什么。

在 Chrome/Firefox 中,如果我不允许getUserMedia({audio: true, video: true})每次下一次调用它的第一个提示将失败并出现错误:NotAllowedError: The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.这似乎很好。

但是,在 safari 中,如果我不允许第一个 getUserMedia 调用具有相同约束的第二个调用,则会再次提示,任何其他约束都将因上一个错误而失败。

我在这里创建了一个简单的重现存储库,您可以在每个浏览器上运行它来进行比较(您必须拒绝第一个提示才能重现错误)。奇怪的是,相同的代码每次在jsfiddle上都只适用于 safari,并为其他浏览器保持相同的行为(我猜是由于运行代码的 iframe)

是我重现我的问题的录音,以便更好地理解。

GetUserMedia 调用顺序:

// 1: press "Not allow"
getUserMedia({ video: true, audio: true });

// 2: will prompt again (that's the bug) and press "Allow"
getUserMedia({ video: true, audio: true });

// 3: will fail (that's the expected behaviour)
getUserMedia({ video: true, audio: true });

// 3bis: will fail too (that's the expected behaviour)
getUserMedia({ video: {deviceId: {exact: 'aValidDeviceId' }}, audio: {deviceId: {exact: 'aValidDeviceId' }} });

我错过了什么还是这确实是 safari 的一个错误?

此致

标签: safariwebrtcgetusermedia

解决方案


这里的 Safari 没有任何问题。浏览器是规范眼中的用户代理” ,规范说:

这故意模糊了权限 UI 的细节以及 UA 如何推断用户意图。UA 应该能够在这个框架内探索大量的 UI。

网络上没有单一的权限模型。这是一件好事。

如果您发现自己编写的代码依赖于一个浏览器在权限方面的工作方式,请停止并重新考虑。

任何依赖于 Safari"NotAllowedError"以可预测方式响应的代码,都可能试图对结果进行社会工程设计,或许是为了帮助用户通过单击哪些浏览器按钮来启用您的网站需要正确运行的访问权限。

但是浏览器无法将您的行为与恶意网站的行为区分开来,它们需要一些松弛来保护用户。

因此,对 a 做出反应的正确方法"NotAllowedError"是假设它来自用户。在它来自用户代理的情况下,假设代理是为了其用户的利益行事。

如果您怀疑用户代理有误,请在该特定用户代理上提交错误,以便改进。

权限很棘手。

网络在允许安全浏览未经策划的甚至是恶意网站方面是独一无二的。

浏览器(“用户代理”)是唯一被认为在权限方面符合其用户最大利益的受信任方。不能信任站点来管理它们。

但是浏览器在管理用户权限的方式上有很大的不同。这包括当用户在他们看来受到足够打扰时他们的反应。这是因为尚未找到便利和隐私之间的理想权衡。所以这个领域的差异化和创新是好的,现在钙化还为时过早。

免责声明:权限正在演变

浏览器并不完美。Web 开发人员首当其冲地受到这种不完善和差异化的影响,不能因为希望事情变得更简单而受到指责。毕竟,我们大多数人都在非恶意网站上工作。

因此,有时可能需要围绕某些浏览器进行社会工程(在您提交错误之后)。但是在stackoverflow上,我认为我们首先应该给出“正确”的答案,并将其他所有内容作为解决方法。


推荐阅读