斯威夫特处理从睡眠中唤醒并恢复游戏?

时间:2016-11-01 01:37:03

标签: swift swift3 tvos apple-tv avplayerviewcontroller

我在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()
}

1 个答案:

答案 0 :(得分:0)

我对iOS iPhone应用程序有同样的问题,我认为该解决方案可能会对您有所帮助。我正在使用AVPlayerViewController在推送​​的视图控制器中显示视频。当全屏播放视频并且应用程序被发送到睡眠状态时,除非您退出应用程序,否则视频永远无法恢复播放。所以这实际上和你有同样的问题。

不幸的是,解决方案涉及在AVPlayerViewController上调用私有函数,因为没有其他方法可以以我知道的任何其他方式退出全屏模式。我的AppDelegate包含播放器视图控制器的实例,当App重新启动活动模式时,会调用以下代码:

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开发者论坛上的this thread