iOS音乐播放器的后台播放和远程控制
iOS的后台任务一直有很严格的限制,一般情况下只有几类情况能使用后台任务,下面介绍其中的一种 音乐的后台播放。
1.要支持后台任务,首先你得告诉系统你需要后台任务,所以你首先在Info.plist文件中添加如下:
在Required background modes中添加 App plays audio or streams/video using AirPlay,如果你的app需要后台从网络加载数据,把第二项也添上。
2.接下来在代码中添加音乐后台播放,在播放音乐之前设置AVAudioSession,一般情况设置为AVAudioSessionCategoryPlayback
//设置音频后台播放let session = AVAudioSession.sharedInstance()session.setActive(true, error: nil)session.setCategory(AVAudioSessionCategoryPlayback , error: nil)
3.如果想在控制中心(屏幕上拉)中设置音乐控制,如上一曲,下一曲,暂停,显示播放时间,那么就要用到远程控制事件(RemoteControlEvents)。
首先在viewDidLoad()等初始化的地方声明接收RemoteControlEvents,并且在相应地方结束声明
override func viewWillAppear(animated: Bool) {super.viewWillAppear(animated)//设置远程管理UIApplication.sharedApplication().beginReceivingRemoteControlEvents()self.becomeFirstResponder()}
override func viewWillDisappear(animated: Bool) {super.viewWillDisappear(animated)//关闭远程管理UIApplication.sharedApplication().endReceivingRemoteControlEvents()self.resignFirstResponder()}
override func canBecomeFirstResponder() -> Bool {return true}
也不一定在viewController中设置,也可以在appDelegate中的applicationDidBecomeActive中设置结束远程控制,在applicationDidEnterBackground中接收远程控制,总之要当前
类中继承UIRespond,因为在激活远程控制后要把它当成第一响应,重写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.上面已经完成了远程的控制,但歌曲的信息,比如歌曲名,歌唱者,专辑和播放时间还没设置呢。要完成这项功能就要用到MPNowPlayingInfoCenter
func configNowPlayingInfoCneter(song: Song){isConfigDuration = falsevar dic: NSMutableDictionary = NSMutableDictionary()//设置专辑名dic.setObject(song.albumtitle!, forKey: MPMediaItemPropertyAlbumTitle)//设置艺术家dic.setObject(song.artist!, forKey: MPMediaItemPropertyArtist)//设置歌名dic.setObject(song.title!, forKey: MPMediaItemPropertyTitle)//设置已经播放的时间dic.setObject(0.0, forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime)//设置歌曲的总时长dic.setObject(0.0, forKey: MPMediaItemPropertyPlaybackDuration)//设置锁屏画面let mArt: MPMediaItemArtwork = MPMediaItemArtwork(image: UIImage(named: "musicBg"))dic.setObject(mArt, forKey:MPMediaItemPropertyArtwork)MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo = dic as [NSObject : AnyObject]}
在每次切换歌曲的时候调用。注意这里的播放时间MPMediaItemPropertyPlaybackDuration和MPNowPlayingInfoPropertyElapsedPlaybackTime
按照官方注释
// 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)
一旦设置了过后,它将按照播放速率(默认为1.0)自动刷新,不需要你手动刷新。但这里有个小小的问题,如果你暂停播放音乐,但是这个ElapsedPlaybackTime任然在后台默默的刷新,导致你再点击播放时,显示的播放时间与实际的播放时间不同,所以你在这里要做处理。我在暂停播放音乐后,再次点击播放时重新设置了一下NowPlayingInfoElapsedPlaybackTime,使之与实际的播放时间相符
@IBAction func pauseAndPlayAction(sender: UIButton) {if audioPlayer.playbackState == MPMoviePlaybackState.Playing{audioPlayer.pause()}else{//重新设置当前播放时间MPNowPlayingInfoCenter.defaultCenter().nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = self.audioPlayer.currentPlaybackTimeaudioPlayer.play()}}
5.好了,大功告成了!你可以完美实现音乐的后台播放和远程控制了
这里要非常感谢参考的文章
iOS音乐播放器的后台播放和远程控制相关推荐
- 音乐播放器——实现后台播放、摇摇切歌等功能
前言 首先声明,小白一只,android完全自学,若代码中有不妥或更简便的方法求指教(大佬带带我)... APP 欢迎界面 主界面 音乐界面 实现功能 1.遍历本地音乐 2.音乐后台播放 3.音乐封面 ...
- 安卓播放器实现后台播放服务
安卓开发,除了我们经常写的Activity.Fragment等显示给用户的控件外,我们还可能需要程序在退出到后台的时候,继续给用户提供服务的功能,这里就需要用到Android的服务Service. 安 ...
- 关于音乐播放器锁屏播放,后台播放,封面显示等
1. 如果应用需要后台播放:那么在appdelegate 中添加 [AVAudioSession *session = [AVAudioSession sharedInstance];[session ...
- Android音乐播放器开发(5)—播放界面(播放、暂停、上一首、下一首,顺序播放、随机播放、拖拽进度条…)
1. 说明 源码已同步到Gitee仓库,Github仓库,觉得还不错的话帮忙点个"star"吧,非常感谢. Android播放器专栏其它文章: 服务端:Android音乐播放器开发 ...
- (1)H5实现音乐播放器【正在播放-歌词篇】
近期闲来无事,就想着复习一下前端的东西,然后正好跟朋友搞了一个公共开放的音乐api接口,就想着写一个音乐播放器玩玩! 话不多说,直接上图,然后上代码 [播放器显示正在播放] 实现功能: 1:歌词随着歌 ...
- HTML+CSS+原生JS写一个简易的音乐播放器(仅播放一首歌)
用HTML+CSS+原生JS写一个简易的音乐播放器(仅播放一首歌) 效果如下:(鼠标点击按钮可以实现播放或暂停,按钮会旋转,实现了歌词同步,功能还需改进) 代码如下: <!DOCTYPE htm ...
- 2021最新哔哩bilibili视频弹幕播放器带后台版本完整无错修复
源码介绍: 此款播放器源码添加及修复了很多功能,且所有源码均本地化,不存在外链的情况.站长亲测_测试环境:PHP7.0+MySQL5.6 优化修复功能:1.修复优化播放器播放结束自动下一集代码2.修复 ...
- 音乐播放器项目-歌曲播放
音乐播放器项目-歌曲播放 当单击歌名(包括歌手下的音乐列表)时,应该跳转并携带歌曲的songid值到歌曲播放页面,以便播放对应的歌曲.创建歌曲播放页面MusicPlay.vue,并且进行路由配置,代码 ...
- 关于音乐播放器中随机播放的两种模式
众所周知,一个有完整功能的音乐播放器应该能够让用户自主选择播放模式,例如单曲循环,随机播放,列表循环,全部播放......本文主要讨论其中的随机播放,在实现随机播放的功能可以有两种方法,即random ...
最新文章
- 北京冬奥又曝黑科技:连气象主播都是AI虚拟人
- Kmeans、Kmeans++和KNN算法比较
- Nodejs与mysql连接池的应用(pool)
- .tcl文件_TCL电视如何安装第三方软件?当贝市场分享最新教程
- C++工作笔记-对容器模板的初步认识
- Spring中常用注解的介绍
- 新颖性搜索(Novelty Search,NS)算法详解与实现
- Java 程序开发设计文档
- Excel 2016中的新增函数之SWITCH
- SecoClient 接收返回码超时
- C++头文件和cpp文件的原理
- 多线程抢票_多线程抢票系统浅析
- mysql图形查询操作 点找面及面找点 Polygon获取中心点坐标 空间地理位置计算
- iOS 导航栏下拉菜单框
- 2022年全球市场薄膜厚度测量系统总体规模、主要生产商、主要地区、产品和应用细分研究报告
- speechbrain - 小记
- 向量内积和夹角的关系
- 家庭百兆升级千兆全攻略
- Activity-的-36-大难点,你会几个?「建议收藏」
- SEO免费外链发布工具