我正在实施一项使用webview播放视频文件的服务。我从UIWebView迁移到WKWebView,并试图用它播放Youtube和Coub视频。几乎所有东西都没问题,在iOS 8中没有崩溃,但是在WKWebView发布并从屏幕上移除后,视频声音会持续播放一段时间(在某些情况下大约需要45秒)。
我无法找到停止视频声音的方法。我试图通过媒体播放器捕获系统通知,但没有成功。
有没有办法在WKWebView中停止声音或视频?
下一步是WKWebview配置:
//javascript for configurate video viewport (not full screen)
NSString *jScript = [NSString stringWithFormat:@"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=%d, height=%d, initial-scale=1, maximum-scale=1'); document.getElementsByTagName('head')[0].appendChild(meta);", (int)VIEW_WIDTH, (int)VIEW_HEIGHT ];
WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
WKUserContentController *wkUController = [[WKUserContentController alloc] init];
[wkUController addUserScript:wkUScript];
WKWebViewConfiguration *config = [WKWebViewConfiguration new];
config.mediaPlaybackAllowsAirPlay = YES;
config.userContentController = wkUController;
_wkWebView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, VIEW_WIDTH, VIEW_HEIGHT) configuration:config];
[_wkWebView setBackgroundColor:RGB(0x0a0a0a)];
[_wkWebView setNavigationDelegate:self];
[self insertSubview:_wkWebView atIndex:0];
答案 0 :(得分:6)
您可以加载空白页[NSURL URLWithString:@"about:blank"]
虽然可能有更好的解决方案
更新:已在iOS 8.3中修复
答案 1 :(得分:1)
我建议您停止使用JS代码播放视频。 例如
let stopVideoScript = "var videos = document.getElementsByTagName('video'); for( var i = 0; i < videos.length; i++ ){videos.item(i).pause()}"
self.webView.evaluateJavaScript(stopVideoScript, completionHandler:nil)
答案 2 :(得分:0)
我有一个场景,我在WKWebView上播放了一个视频,在视频下方是相关视频的列表。如果您按这些相关视频之一,即使我已经使用正确的链接向webView发出了新的加载请求,主视频播放器也不会重新加载视频。 对我唯一有用的是在加载新视频之前清除所有webView缓存:
private func removeWebViewCache(completion: @escaping () -> ()) {
let dataStore = WKWebsiteDataStore.default()
dataStore.fetchDataRecords(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()) { records in
dataStore.removeData(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes(), for: records, completionHandler: completion)
}
}
然后,您只需先调用此函数,然后在完成后调用新的加载请求,或简单地执行所需的任何其他操作:
self.removeWebViewCache { [weak self] in
guard let self = self else { return }
//self.loadNewVideo()
...
}