AVPictureInPictureController实现画中画退后台消失但音频正常求助
解决AVPictureInPictureController后台画中画视图消失问题
我之前也碰到过一模一样的问题,折腾了好一阵才找到几个关键的修复点,分享给你试试:
1. 确保画中画在后台前完成激活
别等应用完全进入后台再触发画中画,最好在applicationDidEnterBackground(_:)里主动检查状态并启动,而且一定要在主线程执行:
func applicationDidEnterBackground(_ application: UIApplication) { DispatchQueue.main.async { guard let pipController = yourPIPController, !pipController.isPictureInPictureActive else { return } do { try pipController.startPictureInPicture() } catch { print("启动画中画失败: \(error.localizedDescription)") } } }
要是你是在某个ViewController里管理画中画,也可以在viewWillDisappear(_:)里提前触发激活,避免后台时系统拦截。
2. 锁死AVPlayer和AVPlayerItem的生命周期
画中画的视图消失但音频还在,大概率是播放器实例被意外释放了!别把AVPlayer或者AVPlayerItem放在只会前台存活的ViewController里,建议用单例或者全局强引用持有。另外还要监听播放器状态,避免后台出现异常:
// 监听PlayerItem状态 playerItem.addObserver(self, forKeyPath: "status", options: [.old, .new], context: nil) override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { guard keyPath == "status", let item = object as? AVPlayerItem else { return } if item.status == .failed { print("播放器异常: \(item.error?.localizedDescription ?? "未知错误")") // 这里可以尝试重置画中画或者重新加载资源 } }
3. 再核对一遍音频会话的细节
虽然你说已经配置了,但还是要确认这几个点:
- 音频会话类别必须是
.playback,模式用.moviePlayback更适配视频场景:
let audioSession = AVAudioSession.sharedInstance() do { try audioSession.setCategory(.playback, mode: .moviePlayback) try audioSession.setActive(true) } catch { print("音频会话配置失败: \(error.localizedDescription)") }
- 检查有没有第三方SDK在后台偷偷修改音频会话权限,比如某些语音类SDK可能会抢占会话,导致画中画视图异常。
4. 检查画中画代理的实现
别在代理方法里做销毁画中画视图的操作,比如pictureInPictureControllerWillStopPictureInPicture(_:)里不要直接把控制器置为nil。另外pictureInPictureController(_:restoreUserInterfaceForPictureInPictureStopWithCompletionHandler:)方法要正确处理恢复逻辑,别让系统误以为画中画已经终止。
5. 测试iOS版本兼容性
有些iOS小版本(比如iOS 14.2、15.1)存在画中画后台显示的bug,如果是特定版本才出现的问题,可以提交雷达给苹果,同时做版本适配的兼容处理。
内容的提问来源于stack exchange,提问作者Bart Jacobs
相关产品推荐
相关产品推荐

