iOS音乐播放器的后台播放和远程控制
iOS的后臺任務(wù)一直有很嚴(yán)格的限制,一般情況下只有幾類情況能使用后臺任務(wù),下面介紹其中的一種 音樂的后臺播放。
1.要支持后臺任務(wù),首先你得告訴系統(tǒng)你需要后臺任務(wù),所以你首先在Info.plist文件中添加如下:
在Required background modes中添加 App plays audio or streams/video using AirPlay,如果你的app需要后臺從網(wǎng)絡(luò)加載數(shù)據(jù),把第二項(xiàng)也添上。
2.接下來在代碼中添加音樂后臺播放,在播放音樂之前設(shè)置AVAudioSession,一般情況設(shè)置為AVAudioSessionCategoryPlayback
//設(shè)置音頻后臺播放let session = AVAudioSession.sharedInstance()session.setActive(true, error: nil)session.setCategory(AVAudioSessionCategoryPlayback , error: nil)
3.如果想在控制中心(屏幕上拉)中設(shè)置音樂控制,如上一曲,下一曲,暫停,顯示播放時(shí)間,那么就要用到遠(yuǎn)程控制事件(RemoteControlEvents)。
? 首先在viewDidLoad()等初始化的地方聲明接收RemoteControlEvents,并且在相應(yīng)地方結(jié)束聲明
override func viewWillAppear(animated: Bool) {super.viewWillAppear(animated)//設(shè)置遠(yuǎn)程管理UIApplication.sharedApplication().beginReceivingRemoteControlEvents()self.becomeFirstResponder()}override func viewWillDisappear(animated: Bool) {super.viewWillDisappear(animated)//關(guān)閉遠(yuǎn)程管理UIApplication.sharedApplication().endReceivingRemoteControlEvents()self.resignFirstResponder()}
override func canBecomeFirstResponder() -> Bool {return true}
?也不一定在viewController中設(shè)置,也可以在appDelegate中的applicationDidBecomeActive中設(shè)置結(jié)束遠(yuǎn)程控制,在applicationDidEnterBackground中接收遠(yuǎn)程控制,總之要當(dāng)前
?類中繼承UIRespond,因?yàn)樵诩せ钸h(yuǎn)程控制后要把它當(dāng)成第一響應(yīng),重寫canBecomeFirstResponder()方法
?
?最后重寫remoteControlReceivedWithEvent方法,處理具體的上一曲,下一曲,暫停,播放等功能
override func remoteControlReceivedWithEvent(event: UIEvent) {if event.type == UIEventType.RemoteControl{switch event.subtype{case .RemoteControlTogglePlayPause: self.pauseAndPlayAction(self.playBtn); break;case .RemoteControlPreviousTrack: self.preBtnAction(self.preBtn); break;case .RemoteControlNextTrack: self.nextBtnAction(self.nextBtn); break;case .RemoteControlPlay: self.pauseAndPlayAction(self.playBtn); break;case .RemoteControlPause: self.pauseAndPlayAction(self.playBtn); break;default: break;}}}4.上面已經(jīng)完成了遠(yuǎn)程的控制,但歌曲的信息,比如歌曲名,歌唱者,專輯和播放時(shí)間還沒設(shè)置呢。要完成這項(xiàng)功能就要用到MPNowPlayingInfoCenter
按照官方注釋
// The elapsed time of the now playing item, in seconds. // Note the elapsed time will be automatically extrapolated from the previously // provided elapsed time and playback rate, so updating this property frequently // is not required (or recommended.) @availability(iOS, introduced=5.0) let MPNowPlayingInfoPropertyElapsedPlaybackTime: String // NSNumber (double)一旦設(shè)置了過后,它將按照播放速率(默認(rèn)為1.0)自動(dòng)刷新,不需要你手動(dòng)刷新。但這里有個(gè)小小的問題,如果你暫停播放音樂,但是這個(gè)ElapsedPlaybackTime任然在后臺默默的刷新,導(dǎo)致你再點(diǎn)擊播放時(shí),顯示的播放時(shí)間與實(shí)際的播放時(shí)間不同,所以你在這里要做處理。我在暫停播放音樂后,再次點(diǎn)擊播放時(shí)重新設(shè)置了一下NowPlayingInfoElapsedPlaybackTime,使之與實(shí)際的播放時(shí)間相符 @IBAction func pauseAndPlayAction(sender: UIButton) {if audioPlayer.playbackState == MPMoviePlaybackState.Playing{audioPlayer.pause()}else{//重新設(shè)置當(dāng)前播放時(shí)間MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = self.audioPlayer.currentPlaybackTimeaudioPlayer.play()}}5.好了,大功告成了!你可以完美實(shí)現(xiàn)音樂的后臺播放和遠(yuǎn)程控制了
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 這里要非常感謝參考的文章
總結(jié)
以上是生活随笔為你收集整理的iOS音乐播放器的后台播放和远程控制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gm把mysql连接设置密码_完整的GM
- 下一篇: 王艳平老师——获取本地信息代码