如何实现退出全屏后UIWebView中YouTube视频继续播放?
解决iOS中YTPlayerView退出全屏后视频继续播放的问题
针对你遇到的iOS 11+下,使用YTPlayerView(基于UIWebView和iframe)播放YouTube视频,退出全屏时视频会被暂停的问题,我提供两个可行的解决方案:
方案一:利用YTPlayerView代理监听全屏状态,退出时恢复播放
这个方案通过官方的代理方法跟踪全屏状态变化,只有在视频原本处于播放状态时,退出全屏后才自动恢复播放,避免误触发。
- 首先让你的视图控制器遵循
YTPlayerViewDelegate协议:
@interface YourViewController () <YTPlayerViewDelegate> @property (nonatomic, assign) YTPlayerState lastPlaybackState; @property (nonatomic, strong) YTPlayerView *playerView; @end
- 在视图初始化时设置代理并加载视频:
- (void)viewDidLoad { [super viewDidLoad]; // 初始化YTPlayerView并添加到视图 self.playerView = [[YTPlayerView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 200)]; self.playerView.delegate = self; [self.view addSubview:self.playerView]; // 配置播放参数,开启内联播放和JS API支持 NSDictionary *playerVars = @{ @"playsinline": @1, @"enablejsapi": @1 }; [self.playerView loadWithVideoId:@"你的视频ID" playerVars:playerVars]; }
- 实现代理方法记录播放状态,并在退出全屏时恢复播放:
// 记录视频最新的播放状态 - (void)playerViewPlaybackStateDidChange:(YTPlayerView *)playerView state:(YTPlayerState)state { self.lastPlaybackState = state; } // 监听全屏状态切换事件 - (void)playerViewDidChangeToFullscreen:(YTPlayerView *)playerView isFullscreen:(BOOL)isFullscreen { // 退出全屏且之前视频处于播放状态时,调用playVideo恢复播放 if (!isFullscreen && self.lastPlaybackState == kYTPlayerStatePlaying) { [playerView playVideo]; } }
方案二:注入自定义JS拦截全屏退出事件
因为YTPlayerView本质是UIWebView包裹YouTube的iframe播放器,我们可以通过注入JavaScript代码,直接修改播放器的全屏退出行为,让它退出时不暂停视频。
- 同样先确保加载视频时开启JS API支持:
NSDictionary *playerVars = @{ @"enablejsapi": @1, @"playsinline": @1 }; [self.playerView loadWithVideoId:@"你的视频ID" playerVars:playerVars];
- 在视频加载完成后注入JS代码:
- (void)playerViewDidBecomeReady:(YTPlayerView *)playerView { // 兼容webkit系和标准全屏事件,退出全屏时自动调用播放 NSString *jsCode = @"var player = document.getElementById('player'); " "var fullscreenEvent = document.fullscreenchange ? 'fullscreenchange' : 'webkitfullscreenchange'; " "player.addEventListener(fullscreenEvent, function(e) { " "if (!document.fullscreenElement && !document.webkitFullscreenElement) { " "player.playVideo(); " "} " "});"; // 在UIWebView中执行自定义JS [playerView.webView stringByEvaluatingJavaScriptFromString:jsCode]; }
额外注意事项
- 记得在Info.plist中设置
UIViewControllerBasedStatusBarAppearance为YES,并确保视图控制器正确处理状态栏样式,避免全屏切换时的UI错乱。 - iOS 11+下,需将UIWebView的
allowsInlineMediaPlayback属性设为YES(也可在Info.plist中添加AllowsInlineMediaPlayback键值为YES),配合playsinline参数让视频支持内联播放。
这两个方案都能解决你遇到的问题:方案一更依赖YTPlayerView官方API,稳定性更好;方案二更直接,通过底层JS控制播放器行为,适合需要更自定义逻辑的场景。
内容的提问来源于stack exchange,提问作者Nicholas
相关产品推荐
相关产品推荐

