gpt4 book ai didi

javascript - 如何在 WKWebView 中播放音频?

转载 作者:搜寻专家 更新时间:2023-11-01 05:32:25 25 4
gpt4 key购买 nike

我正在制作一个 iOS 应用程序来包装我的 javascript 游戏。在移动 safari 上它工作正常,因为在我在 ontouchstart 中播放声音后,我可以随时播放任何音频,我也可以设置它们的音量。

问题 1:在 WKWebView 中,我只能播放我在 ontouchstart 中播放的特定声音,而不能播放其他声音。所以我会在第一次点击时播放我游戏中的每一个音频。听起来真的很糟糕。否则在 audio.play() 的 javascript 中我得到Unhandled Promise Rejection: NotAllowedError: 当前上下文中用户代理或平台不允许请求,可能是因为用户拒绝了权限。

问题 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.1iPhone SE 12.1.1我也试过在装有 iOS 10 的 iPad 上遇到同样的错误。我也试过 context.decodeAudioData()/context.createBufferSource() 并得到同样的错误。

最佳答案

回复:问题 1,您需要在设置 Web View 配置之前创建配置对象。线路

self.myWebView3.configuration.mediaTypesRequiringUserActionForPlayback = []

会默默地失败。只需创建一个新的 WKWebViewConfiguration 对象,设置其属性,然后创建 Web View :

webView = WKWebView(frame: .zero, configuration: webConfiguration)

关于javascript - 如何在 WKWebView 中播放音频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54510605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com