首页 > 解决方案 > OT.Publisher 访问被拒绝:最终用户拒绝访问硬件设备 getUserMedia

问题描述

我正在尝试使用带有 Capacitor + Ionic + Vue.js 的 Open Tok JS SDK 创建实时流,但 iOS 似乎不支持该代码。

[log] - {"code":1500,"message":"OT.Publisher Access Denied: Permission Denied: End-user denied permission to hardware devices (getUserMedia error: NotAllowedError)","name":"OT_USER_MEDIA_ACCESS_DENIED","stack":"C@capacitor://localhost/js/chunk-90ec66da.9f0ce302.js:37:52873\nx@capacitor://localhost/js/chunk-90ec66da.9f0ce302.js:37:53369\ncapacitor://localhost/js/chunk-90ec66da.9f0ce302.js:37:54452\npromiseReactionJob@[native code]","originalMessage":"The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.","originalName":"NotAllowedError"}

来自 XCode 的调试错误屏幕截图

有人解决了这个错误吗?我该如何解决?

标签: javascriptvue.jsionic-frameworkcapacitoropentok

解决方案


基于加密的安全性 getUserMedia() 方法仅在安全上下文中可用。安全上下文是浏览器有理由确信包含使用 HTTPS/TLS 安全加载的文档,并且对不安全上下文的暴露有限。如果文档未在安全上下文中加载,则 navigator.mediaDevices 属性未定义,从而无法访问 getUserMedia()。

在这种情况下尝试访问 getUserMedia() 将导致 TypeError。

文档源安全 由于与 getUserMedia() 相关的明显安全问题,如果意外使用或没有仔细管理安全性,它只能在安全上下文中使用。有许多不安全的方式来加载文档,这些方式可能反过来尝试调用 getUserMedia()。以下是不允许调用 getUserMedia() 的情况示例:

加载到沙盒元素中的文档不能调用 getUserMedia(),除非它的沙盒属性设置为允许同源。使用没有来源的 data:// 或 blob:// URL 加载的文档(例如当用户在地址栏中键入这些 URL 之一时)不能调用 getUserMedia()。这些从 JavaScript 代码加载的 URL 继承了脚本的权限。没有来源的任何其他情况,例如当 srcdoc 属性用于指定框架的内容时。

https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia#security


推荐阅读