iOS webview 退出页面后视频/音频依旧播放的问题

首先在初始化 webview 前先注入网页停止播放音乐的 js 代码。

WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.allowsInlineMediaPlayback = YES;
config.requiresUserActionForMediaPlayback = NO;
    
//js代码
NSString *videos = @"document.getElementsByTagName('video');function pauseVideo(){var len = videos.length;for(var i=0;i<len;i++){videos[i].pause();}};var audios = document.getElementsByTagName('audio');function pauseAudio(){var len = audios.length;for(var i=0;i<len;i++){ audios[i].pause();}}";
// 注入网页停止播放音乐的js代码
WKUserScript *pauseJS = [[WKUserScript alloc]initWithSource:videos injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
    
WKUserContentController *userContent = [[WKUserContentController alloc]init];
[userContent addUserScript:pauseJS];
config.userContentController = userContent;
    
webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:config];
webView.navigationDelegate = self;
[self.view addSubview:webView];

其次在网页已经消失【- (void)viewDidDisappear:(BOOL)animated】的方法中调用 js 代码中的停止播放音乐方法。

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    
    // 解决返回后语音一直播放的问题
    [self pausePlay];
}

/// 暂停播放网页内的音频、视频
- (void)pausePlay {
    [webView evaluateJavaScript:@"pauseVideo()" completionHandler:nil];
    [webView evaluateJavaScript:@"pauseAudio()" completionHandler:nil];
}

另外,使用以下方法也可以解决,但该方法存在弊端,如果网页中调用了相册并选择图片后,页面会变成空白。

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]];
[webView loadRequest:request];

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
如果您关闭了 WebView 的硬件加速,那么您可能需要使用软件渲染来播放视频。您可以使用 Android SDK 提供的 MediaPlayer 类或者 ExoPlayer 库来实现。 使用 MediaPlayer 类播放视频的基本步骤如下: 1. 创建 MediaPlayer 实例。 2. 设置数据源,可以是本地文件或者网络地址。 3. 准备 MediaPlayer。 4. 开始播放。 示例代码如下: ```java MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource("your_video_file_path"); mediaPlayer.prepare(); mediaPlayer.start(); ``` 如果您需要在 WebView播放网络视频,您可以使用 ExoPlayer 库来实现。ExoPlayer 是 Google 推荐的一个用于播放多种媒体格式的开源库,可以轻松地实现视频播放、缓存和跨平台支持等功能。 您需要在 WebView 中注册一个 WebChromeClient,然后在 onShowCustomView 方法中创建一个 View 并将其添加到 WebView 中。在这个 View 中,您可以使用 ExoPlayer 来播放视频。 示例代码如下: ```java private WebView webView; private FrameLayout videoLayout; private View videoView; private SimpleExoPlayer exoPlayer; webView.setWebChromeClient(new WebChromeClient() { @Override public void onShowCustomView(View view, CustomViewCallback callback) { super.onShowCustomView(view, callback); videoView = view; videoLayout.addView(videoView); exoPlayer = new SimpleExoPlayer.Builder(context).build(); exoPlayer.setVideoSurfaceView((SurfaceView) videoView); exoPlayer.setMediaItem(MediaItem.fromUri("your_video_url")); exoPlayer.prepare(); exoPlayer.play(); } @Override public void onHideCustomView() { super.onHideCustomView(); videoLayout.removeView(videoView); exoPlayer.release(); } }); ``` 其中,videoLayout 是一个 FrameLayout,用于将视频 View 添加到 WebView 中。在 onShowCustomView 方法中,我们创建了一个 SurfaceView 并将其设置为 ExoPlayer 的视频 Surface,然后设置要播放的媒体项并准备 ExoPlayer。在 onHideCustomView 方法中,我们从 videoLayout 中移除视频 View 并释放 ExoPlayer。 需要注意的是,如果您关闭了 WebView 的硬件加速,使用软件渲染来播放视频可能会导致性能下降和卡顿等问题。因此,建议您在必要的情况下开启 WebView 的硬件加速,并在播放视频时使用硬件加速。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值