AVPictureInPictureController не удается активировать программно во время прокрутки

#ios #swift #swift5 #avkit #picture-in-picture

#iOS #swift #swift5 #avkit #картинка в картинке

Вопрос:

У меня есть видео в ячейке, если я переведу его в режим PIP с помощью кнопки, все работает нормально, но если я сделаю это программно, когда ячейка выходит за пределы экрана, она автоматически не переходит в режим PIP, может просто активировать его с помощью кнопки?

 func scrollViewDidScroll(_ scrollView: UIScrollView) {
    guard let cell = self.playerCell, self.playerController != nil else {
        return
    }
    
    let rect = self.view.convert(cell.frame, from: scrollView)
    if rect.origin.y < 0, self.pipController == nil {
        self.pipController = self.startPictureInPicture()
    }
}

func startPictureInPicture() -> AVPictureInPictureController? {
    guard AVPictureInPictureController.isPictureInPictureSupported() else {
        return nil
    }
    
    let layer = AVPlayerLayer(player: self.playerController.player)
    try? AVAudioSession.sharedInstance().setActive(true)
    if let pipController = AVPictureInPictureController(playerLayer: layer) {
        if pipController.isPictureInPicturePossible {
            pipController.startPictureInPicture()
        } else {
            pipController.addObserver(self, forKeyPath: "isPictureInPicturePossible", options: [.new, .initial], context: nil)
        }
    }
    
    return nil
}

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if keyPath == "isPictureInPicturePossible", let pipController = object as? AVPictureInPictureController, pipController.isPictureInPicturePossible {
        pipController.startPictureInPicture()
    }
}
  

ОБНОВЛЕНИЕ: консоль отладки всегда показывает предупреждение о несбалансированных вызовах для начала / завершения переходов внешнего вида для <UIViewController> . но это я решил с помощью:

 DispatchQueue.main.asyncAfter(deadline: .now()   0.1) {
    pipController.startPictureInPicture()
}
  

Ответ №1:

Согласно рекомендациям Apple, мы не должны запускать режим PIP без действий пользователя.

Воспроизведение изображения в изображении начинается только в ответ на взаимодействие с пользователем и никогда программно. Группа проверки App Store отклоняет приложения, которые не соответствуют этому требованию.

Источник: https://developer.apple.com/documentation/avkit/adopting_picture_in_picture_in_a_custom_player

Я бы посоветовал вам создать свой собственный пользовательский PIP-вид внутри приложения, чтобы избежать отклонения.