import AVKit import Foundation final class PiPDelegate: NSObject, AVPictureInPictureControllerDelegate { var player: PlayerModel! func pictureInPictureController( _: AVPictureInPictureController, failedToStartPictureInPictureWithError error: Error ) { print(error.localizedDescription) } func pictureInPictureControllerWillStartPictureInPicture(_: AVPictureInPictureController) {} func pictureInPictureControllerDidStartPictureInPicture(_: AVPictureInPictureController) { player?.playingInPictureInPicture = true player?.avPlayerBackend.startPictureInPictureOnPlay = false } func pictureInPictureControllerDidStopPictureInPicture(_: AVPictureInPictureController) { guard let player = player else { return } if player.avPlayerBackend.switchToMPVOnPipClose, !player.currentItem.isNil { DispatchQueue.main.async { player.avPlayerBackend.switchToMPVOnPipClose = false player.saveTime { player.changeActiveBackend(from: .appleAVPlayer, to: .mpv) } } } player.playingInPictureInPicture = false } func pictureInPictureControllerWillStopPictureInPicture(_: AVPictureInPictureController) {} func pictureInPictureController( _: AVPictureInPictureController, restoreUserInterfaceForPictureInPictureStopWithCompletionHandler completionHandler: @escaping (Bool) -> Void ) { var delay = 0.0 #if os(iOS) if player.currentItem.isNil { delay = 0.5 } #endif if !player.currentItem.isNil, !player.musicMode { player?.show() } DispatchQueue.main.asyncAfter(deadline: .now() + delay) { completionHandler(true) } } }