AVPlayerViewController点击全屏按钮后无法播放,求排查方向
检查AVPlayer实例的强引用情况
若AVPlayer是局部变量或仅被弱引用,切换全屏时可能因实例被释放导致播放引擎失效。要确保AVPlayer被父控制器或全局对象强引用,避免仅在添加子控制器的方法中临时创建。确认子控制器添加流程的完整性
即使调用了addChild,也要确保完成完整的生命周期回调:addChild(playerVC) view.addSubview(playerVC.view) playerVC.view.frame = playerContainer.bounds playerVC.didMove(toParent: self)未正确调用
didMove(toParent:)会导致系统在全屏切换时无法正确管理AVPlayerViewController的视图层级,引发渲染异常。同时避免过度修改AVPlayerViewController的视图层级或约束,保留系统默认的视图管理逻辑。排查音频会话配置冲突
全屏切换时系统会重新处理音频会话,若其他模块修改了音频会话配置(比如错误设置AVAudioSession.Category或未正确激活会话),可能导致音频输出中断,进而引发视频渲染停滞。可以在全屏切换前后打印音频会话状态排查:let session = AVAudioSession.sharedInstance() print(session.category, session.isActive)确保没有多模块同时修改音频会话,避免干扰AVPlayer的会话状态。
检查自定义手势或控制逻辑的冲突
父视图或AVPlayerViewController视图上的自定义手势(如全屏手势、点击手势)可能与系统默认的全屏交互逻辑冲突,导致全屏后控制按钮无响应、播放状态不同步。可以暂时移除所有自定义手势,测试全屏功能是否恢复。验证AVPlayerItem的状态监听逻辑
若对AVPlayerItem添加了状态监听,要检查回调逻辑是否在全屏切换时错误修改了播放状态(比如误触发暂停),或导致AVPlayerItem的status变为.failed。可在全屏切换前后打印相关状态排查:print(player.timeControlStatus, player.currentItem?.status ?? .unknown)
内容的提问来源于stack exchange,提问作者Fattie

