Быстрая обработка пробуждения от сна и возобновления игры?

У меня есть приложение на tvOS, которое воспроизводит потоковое аудио, используя расширение AVPlayerViewController. Это отлично работает, даже когда идет фон. Проблема в том, что когда AppleTV переходит в спящий режим, а когда просыпается, проигрыватель зависает, и только принудительный выход из приложения позволит мне снова начать играть.

Есть ли событие, которое мое приложение должно обработать, чтобы возобновить игру должным образом? Что я должен искать в документации?

Основной код:

override func viewDidLoad() {
    super.viewDidLoad()

    // loading details fron plist
    if let stationInfo = readStationSettings() {
        stationUrl = stationInfo["url"] as? String
        stationName = stationInfo["name"] as? String
        stationDescription = stationInfo["description"] as? String
        stationImage = stationInfo["image"] as? UIImage
    } else {
        trackTitle = "Unable to find station details"
        return
    }

    let videoURL = URL(string: stationUrl!)

    do {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
        try AVAudioSession.sharedInstance().setActive(true, with: .notifyOthersOnDeactivation)
    } catch let error as NSError {
        print(error.localizedDescription)
    }

    playerItem = AVPlayerItem(url: videoURL!)

    self.player=AVPlayer(playerItem: playerItem!)

    playerLayer=AVPlayerLayer(player: player)

    self.player?.play()
}

person Andre M    schedule 01.11.2016    source источник
comment
Да, пожалуйста, добавьте код.   -  person Roman Podymov    schedule 07.11.2016
comment
@RomanPodymov Я обновил вопрос   -  person Andre M    schedule 11.11.2016


Ответы (1)


У меня была такая же проблема с приложением iOS для iPhone, и я думаю, что решение может вам помочь. Я использую AVPlayerViewController для представления видео в нажатом контроллере представления. Когда видео воспроизводится в полноэкранном режиме и приложение переходит в спящий режим, воспроизведение видео не может возобновиться, пока вы не выйдете из приложения. Так что это на самом деле та же проблема, что и у вас.

К сожалению, решение включает в себя вызов частной функции на AVPlayerViewController, поскольку нет другого способа выйти из полноэкранного режима каким-либо другим известным мне способом. My AppDelegate содержит экземпляр контроллера представления проигрывателя, и когда приложение выходит из активного режима, вызывается следующий код:

let appDelegate = UIApplication.getAppDelegate()
if let player = appDelegate.playerController.player {
    if let cl = NSClassFromString("AVFullScreenViewController") {
        for window in UIApplication.sharedApplication().windows {
            if let pvc = window.rootViewController?.presentedViewController {
                if pvc.isKindOfClass(cl) {
                    let dSel = NSSelectorFromString("exitFullScreenAnimated:completionHandler:")
                    if appDelegate.playerController.respondsToSelector(dSel) {
                        appDelegate.playerController.performSelector(dSel, withObject: false, withObject: nil)
                    }
                    break
                }
            }
        }
    }

    player.pause()
    appDelegate.playerController.player = nil
    appDelegate.playerController.removeFromParentViewController()
    appDelegate.playerController.navigationController?.popViewControllerAnimated(false)
}

Этот код работает в Swift 2.3, поэтому вам может потребоваться адаптировать его к другим версиям Swift или Objective C. Имейте в виду, что это связано с вызовом частного API, что является рискованным делом. Во всяком случае, я надеюсь, что это поможет.

См. также эту тему на форуме разработчиков Apple.

person mjrehder    schedule 09.11.2016