从前台导航到后台时如何暂停和播放背景视频?
How do I pause and play background video when navigating from foreground to background?
我在启动我的应用程序时播放背景视频。如果我碰巧按下主页按钮,我希望视频暂停并从中断处继续播放。这是我的代码:
class ViewController: UIViewController
{
let moviePlayerController = AVPlayerViewController()
var aPlayer = AVPlayer()
func playBackgroundMovie()
{
if let url = NSBundle.mainBundle().URLForResource("IMG_0489", withExtension: "m4v")
{
aPlayer = AVPlayer(URL: url)
}
moviePlayerController.player = aPlayer
moviePlayerController.view.frame = view.frame
moviePlayerController.view.sizeToFit()
moviePlayerController.videoGravity = AVLayerVideoGravityResizeAspect
moviePlayerController.showsPlaybackControls = false
aPlayer.play()
view.insertSubview(moviePlayerController.view, atIndex: 0)
}
func didPlayToEndTime()
{
aPlayer.seekToTime(CMTimeMakeWithSeconds(0, 1))
aPlayer.play()
}
override func viewDidLoad()
{
// Do any additional setup after loading the view, typically from a nib.
super.viewDidLoad()
playBackgroundMovie()
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.didPlayToEndTime), name: AVPlayerItemDidPlayToEndTimeNotification, object: nil)
}
我必须在应用委托中执行某些操作吗?我看了以前的视频,但我认为其中一些视频使用的是 swift 的过时版本。或者对我来说有点太混乱了。
是的,所有特定于应用程序的操作都发生在您的 appdelegate 协议中。将暂停代码放入 appdelegate 的 applicationDidEnterBackground
函数中,并将恢复代码放入 applicationWillEnterForeground
.
I would check out Apple's docs on the AppDelegate
protocol,尤其是这两个函数,因为在您的应用程序变为非活动状态之前,您需要多长时间才能完成任务(尽管如果您只是暂停和恢复 AVPlayer
你应该没问题)。
您应该能够通过 NSNotificationCenter 注册一个 backgrounding/foregrounding 通知来播放或暂停您的 aPlayer,如下所示:
let notificationCenter = NSNotificationCenter.defaultCenter()
notificationCenter.addObserver(self, selector: #selector(pauseVideoForBackgrounding), name: UIApplicationDidEnterBackgroundNotification, object: nil)
有几个 UIApplication 通知名称可用,包括 UIApplicationWillEnterForegroundNotification。您可以根据需要利用尽可能多的通知,让您的视频播放器 class 知道应用程序状态发生了什么。
如果您支持 iOS 8 或更低版本,请确保同时从您添加到视图控制器的任何 NSNotifications 中删除您的播放器 class 作为观察者。
我在启动我的应用程序时播放背景视频。如果我碰巧按下主页按钮,我希望视频暂停并从中断处继续播放。这是我的代码:
class ViewController: UIViewController
{
let moviePlayerController = AVPlayerViewController()
var aPlayer = AVPlayer()
func playBackgroundMovie()
{
if let url = NSBundle.mainBundle().URLForResource("IMG_0489", withExtension: "m4v")
{
aPlayer = AVPlayer(URL: url)
}
moviePlayerController.player = aPlayer
moviePlayerController.view.frame = view.frame
moviePlayerController.view.sizeToFit()
moviePlayerController.videoGravity = AVLayerVideoGravityResizeAspect
moviePlayerController.showsPlaybackControls = false
aPlayer.play()
view.insertSubview(moviePlayerController.view, atIndex: 0)
}
func didPlayToEndTime()
{
aPlayer.seekToTime(CMTimeMakeWithSeconds(0, 1))
aPlayer.play()
}
override func viewDidLoad()
{
// Do any additional setup after loading the view, typically from a nib.
super.viewDidLoad()
playBackgroundMovie()
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.didPlayToEndTime), name: AVPlayerItemDidPlayToEndTimeNotification, object: nil)
}
我必须在应用委托中执行某些操作吗?我看了以前的视频,但我认为其中一些视频使用的是 swift 的过时版本。或者对我来说有点太混乱了。
是的,所有特定于应用程序的操作都发生在您的 appdelegate 协议中。将暂停代码放入 appdelegate 的 applicationDidEnterBackground
函数中,并将恢复代码放入 applicationWillEnterForeground
.
I would check out Apple's docs on the AppDelegate
protocol,尤其是这两个函数,因为在您的应用程序变为非活动状态之前,您需要多长时间才能完成任务(尽管如果您只是暂停和恢复 AVPlayer
你应该没问题)。
您应该能够通过 NSNotificationCenter 注册一个 backgrounding/foregrounding 通知来播放或暂停您的 aPlayer,如下所示:
let notificationCenter = NSNotificationCenter.defaultCenter()
notificationCenter.addObserver(self, selector: #selector(pauseVideoForBackgrounding), name: UIApplicationDidEnterBackgroundNotification, object: nil)
有几个 UIApplication 通知名称可用,包括 UIApplicationWillEnterForegroundNotification。您可以根据需要利用尽可能多的通知,让您的视频播放器 class 知道应用程序状态发生了什么。
如果您支持 iOS 8 或更低版本,请确保同时从您添加到视图控制器的任何 NSNotifications 中删除您的播放器 class 作为观察者。