Как воспроизвести аудио в WKWebView? - PullRequest
0 голосов
/ 04 февраля 2019

Я создаю приложение для iOS, чтобы обернуть мою игру javascript.В мобильном сафари он работает нормально, потому что после того, как я воспроизведу звук в ontouchstart, мне разрешат воспроизводить любой звук, когда я захочу, и я также могу установить их громкость.

Проблема 1: В WKWebView я могуиграть только те звуки, которые я играл в ontouchstart, а не остальные.Так что я играю каждый звук в моей игре с первого нажатия.Звучит очень плохо.В противном случае в javascript для audio.play () я получаю 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.

Проблема 2: Я также не могу уменьшить громкость звука в WKWebView.Если я установлю myAudio.volume = .5, это мгновенно снова 1.Что означает, что пользователь должен услышать их, чтобы они могли перейти к readyState = 4

Любое хорошее решение или взлом?Прямо сейчас я играю каждый звук при первом нажатии, и все на полную громкость.

<html>
    <body style='bakcground:#DDD;height:333px'>
        <div id=debug style='font-size:20px' onclick="playSound(myAudio)">
            Debug<br />
            Tap here to play the sound.<br />
        </div>
        <script>
            var context = new webkitAudioContext()
            var myAudio = new Audio("sound/upgrade.wav")
            myAudio.addEventListener('canplaythrough', function(){log('canplaythrough1')}, false)
            var myAudio2 = new Audio("sound/dragon.wav")
            myAudio2.addEventListener('canplaythrough', function(){log('canplaythrough2')}, false)

            function playSound(sound)
            {
                log("playSound() readyState="+sound.readyState)
                try{
                    sound.play()
                    context.resume().then(() => {
                                          log("Context resumed")
                                          sound.play()
                                          })
                    }
                catch(e)
                {
                    log(e)
                }
            }

            function log(m)
            {
                console.log(m)
                debug.innerHTML += m+"<br />"
            }

            window.ontouchstart = function()
            {
                log("ontouchstart()")
                playSound(myAudio)
                setTimeout(function() {
                           playSound(myAudio2, 1111)
                           })
            }
        </script>
    </body>
</html>

И ViewController.swift

import UIKit
import WebKit

class ViewController: UIViewController {
    private var myWebView3 : WKWebView!
    override func viewDidLoad() {
        super.viewDidLoad()

        self.myWebView3 = WKWebView(frame: .zero)

        self.myWebView3.configuration.preferences.setValue(true, forKey: "allowFileAccessFromFileURLs")
        self.myWebView3.configuration.mediaTypesRequiringUserActionForPlayback = []
        self.myWebView3.configuration.allowsInlineMediaPlayback = true

        let url = Bundle.main.url(forResource: "index6", withExtension: "html", subdirectory: "/")!
        self.myWebView3.loadFileURL(url, allowingReadAccessTo: url)
        let request = URLRequest(url: url)
        self.myWebView3.load(request)

        self.view.addSubview(self.myWebView3)
    }

    override func viewDidLayoutSubviews() {
        self.myWebView3.frame = self.view.bounds
    }

}

Я использую Xcode 10.1 iPhone SE12.1.1 Я также пробовал iPad с iOS 10 и получаю ту же ошибку.Я также попытался context.decodeAudioData () / context.createBufferSource () и получить ту же ошибку.

1 Ответ

0 голосов
/ 04 февраля 2019

В делегате WKWebView после завершения загрузки веб-просмотра выполните javascript, который addEventListener для аудио и видео тега с событием воспроизведение , пауза , окончен.Затем проверьте состояние воспроизведения для цели.

...