如何解决如何在 WKMediaPlaybackState 更改时获得通知
当 webView 的 WKmediaplaybackState 的值发生变化时,如何添加一个运行回调的观察者
当 webView 中的 vimeo 视频暂停时,我正在尝试做一些更改
这是我的代码
@IBOutlet weak var vimeoVideoPlayer: WKWebView!
func buildVimeoVideoPlayer(with video: Video) {
let url = URL(string: "https://player.vimeo.com/video/\(video.id)")!
let requestObj = URLRequest(url: url)
vimeoVideoPlayer.load(requestObj)
vimeoVideoPlayer.contentMode = UIView.ContentMode.scaleAspectFit
vimeoVideoPlayer.configuration.allowsAirPlayFormediaplayback = true
vimeoVideoPlayer.configuration.allowsInlinemediaplayback = true
vimeoVideoPlayer.configuration.allowsPictureInPicturemediaplayback = true
vimeoVideoPlayer.navigationDelegate = self
vimeoVideoPlayer.scrollView.isScrollEnabled = false
vimeoVideoPlayer.requestmediaplaybackState { mediaState in
switch mediaState {
case .paused:
print("the video was Paused")
case .playing:
print("the video is playing")
case .suspended:
print("the video is suspended")
default:
break
}
}
}
目前我正在使用 requestmediaplaybackState 函数,但这只运行一次
解决方法
您可以直接从 java 脚本观察视频播放器的状态,为此您应该将所需的事件侦听器添加到 video
对象,然后通过 webkit.messageHandlers
将状态发布到本机:
webView.configuration.userContentController.add(self,name: "playbackMessageHandler")
let js = """
function onPlaybackState(playbackState) {
const { webkit: { messageHandlers: { playbackMessageHandler } } } = window;
playbackMessageHandler?.postMessage({ playbackState });
};
window.addEventListener('load',(event) => {
const video = document.querySelector('video');
video?.addEventListener('play',(event) => onPlaybackState('playing'));
video?.addEventListener('pause',(event) => onPlaybackState('paused'));
video?.addEventListener('suspend',(event) => onPlaybackState('suspended'));
});
"""
let script = WKUserScript(source: js,injectionTime: .atDocumentEnd,forMainFrameOnly: false)
webView.configuration.userContentController.addUserScript(script)
webView.load(...)
...
extension ViewController: WKScriptMessageHandler {
func userContentController(_ userContentController: WKUserContentController,didReceive message: WKScriptMessage) {
guard let body = message.body as? [String : String],let playbackState = body["playbackState"] else { return }
print(playbackState)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。