如何从后台启动 AVPlayer?
how to start AVPlayer from background?
首先,我不是问如何在后台播放AVPlayer。有很多解决方案。我的问题有点不同。
我的应用程序中的 AVPlayer 正在播放 "AVPlayerItem" 的数组。当最后一首歌曲播放完毕后,我会从第一首歌曲开始播放。当应用程序处于活动状态时,这完全可以正常工作,但是,如果在播放歌曲时我按下主页按钮,最后一首歌曲在后台播放完毕。现在播放器停在这里,不会再开始播放第一首歌曲。
知道为什么会出现这种行为以及可能的解决方案。
您需要这样设置:
那么,关注如下:
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
print("AVAudioSession Category Playback OK")
do {
try AVAudioSession.sharedInstance().setActive(true)
UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
print("AVAudioSession is Active")
} catch let error as NSError {
print(error.localizedDescription)
}
} catch let error as NSError {
print(error.localizedDescription)
}
此外,要播放音频:
var backgroundMusicPlayer = AVAudioPlayer()
func playBackgroundMusic(filename: String) {
let url = NSBundle.mainBundle().URLForResource(filename, withExtension: nil)
guard let newURL = url else {
print("Could not find file: \(filename)")
return
}
do {
backgroundMusicPlayer = try AVAudioPlayer(contentsOfURL: newURL)
backgroundMusicPlayer.numberOfLoops = -1
backgroundMusicPlayer.prepareToPlay()
backgroundMusicPlayer.play()
} catch let error as NSError {
print(error.description)
}
}
然后,主要是:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
self.becomeFirstResponder()
UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
}
在您的 AppDelegate 中,您将在以下位置收到事件:
override func remoteControlReceivedWithEvent(event: UIEvent?) {
let rc = event!.subtype
print("does this work? \(rc.rawValue)")
}
首先,我不是问如何在后台播放AVPlayer。有很多解决方案。我的问题有点不同。
我的应用程序中的 AVPlayer 正在播放 "AVPlayerItem" 的数组。当最后一首歌曲播放完毕后,我会从第一首歌曲开始播放。当应用程序处于活动状态时,这完全可以正常工作,但是,如果在播放歌曲时我按下主页按钮,最后一首歌曲在后台播放完毕。现在播放器停在这里,不会再开始播放第一首歌曲。
知道为什么会出现这种行为以及可能的解决方案。
您需要这样设置:
那么,关注如下:
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
print("AVAudioSession Category Playback OK")
do {
try AVAudioSession.sharedInstance().setActive(true)
UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
print("AVAudioSession is Active")
} catch let error as NSError {
print(error.localizedDescription)
}
} catch let error as NSError {
print(error.localizedDescription)
}
此外,要播放音频:
var backgroundMusicPlayer = AVAudioPlayer()
func playBackgroundMusic(filename: String) {
let url = NSBundle.mainBundle().URLForResource(filename, withExtension: nil)
guard let newURL = url else {
print("Could not find file: \(filename)")
return
}
do {
backgroundMusicPlayer = try AVAudioPlayer(contentsOfURL: newURL)
backgroundMusicPlayer.numberOfLoops = -1
backgroundMusicPlayer.prepareToPlay()
backgroundMusicPlayer.play()
} catch let error as NSError {
print(error.description)
}
}
然后,主要是:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
self.becomeFirstResponder()
UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
}
在您的 AppDelegate 中,您将在以下位置收到事件:
override func remoteControlReceivedWithEvent(event: UIEvent?) {
let rc = event!.subtype
print("does this work? \(rc.rawValue)")
}