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音乐播放器的后台播放和远程控制相关推荐

  1. 音乐播放器——实现后台播放、摇摇切歌等功能

    前言 首先声明,小白一只,android完全自学,若代码中有不妥或更简便的方法求指教(大佬带带我)... APP 欢迎界面 主界面 音乐界面 实现功能 1.遍历本地音乐 2.音乐后台播放 3.音乐封面 ...

  2. 安卓播放器实现后台播放服务

    安卓开发,除了我们经常写的Activity.Fragment等显示给用户的控件外,我们还可能需要程序在退出到后台的时候,继续给用户提供服务的功能,这里就需要用到Android的服务Service. 安 ...

  3. 关于音乐播放器锁屏播放,后台播放,封面显示等

    1. 如果应用需要后台播放:那么在appdelegate 中添加 [AVAudioSession *session = [AVAudioSession sharedInstance];[session ...

  4. Android音乐播放器开发(5)—播放界面(播放、暂停、上一首、下一首,顺序播放、随机播放、拖拽进度条…)

    1. 说明 源码已同步到Gitee仓库,Github仓库,觉得还不错的话帮忙点个"star"吧,非常感谢. Android播放器专栏其它文章: 服务端:Android音乐播放器开发 ...

  5. (1)H5实现音乐播放器【正在播放-歌词篇】

    近期闲来无事,就想着复习一下前端的东西,然后正好跟朋友搞了一个公共开放的音乐api接口,就想着写一个音乐播放器玩玩! 话不多说,直接上图,然后上代码 [播放器显示正在播放] 实现功能: 1:歌词随着歌 ...

  6. HTML+CSS+原生JS写一个简易的音乐播放器(仅播放一首歌)

    用HTML+CSS+原生JS写一个简易的音乐播放器(仅播放一首歌) 效果如下:(鼠标点击按钮可以实现播放或暂停,按钮会旋转,实现了歌词同步,功能还需改进) 代码如下: <!DOCTYPE htm ...

  7. 2021最新哔哩bilibili视频弹幕播放器带后台版本完整无错修复

    源码介绍: 此款播放器源码添加及修复了很多功能,且所有源码均本地化,不存在外链的情况.站长亲测_测试环境:PHP7.0+MySQL5.6 优化修复功能:1.修复优化播放器播放结束自动下一集代码2.修复 ...

  8. 音乐播放器项目-歌曲播放

    音乐播放器项目-歌曲播放 当单击歌名(包括歌手下的音乐列表)时,应该跳转并携带歌曲的songid值到歌曲播放页面,以便播放对应的歌曲.创建歌曲播放页面MusicPlay.vue,并且进行路由配置,代码 ...

  9. 关于音乐播放器中随机播放的两种模式

    众所周知,一个有完整功能的音乐播放器应该能够让用户自主选择播放模式,例如单曲循环,随机播放,列表循环,全部播放......本文主要讨论其中的随机播放,在实现随机播放的功能可以有两种方法,即random ...

最新文章

  1. 北京冬奥又曝黑科技:连气象主播都是AI虚拟人
  2. Kmeans、Kmeans++和KNN算法比较
  3. Nodejs与mysql连接池的应用(pool)
  4. .tcl文件_TCL电视如何安装第三方软件?当贝市场分享最新教程
  5. C++工作笔记-对容器模板的初步认识
  6. Spring中常用注解的介绍
  7. 新颖性搜索(Novelty Search,NS)算法详解与实现
  8. Java 程序开发设计文档
  9. Excel 2016中的新增函数之SWITCH
  10. SecoClient 接收返回码超时
  11. C++头文件和cpp文件的原理
  12. 多线程抢票_多线程抢票系统浅析
  13. mysql图形查询操作 点找面及面找点 Polygon获取中心点坐标 空间地理位置计算
  14. iOS 导航栏下拉菜单框
  15. 2022年全球市场薄膜厚度测量系统总体规模、主要生产商、主要地区、产品和应用细分研究报告
  16. speechbrain - 小记
  17. 向量内积和夹角的关系
  18. 家庭百兆升级千兆全攻略
  19. Activity-的-36-大难点,你会几个?「建议收藏」
  20. SEO免费外链发布工具

热门文章

  1. 大理巍山发布“南诏尚品”区域公共品牌
  2. 部署Exchange Server 2003+SP2补丁
  3. 01-为什么要用Qt开发(Qt跨平台应用开发)
  4. 【考研经验】研究生,我,来了!
  5. asp如何在线打开pdf文件
  6. 电机矢量控制中采样周期应该如何定
  7. 小票打印机开钱箱设置
  8. IT项目经理必须清楚和把握IT项目管理的弹性特点
  9. 艰难转行------程序员
  10. Android App抓包、Mock数据探索