wkwebview播放html音频会报错:Required client entitlement is missing

时间:2021-04-22 10:11:23

标签: audio wkwebview

wkwebview 播放 h5 音频或视频元素时报错:Error Acquisition assertion: , NSLocalizedFailureReason=缺少所需的客户端权限}> 那么webview的性能就会变得很差,任何元素点击都没有反应。这个问题已经影响了我们几万用户。目前的解决方案是调用客户端方法播放音频。如何从根本上解决问题?< /p>

1.我的 HTML 文件中有一个音频元素和一个按钮按钮。点击按钮播放音频。

<body>
        <button onclick="handleClick()">PLAY</button>
        <audio id="audio" src="https://ac-dev.oss-cn-hangzhou.aliyuncs.com/test-2022-music.mp3"></audio>
        <script>
   
            function handleClick() {
                document.getElementById("audio").play();
            }
        </script>
</body>

2.在我的演示APP中创建一个wkwebview来加载html文件。

class ViewController: UIViewController , WKUIDelegate{

    var webView: WKWebView!
    override func loadView() {
        let config = WKWebViewConfiguration()
        config.preferences.javaScriptEnabled = true
        config.allowsInlineMediaPlayback = true
        webView = WKWebView(frame: .zero, configuration: config)  //.zero
        webView.uiDelegate = self
        
        view = webView
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        let myURL = URL(string: "https://ac-dev.oss-cn-hangzhou.aliyuncs.com/test-2022-py.html")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }
}

3.点击HTML中的按钮播放音频,可以在xcode上看到错误报告。

iPadN[2133:855729] [assertion] Error acquiring assertion: <Error Domain=RBSAssertionErrorDomain Code=3 "Required client entitlement is missing" UserInfo={RBSAssertionAttribute=<RBSDomainAttribute| domain:"com.apple.webkit" name:"MediaPlayback" sourceEnvironment:"(null)">, NSLocalizedFailureReason=Required client entitlement is missing}>

4.综上所述,在HTML中播放音频或视频时会出现此错误。那么app性能会下降很多,交互响应会很慢。

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题。我的计划是将 new Audio(...) 与作为对象 url 存储在存储中的资产或 blob 一起使用。它适用于资产,但不适用于以字符串形式存储在存储中的 blob ......但仅在设备上,就像您提到的那样。

我用以下策略解决了它(对于不工作的部分,在我的情况下它是所有类型脚本,但可以直接在java脚本中完成):

  • 创建一个``AudioContext```
  • 使用 ``FileReader``` 从我的 blob/字符串创建 ArrayBuffer
  • 解码音频数据 (await context.decodeAudioData(arrayBuffer, (buffer) => {...}))
  • 在音频上下文的目的地播放声音:
const source = context.createBufferSource();
source.buffer = buffer;
source.connect(context.destination);
source.start(0)
  • 如果需要,最后清理东西
source.onended = async(): Promise<void> => {
 source.disconnect();
 await context.close();
}
相关问题