7

我正在实现一个使用 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];
4

3 回答 3

10

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

虽然可能有更好的解决方案

更新:在 iOS 8.3 中修复

于 2014-12-10T20:57:36.410 回答
6

我建议使用 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)
于 2019-10-31T13:39:48.970 回答
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()
    ...
}
于 2020-09-07T08:38:59.410 回答