在默认情况下App被切换到后台时,音乐的就停止播放了,但音乐类App的一般都会需要在后台继续播放,这样用户就可以一边听音乐,一边操作其他的App。对于这种情况我们可以对App做一些简单的配置,实现后台播放功能。

当app切换到后台,用户就无法控制和查看app当前播放歌曲了。这个对于用户来说并不是很友好。既然是后台播放,那么就应该提供便捷的播放控制方式。iOS系统已经预留了接口,允许开发者在锁屏界面显示播放歌曲信息(以下称为锁屏封面),以及在底部菜单栏提供播放控制器。下面我们就来给App添加这些功能吧。

一、后台播放

然后再程序中添加入下代码:

AVAudioSession  *session  =  [AVAudioSession  sharedInstance];
[session setActive:YES error:nil];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];

二、添加播放控制器(Remote Control Events)

首先我们要告诉系统,我要接受系统的播放控制消息,这样系统才会给我们发送播放控制命令。流程是这样的:

App启动 -> 告诉系统我需要接受播放控制消息 -> 等待 -> 用户点击系统播放控制器按钮 -> 系统传递消息给App -> 我们接受到消息,做出相应的响应。

想要接收播放控制消息,我们必须要做三件事:

  • 成为Frist Responder
  • 请求系统,要求开始监听播放控制消息(Remote Control Events)
  • 开始播放音频。

请注意第三点,我们的App必须在开始播放音频后,才能收到控制消息。否则,即使你满足了前两点,也无法接收到控制消息。

