В Safari 12.1 изменены разрешения междоменного микрофонного микрофона? - PullRequest
2 голосов
/ 04 апреля 2019

Safari 12.1, похоже, перестал запоминать разрешения 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>

Домен 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 несколько раз в проектепредназначен для встраивания в разные сайты, поэтому это оказывает значительное влияние на пользовательский опыт) * ​​1019 *

1 Ответ

0 голосов
/ 12 июня 2019

Я не могу ответить относительно того, что конкретно происходит с поставщиками браузеров, которые делают iframe getUserMedia запрашивает повторную репликацию для разрешения каждый раз, когда запрашивается поток мультимедиа, но мы нашли решение использовать одиночный родительский объект mediaDevices для запроса запроса.stream.

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

    return getRootWindow(window.parent);
}

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

Мы проверили это на iOS, FF, Chrome, Safari и все работает нормально, как только были предоставлены разрешения, последующие запросы на мультимедийное устройство работают нормально.Что-то при вызове этого из DOM iFrames заставляет его выдавать подсказки при каждом запросе.

...