WKWebView嵌入视频释放后仍在播放声音

8
我正在实现一个播放视频文件的服务,使用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];
3个回答

12

您可以加载空白页面 [NSURL URLWithString:@"about:blank"]

不过,可能有更好的解决方案。

更新: 在iOS 8.3中已修复。


5
看起来这个确实有效![_wkWebView loadHTMLString:@"<html/>" baseURL:nil];(这是Objective-C代码,意思是在WKWebView中加载一段空的HTML字符串) - Roman Truba
谢谢,我发现@RomanTruba的评论在viewDidDisappear中调用效果最好。 - Nick
3
问题仍然存在于OSX 10.13.6上,但是似乎使用hack可以解决,谢谢。 - slashlos

7
我建议使用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)

是的,那个愚蠢的问题似乎仍然会在不同版本的iOS上时有时无地出现。不过这是个好的解决方法。 - Roman Truba
像魔术般运作良好,将url设置为nil实际上导致了错误。这个JS脚本完美地填充了我。 - aznelite89

-1
我曾经遇到这样的情况:在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()
    ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接