//AppDelegate.m
-  (BOOL)application:(UIApplication  *)application didFinishLaunchingWithOptions:(NSDictionary  *)launchOptions {
//告诉系统,我们要接受远程控制事件[[UIApplication  sharedApplication] beginReceivingRemoteControlEvents];[self  becomeFirstResponder];
}-  (BOOL)canBecomeFirstResponder {return  YES;
}/// 系统回调接受远程事件
/// @param event event
- (void)remoteControlReceivedWithEvent:(UIEvent *)event {[self ul_remoteControlReceivedWithEvent:event];
}//响应远程音乐播放控制消息
- (void)ul_remoteControlReceivedWithEvent:(UIEvent *)event {if(event.type == UIEventTypeRemoteControl) {// 判断是否远程控制switch (event.subtype) {case UIEventSubtypeRemoteControlPlay:// 播放[self playActionDealWith];break;case UIEventSubtypeRemoteControlPause:// 暂停[self pauseActionDealWith];break;case UIEventSubtypeRemoteControlNextTrack:// 下一首[self nextTrackActionDealWithAutoEnd:NO];[self resetCloseUntilCurrentDone];break;case UIEventSubtypeRemoteControlPreviousTrack:// 上一首[self previousTrackActionDealWith];[self resetCloseUntilCurrentDone];break;case UIEventSubtypeRemoteControlTogglePlayPause:if ([ULRadioDramaPlayerManager shareInstance].isPlaying) {[self pauseActionDealWith];}else{[self playActionDealWith];}break;default:break;}ULLogInfo(@"锁屏状态操作类型:%ld",(long)event.subtype);}
}

播放音频的代码,这里给出一段简单的示例:

-  (void)playBtnClicked{NSError  *error  =  nil;NSString  *path  =  [[NSBundle  mainBundle] pathForResource:@"music" ofType:@"mp3"];AVAudioPlayer  *player  =  [[AVAudioPlayer  alloc] initWithContentsOfURL:[NSURL URLWithString:path] error:&error];if  (error)  {NSLog(@"Error:%@",  [error localizedDescription]);}[player play];
}

在开始播放音频后,使用耳机线控的播放暂停等按键,或者锁屏封面上的播放控制按键,就能够收到控制消息了。

关于耳机线控的一点说明

苹果耳机的线控上有三个按钮:加号,中部,减号。其中加号和减号是用于控制音量,这两个按钮点击是收不到消息的——UIEventSubtype没有音量改变的事件类型。而中部按钮的点击,是可以收到消息的,按一下是播放/暂停切换,快按两下是播放下一首,快按三下是播放上一首,快按两下并摁住是快进,快按三下并摁住是快退。

三、在锁屏界面显示播放歌曲信息

代码如下,其实就是设置一个全局变量的值,当系统处于音乐播放状态时,锁屏界面就会将NowPlayingInfo中的信息展示出来。可惜的是,这里的定制性不是太强,例如歌曲图片无法平铺整个屏幕大小,根据我的测试,歌曲图片在320×320时,可以完整显示在屏幕中央位置,两侧不会留下黑边。

#import <MediaPlayer/MediaPlayer.h>- (void)updatePlayInfo {NSMutableDictionary *songInfo = [[NSMutableDictionary alloc] init];UIImage *image = [UIImage imageNamed:@"image"];MPMediaItemArtwork *albumArt = [[MPMediaItemArtwork alloc] initWithImage:image];//歌曲名称[songInfo setObject:@"深夜地下铁" forKey:MPMediaItemPropertyTitle];//演唱者[songInfo setObject:@"陶钰玉" forKey:MPMediaItemPropertyArtist];//专辑名[songInfo setObject:@"深夜地下铁" forKey:MPMediaItemPropertyAlbumTitle];//专辑缩略图[songInfo setObject:albumArt forKey:MPMediaItemPropertyArtwork];[songInfo setObject:[NSNumber numberWithDouble:10.0] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime]; //音乐当前已经播放时间[songInfo setObject:[NSNumber numberWithFloat:1.0] forKey:MPNowPlayingInfoPropertyPlaybackRate];//进度光标的速度 (这个随 自己的播放速率调整,我默认是原速播放)[songInfo setObject:[NSNumber numberWithDouble:30.0] forKey:MPMediaItemPropertyPlaybackDuration];//歌曲总时间设置//        设置锁屏状态下屏幕显示音乐信息[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:songInfo];}

经过了如上配置后,程序应该就能够正常显示了。

简单demo地址 :  音频后台播放、锁屏封面及播放控制


发现一个系统特性, 正常启动app并开始播放, 这时候会把锁屏信息设置上, 然后在退后台, 把app杀死, 此时锁屏信息被系统清理掉, 目前都是正常且符合预期的,

但是通过系统工具栏点击播放, 此时系统会默默的启动上一次设置播放信息的app, 并调用remoteControlReceivedWithEvent:尝试再次播放音频,如果app记录了上次播放的音频地址,那就可以做到再次播放,当然player也需要重新初始化,并且再次点击app, 发现这次启动是一次热启动, app已经在首页位置了.

但是一般用户看到工具栏上什么信息都没有也是不会点的,点击了也不会有预期上次的音频继续播放,所以这个就作为一个iOS的小特性吧.

iOS音乐后台播放、锁屏封面及播放控制相关推荐

  1. ios开发之MPNowPlayingInfoCenter 锁屏显示正在播放的音乐

    今天在床上玩唱吧,听着歌锁屏了,当点亮屏幕的时候,锁屏页面出现了我正在听得歌曲 壁纸也换成了唱吧里面的歌手图片.做ios好几年了,从没有做过这个需求 于是好奇就翻看ios的API文档找到了这个类. 如 ...

  2. [ios2] ios开发之MPNowPlayingInfoCenter 锁屏显示正在播放的音乐

    http://blog.csdn.net/hufengvip/article/details/11823199

  3. iOS音频的后台播放总结(后台网络请求歌曲,Remote控制,锁屏封面,各种打断)...

    iOS音频的后台播放总结(后台网络请求歌曲,Remote控制,锁屏封面,各种打断) 2013-12-11 21:13 1416人阅读 评论(0) 收藏 举报  分类: cocoa SDK(139)  ...

  4. iOS 语音合成支持后台和锁屏情况

    最近有一个需求,就是要加入语音合成,并能够在进入后台或者锁屏之后能够播报,现在最流行的应该就是科大讯飞了,功能强大,用起来简单,但是如果只要简单的TTS功能就没有必要集成其他的SDK了,iOS中提供好 ...

  5. iOS锁屏界面音频播放控制

    公司的app里面有后台音频播放功能,最近发现,当在锁屏界面(后台)时,不能控制播放页面的音频播放,是因为没有实现远程控制事件处理. 下面说说大概实现过程:由于后台播放功能早已实现(不做详细叙述),这里 ...

  6. iOS音乐后台播放及锁屏信息显示

    实现音乐的后台播放.以及播放时,能够控制其暂停,下一首等操作,以及锁屏图片歌曲名等的显示 此实例须要真机调试.效果图例如以下: project下载:githubproject下载 实现步骤: 1.首先 ...

  7. 后台或者锁屏播放音乐播放,

    引入依赖的库文件: AudioToolBox.framework MediaPlayer.framework CoreMedia.framework AVFoundation.framework 2. ...

  8. iOS音频的后台播放 锁屏

    初始化AudioSession和基本配置 音频播放器采用的AVPlayer ,在程序启动的时候需要配置AudioSession,AudioSession负责应用音频的设置,比如支不支持后台,打断等等, ...

  9. 慎重升级!iOS 13可绕过锁屏密码查看通讯录、照片、短信

    自从,上个星期 iPhone 11 发布之后,我已经好几天没睡好觉了.转发了好多抽奖微博,第六感告诉我,这次我怎么也能欧气一回. 反正不欧气也关系,毕竟只要一个肾,我打算自己买一个. 听说我要买手机的 ...

最新文章

  1. shell中的条件表达式
  2. oracle group by用法
  3. video/audio在ios/android上播放兼容
  4. STM32 基础系列教程 2 - GPIO 按键输入
  5. BDD敏捷开发入门与实战
  6. OOP 术语:Arguments(参量)和 Parameters(参数)的区别(转载)
  7. 【leetcode】数组建树
  8. 深入理解的JavaScript函数编程
  9. Anaconda Python安装,Spyder汉化及调试
  10. static 变量 作用域 全局变量 局部变量 外部变量 常量 volatile变量
  11. eclipse_开启出现弹窗_Subversive Connector Discovery
  12. 电脑硬盘整数分区计算器
  13. 【python初级】 ubuntu18.04下卸载Anaconda3
  14. Win10在BIOS中如何启用虚拟化(VT)
  15. root下E45:‘readonly‘‘ option is set(addto override)报错
  16. “菜刷刷”系统装机流程
  17. idea2019.2版本gradle 使用offline
  18. win7自动登录(win7自动登录不用输入密码)
  19. 数据结构:图:图形和图形模型(Graphs and Graph Models)
  20. c语言程序 强制关机程序,怎么用C或者C++编写一个电脑强制关机程序

热门文章

  1. [论文阅读] (02) SP2019-Neural Cleanse: Identifying and Mitigating Backdoor Attacks in Neural Networks
  2. 5年测试工程师成功入职美团,看看面霸是如何养成的,他的路子真的野
  3. Oracle创建视图,错误ORA-01031: insufficient privileges(权限不足)
  4. 基于云开发的答题活动小程序v2.0-完整项目分享(附源码)
  5. Python修改镜像原命令
  6. 爬虫技术在Nifty Gateway的应用前景
  7. 小程序 微信统计表格_微信小程序简单的数据表格及查询功能
  8. AutoCAD使用脚本获取文件名
  9. node:安装完成之后输入node -v显示node is not defined
  10. Plotly绘制成都地铁全线路图(线路可实时更新最新线路 + 完整代码)