Safari IOS Audio - отказывается играть с ошибкой - PullRequest
0 голосов
/ 12 сентября 2018

Ошибка JavaScript: Unhandled Promise Rejection: NotAllowedError: The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.

Моя настройка работает в других браузерах, на настольных компьютерах и мобильных устройствах.

Способ работы:

  • естьфлаг first_audio_played = false;
  • добавляет прослушиватель событий касания, который воспроизводит некоторый звук, и устанавливает first_audio_played = true; (затем удаляет прослушиватель касания)
  • все последующие проверки звука if(first_audio_played) some_other_audio.play();

Таким образом, только воспроизводимый звук first требует прямого ввода данных пользователем.после этого все звуки могут свободно запускаться игровыми событиями, временем и т. д. ...

это кажется «правилом» для звука в большинстве браузеров.Является ли iOS «правилом», согласно которому каждый звук должен запускаться при вводе пользователем?или я пропускаю какой-то другой шаг?

Ответы [ 2 ]

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

Вы можете использовать либо [WKWebViewConfiguration setMediaTypesRequiringUserActionForPlayback:WKAudiovisualMediaTypeNone], либо [UIWebView setMediaPlaybackRequiresUserAction:NO], в зависимости от класса WebView (или эквивалент Swift).

0 голосов
/ 08 октября 2018

В моей игре на JavaScript звуки перестали работать на iOS в последнее время. Все они имеют readyState = 4, но работает только тот звук, который я воспроизводил на прослушивании, остальные не будут воспроизводиться. Может быть, вы могли бы воспроизвести все звуки при первом нажатии. Но решение, которое я нашел и которое сейчас работает для меня, заключается в загрузке всех звуков из буферов массива ajax и использовании decodeAudioData (). Затем, как только вы сыграете 1 звук от прикосновения пользователя (не к телу), они все начнут играть всегда.

Вот мой рабочий код, где второй способ сделать это снизу. Когда я нажимаю, чтобы воспроизвести звук2, звук1 также начинает работать.

<html>
    <body>
        <div id=all style='font-size:160%;background:#DDD' onclick="log('clicked');playSound(myAudio)">
            Sound1 should be playing every couple seconds.
            <br />Tap here to play sound1.
        </div>
        <div id=debug style='font-size:120%;' onclick="playSound(myAudio2)">
            Tap here to play the sound2.
        </div>
        <script>
            var url = "http://curtastic.com/drum.wav"
            var url2 = "http://curtastic.com/gold.wav"
            var myAudio, myAudio2
            if(0)
            {
                var playSound = function(sound)
                {
                    log("playSound() readyState="+sound.readyState)
                    log("gold readyState="+myAudio2.readyState)
                    sound.play()
                }

                var loadSound = function(url, callback)
                {
                    var audio = new Audio(url)
                    audio.addEventListener('canplaythrough', function()
                    {
                        log('canplaythrough');
                        if(callback)
                            callback()
                    }, false)

                    audio.load()
                    if(audio.readyState > 3)
                    {
                        log('audio.readyState > 3');
                        if(callback)
                            callback()
                    }
                    return audio
                }

                myAudio = loadSound(url, startInterval)
                myAudio2 = loadSound(url2)
            }
            else
            {
                var playSound = function(sound)
                {
                    log("playSound()")
                    var source = audioContext.createBufferSource()
                    if(source)
                    {
                        source.buffer = sound
                        if(!source.start)
                            source.start = source.noteOn

                        if(source.start)
                        {
                            var gain = audioContext.createGain()
                            source.connect(gain)
                            gain.connect(audioContext.destination)

                            source.start()
                        }
                    }
                }

                var loadSound = function(url, callback)
                {
                    log("start loading sound "+url)

                    var ajax = new XMLHttpRequest()
                    ajax.open("GET", url, true)
                    ajax.responseType = "arraybuffer"
                    ajax.onload = function()
                    {
                        audioContext.decodeAudioData(
                            ajax.response,
                            function(buffer)
                            {
                                log("loaded sound "+url)
                                log(buffer)
                                callback(buffer)
                            },
                            function(error)
                            {
                                log(error)
                            }
                        )

                    }
                    ajax.send()
                }

                var AudioContext = window.AudioContext || window.webkitAudioContext
                var audioContext = new AudioContext()

                loadSound(url, function(r) {myAudio = r; startInterval()})
                loadSound(url2, function(r) {myAudio2 = r})
            }

            function startInterval()
            {
                log("startInterval()")
                setInterval(function()
                {
                    playSound(myAudio)
                }, 2000)
            }

            function log(m)
            {
                console.log(m)
                debug.innerHTML += m+"<br />"
            }
        </script>
    </body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...