У меня есть приложение, где пользователи могут воспроизводить видео в полноэкранном режиме.Это достигается просто с помощью AVPlayerViewController
.
Это прекрасно работает, но в обстоятельствах, когда пользователь, скажем, слушает подкаст, если он нажимает на видео для просмотра, он приостанавливает подкаст, так что пользователь может смотреть видео, но когдаЯ закрываю видео, которое, как я ожидаю, возобновит подкаст.Это поведение в большинстве приложений, я подтвердил это, например, в Twitter и Tweetbot.Как ни странно, приведенный ниже код работает для Apple Podcasts (он возобновит возобновление), но не для других, и другие приложения, такие как вышеупомянутый Tweetbot, работают универсально.
Мне совершенно не повезло, получив этоработать сам, однако.
Вещи, которые я пробовал:
- Просто представить
AVPlayerViewController
с минимальным количеством необходимого кода: не возобновляется. - Вкл
viewDidDisappear
AVPlayerViewController
вызов AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
: не возобновляется и выдает ошибку «игрок занят». - Хорошо, давайте попробуем остановить игрока вручную с помощью
player?.pause()
в viewDidDisappear
: hasn 't возобновляет, все еще выдает ошибку «игрок занят». - Хмм, может быть, дать ему секунду?Попробуйте позвонить
setActive
через DispatchQueue.main.asyncAfter
из 1 секунды?Нет ошибок, но не возобновляется.
Я поместил его в тестовый проект с очень небольшим количеством кода:
import UIKit
import AVKit
import AVFoundation
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let button = UIButton(type: .system)
button.addTarget(self, action: #selector(buttoned(sender:)), for: .touchUpInside)
button.setTitle("Tap here to view video", for: .normal)
button.titleLabel?.font = UIFont.systemFont(ofSize: 19.0)
button.frame = view.bounds
view.addSubview(button)
}
@objc private func buttoned(sender: UIButton) {
let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
let player = AVPlayer(url: videoURL!)
let playerViewController = CustomVideoController()
playerViewController.player = player
self.present(playerViewController, animated: true) {
playerViewController.player?.play()
}
}
}
class CustomVideoController: AVPlayerViewController {
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
do {
try AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
} catch {
print(error)
}
}
}
Вот полный компилируемыйпроект (буквально только приведенный выше код): https://drive.google.com/file/d/1oWb-bNIQv5B1KjMkez6BxuEIh_n6eFxH/view
Воспроизведите что-нибудь из Apple Music, Spotify, Overcast и т. д., затем запустите приложение и нажмите просмотр видео.
Я вродесхожу с ума, пытаясь понять эту относительно тривиальную вещь, поскольку я уверен, что просто делаю что-то невероятно глупое, но любая помощь будет принята с благодарностью.