iOS音乐后台播放、锁屏封面及播放控制
在默认情况下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音乐后台播放、锁屏封面及播放控制相关推荐
- ios开发之MPNowPlayingInfoCenter 锁屏显示正在播放的音乐
今天在床上玩唱吧,听着歌锁屏了,当点亮屏幕的时候,锁屏页面出现了我正在听得歌曲 壁纸也换成了唱吧里面的歌手图片.做ios好几年了,从没有做过这个需求 于是好奇就翻看ios的API文档找到了这个类. 如 ...
- [ios2] ios开发之MPNowPlayingInfoCenter 锁屏显示正在播放的音乐
http://blog.csdn.net/hufengvip/article/details/11823199
- iOS音频的后台播放总结(后台网络请求歌曲,Remote控制,锁屏封面,各种打断)...
iOS音频的后台播放总结(后台网络请求歌曲,Remote控制,锁屏封面,各种打断) 2013-12-11 21:13 1416人阅读 评论(0) 收藏 举报 分类: cocoa SDK(139) ...
- iOS 语音合成支持后台和锁屏情况
最近有一个需求,就是要加入语音合成,并能够在进入后台或者锁屏之后能够播报,现在最流行的应该就是科大讯飞了,功能强大,用起来简单,但是如果只要简单的TTS功能就没有必要集成其他的SDK了,iOS中提供好 ...
- iOS锁屏界面音频播放控制
公司的app里面有后台音频播放功能,最近发现,当在锁屏界面(后台)时,不能控制播放页面的音频播放,是因为没有实现远程控制事件处理. 下面说说大概实现过程:由于后台播放功能早已实现(不做详细叙述),这里 ...
- iOS音乐后台播放及锁屏信息显示
实现音乐的后台播放.以及播放时,能够控制其暂停,下一首等操作,以及锁屏图片歌曲名等的显示 此实例须要真机调试.效果图例如以下: project下载:githubproject下载 实现步骤: 1.首先 ...
- 后台或者锁屏播放音乐播放,
引入依赖的库文件: AudioToolBox.framework MediaPlayer.framework CoreMedia.framework AVFoundation.framework 2. ...
- iOS音频的后台播放 锁屏
初始化AudioSession和基本配置 音频播放器采用的AVPlayer ,在程序启动的时候需要配置AudioSession,AudioSession负责应用音频的设置,比如支不支持后台,打断等等, ...
- 慎重升级!iOS 13可绕过锁屏密码查看通讯录、照片、短信
自从,上个星期 iPhone 11 发布之后,我已经好几天没睡好觉了.转发了好多抽奖微博,第六感告诉我,这次我怎么也能欧气一回. 反正不欧气也关系,毕竟只要一个肾,我打算自己买一个. 听说我要买手机的 ...
最新文章
- shell中的条件表达式
- oracle group by用法
- video/audio在ios/android上播放兼容
- STM32 基础系列教程 2 - GPIO 按键输入
- BDD敏捷开发入门与实战
- OOP 术语:Arguments(参量)和 Parameters(参数)的区别(转载)
- 【leetcode】数组建树
- 深入理解的JavaScript函数编程
- Anaconda Python安装,Spyder汉化及调试
- static 变量 作用域 全局变量 局部变量 外部变量 常量 volatile变量
- eclipse_开启出现弹窗_Subversive Connector Discovery
- 电脑硬盘整数分区计算器
- 【python初级】 ubuntu18.04下卸载Anaconda3
- Win10在BIOS中如何启用虚拟化(VT)
- root下E45:‘readonly‘‘ option is set(addto override)报错
- “菜刷刷”系统装机流程
- idea2019.2版本gradle 使用offline
- win7自动登录(win7自动登录不用输入密码)
- 数据结构:图:图形和图形模型(Graphs and Graph Models)
- c语言程序 强制关机程序,怎么用C或者C++编写一个电脑强制关机程序
热门文章
- [论文阅读] (02) SP2019-Neural Cleanse: Identifying and Mitigating Backdoor Attacks in Neural Networks
- 5年测试工程师成功入职美团,看看面霸是如何养成的,他的路子真的野
- Oracle创建视图,错误ORA-01031: insufficient privileges(权限不足)
- 基于云开发的答题活动小程序v2.0-完整项目分享(附源码)
- Python修改镜像原命令
- 爬虫技术在Nifty Gateway的应用前景
- 小程序 微信统计表格_微信小程序简单的数据表格及查询功能
- AutoCAD使用脚本获取文件名
- node:安装完成之后输入node -v显示node is not defined
- Plotly绘制成都地铁全线路图(线路可实时更新最新线路 + 完整代码)