Я создаю приложение для 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 () и получить ту же ошибку.