谷歌浏览器不显示麦克风权限提示

Mos*_*atz 5 permissions google-chrome webrtc getusermedia

我有一个 Web 应用程序,它通过getUserMedia. 我目前有多个子域,像运行此应用程序test.example.comstaging.example.comproduction.example.com等在多数人身上,它工作正常。

在域 ( test) 之一上,我无法使用麦克风。我的代码调用getUserMedia了一个回调,但是这个回调永远不会被执行,浏览器的权限提示也永远不会显示。

我还使用基于 Promise 的新 API 使用开发人员工具控制台重现了此行为:

navigator.mediaDevices.getUserMedia({audio: true, video: false}).then(console.log).catch(console.log)
Run Code Online (Sandbox Code Playgroud)

(是的,我知道它对thenand做同样的事情catch,但在这种情况下无关紧要。)

在工作站点(stage例如)上,这是控制台中的结果:

Promise {<pending>}
MediaStream {id: "RANDOM_CHARS", active: true, onaddtrack: null, onremovetrack: null, onactive: null, …}
Run Code Online (Sandbox Code Playgroud)

在非工作站点上,它只显示Promise {<pending>},但既不then也不catch记录任何内容,因为它永远不会以任何方式解析。

我发现如果我进入站点设置 ( chrome://settings/content/siteDetails?site=https%3A%2F%2Ftest.example.com) 并更改MicrophoneAllow,那么我可以刷新页面并且它可以正常工作。如果我将其改回Ask,我会再次得到相同的行为 - 它不会询问。

这种行为适用于我测试过的任何站点和任何权限 - 将Allowed 权限改回Ask不要求。然而,在这个特定的test站点上,我今天之前从未尝试使用它,所以没有理由将它设置为Allow然后返回Ask来触发该行为。

在所有这些情况下,都按预期navigator.permissions.query({name: "microphone"}).then(console.log)返回PermissionStatus {state: "prompt", onchange: null}

如何让 Chrome 再次提示麦克风许可?

Hyp*_*sis -2

您需要使用 https 协议的有效域名才能让 Chrome 提示权限。