iOS开发之网络音乐播放器(SC音乐)(二)

前言

iOS开发之网络音乐播放器(SC音乐)(一)已经介绍完播放控制、音乐数据获取解析、歌词显示等。本文在上文的基础上介绍锁屏播放设置,后台播放设置,手势操作等。

正题

一、后台播放设置

点击工程Target-->Info或者打开Info.plist文件,在"Infomation Property List"中添加"Required background modes",将"Required background modes"下拉项目Item0中的Value设置为"App plays audio or streams audio/video using AirPlay",点击Target-->Capabilities,勾选"Audio, AirPlay and Picture in Picture"。如图1和图2所示:

图1

图2

然后在AppDelegate.m文件的方法- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

return YES;
} 添加以下代码:

//后台播放音频设置,需要在Capabilities->Background Modes中勾选Audio,Airplay,and Picture in Picture
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setActive:YES error:nil];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];

这样就可以实现后台播放了。

二、锁屏播放设置

在AppDelegate.m文件的方法- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

return YES;
}添加以下代码:

 // 设置接受远程控制[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
在ViewController.h中添加头文件:
#import <AVFoundation/AVFoundation.h>
#import <MediaPlayer/MediaPlayer.h>

在ViewController.m文件添加方法:

#pragma mark - 锁屏界面开启和监控远程控制事件
//锁屏界面开启和监控远程控制事件
- (void)createRemoteCommandCenter{// 远程控制命令中心 iOS 7.1 之后  详情看官方文档:https://developer.apple.com/documentation/mediaplayer/mpremotecommandcenterMPRemoteCommandCenter *commandCenter = [MPRemoteCommandCenter sharedCommandCenter];// MPFeedbackCommand对象反映了当前App所播放的反馈状态. MPRemoteCommandCenter对象提供feedback对象用于对媒体文件进行喜欢, 不喜欢, 标记的操作. 效果类似于网易云音乐锁屏时的效果//添加喜欢按钮MPFeedbackCommand *likeCommand = commandCenter.likeCommand;likeCommand.enabled = YES;likeCommand.localizedTitle = @"喜欢";[likeCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) {NSLog(@"喜欢");return MPRemoteCommandHandlerStatusSuccess;}];//添加不喜欢按钮,这里用作“下一首”MPFeedbackCommand *dislikeCommand = commandCenter.dislikeCommand;dislikeCommand.enabled = YES;dislikeCommand.localizedTitle = @"下一首";[dislikeCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) {NSLog(@"下一首");[self nextButtonAction:nil];return MPRemoteCommandHandlerStatusSuccess;}];//标记MPFeedbackCommand *bookmarkCommand = commandCenter.bookmarkCommand;bookmarkCommand.enabled = YES;bookmarkCommand.localizedTitle = @"标记";[bookmarkCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) {NSLog(@"标记");return MPRemoteCommandHandlerStatusSuccess;}];// 远程控制播放[commandCenter.pauseCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) {[musicPlayer.play pause];return MPRemoteCommandHandlerStatusSuccess;}];// 远程控制暂停[commandCenter.playCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) {[musicPlayer.play play];return MPRemoteCommandHandlerStatusSuccess;}];// 远程控制上一曲[commandCenter.previousTrackCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) {NSLog(@"上一曲");return MPRemoteCommandHandlerStatusSuccess;}];// 远程控制下一曲[commandCenter.nextTrackCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) {NSLog(@"下一曲");[self nextButtonAction:nil];return MPRemoteCommandHandlerStatusSuccess;}];//快进MPSkipIntervalCommand *skipBackwardIntervalCommand = commandCenter.skipForwardCommand;skipBackwardIntervalCommand.preferredIntervals = @[@(54)];skipBackwardIntervalCommand.enabled = YES;[skipBackwardIntervalCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) {NSLog(@"你按了快进按键!");// 歌曲总时间CMTime duration = musicPlayer.play.currentItem.asset.duration;Float64 completeTime = CMTimeGetSeconds(duration);// 快进10秒_songSlider.value = _songSlider.value + 10 / completeTime;// 计算快进后当前播放时间Float64 currentTime = (Float64)(_songSlider.value) * completeTime;// 播放器定位到对应的位置CMTime targetTime = CMTimeMake((int64_t)(currentTime), 1);[musicPlayer.play seekToTime:targetTime];return MPRemoteCommandHandlerStatusSuccess;}];//在控制台拖动进度条调节进度(仿QQ音乐的效果)[commandCenter.changePlaybackPositionCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) {CMTime totlaTime = musicPlayer.play.currentItem.duration;MPChangePlaybackPositionCommandEvent * playbackPositionEvent = (MPChangePlaybackPositionCommandEvent *)event;[musicPlayer.play seekToTime:CMTimeMake(totlaTime.value*playbackPositionEvent.positionTime/CMTimeGetSeconds(totlaTime), totlaTime.timescale) completionHandler:^(BOOL finished) {}];return MPRemoteCommandHandlerStatusSuccess;}];}
在ViewDidLoad方法中调用:
[self createRemoteCommandCenter];

#pragma mark - 锁屏播放设置
//展示锁屏歌曲信息:图片、歌词、进度、演唱者
- (void)showLockScreenTotaltime:(float)totalTime andCurrentTime:(float)currentTime andLyricsPoster:(BOOL)isShow{NSMutableDictionary * songDict = [[NSMutableDictionary alloc] init];//设置歌曲题目[songDict setObject:songInfo.title forKey:MPMediaItemPropertyTitle];//设置歌手名[songDict setObject:songInfo.author forKey:MPMediaItemPropertyArtist];//设置专辑名[songDict setObject:songInfo.album_title forKey:MPMediaItemPropertyAlbumTitle];//设置歌曲时长[songDict setObject:[NSNumber numberWithDouble:totalTime]  forKey:MPMediaItemPropertyPlaybackDuration];//设置已经播放时长[songDict setObject:[NSNumber numberWithDouble:currentTime] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];UIImage * lrcImage = songInfo.pic_big;if (isShow) {//制作带歌词的海报if (!_lrcImageView) {_lrcImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 480,800)];}//主要为了把歌词绘制到图片上,已达到更新歌词的目的[_lrcImageView addSubview:_deliverView.midView.midLrcView.lockScreenTableView];_lrcImageView.image = lrcImage;_lrcImageView.backgroundColor = [UIColor blackColor];//获取添加了歌词数据的海报图片UIGraphicsBeginImageContextWithOptions(_lrcImageView.frame.size, NO, 0.0);CGContextRef context = UIGraphicsGetCurrentContext();[_lrcImageView.layer renderInContext:context];lrcImage = UIGraphicsGetImageFromCurrentImageContext();_lastImage = lrcImage;UIGraphicsEndImageContext();}else{if (_lastImage) {lrcImage = _lastImage;}}//设置显示的海报图片[songDict setObject:[[MPMediaItemArtwork alloc] initWithImage:lrcImage]forKey:MPMediaItemPropertyArtwork];[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:songDict];}

在更新播放进度的方法中调用:

//展示锁屏歌曲信息,上面监听屏幕锁屏和点亮状态的目的是为了提高效率
[self showLockScreenTotaltime:totalTime andCurrentTime:currentTime andLyricsPoster:isShowLyricsPoster];

锁屏歌词实现原理是将锁屏歌词tableView加到锁屏专辑图片imageView中,合成新图片,歌词滚动的时候刷新tableView,然后就可以实现锁屏歌词滚动了。

三、手势操作

SC音乐用到了点击主页控制View进入DetailPlayControlView,下滑退出DetailPlayControlView的操作,所以要给主页控制View添加点击和下滑手势操作。

1). 点击操作
// 主页控制View
_playControllerView = [[UIView alloc] initWithFrame:CGRectMake(0, Screen_Height * 0.88, Screen_Width, Screen_Height * 0.12)];
_playControllerView.backgroundColor = UIColorFromRGB(0xff0000);
_playControllerView.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGesturRecognizer=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction:)];
[_playControllerView addGestureRecognizer:tapGesturRecognizer];
#pragma mark - 主页控制View点击事件
-(void)tapAction:(id)tap
{NSLog(@"点击了tapView");
}

2). 下滑操作

// 向下滑动退出
UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(responseGlide)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionDown)];
[self.deliverView  addGestureRecognizer:recognizer];

#pragma mark - 下滑退出detail控制界面
- (void)responseGlide {NSLog(@"下滑退出");}

后续还会继续更新播放被外部中断怎么恢复播放功能,项目已经放到github,大家要是觉得这个项目对你有帮助,别忘了给颗Star哦!

githut地址: https://github.com/Mozartisnotmyname/SCMusic.git

iOS开发之网络音乐播放器(SC音乐)(二)相关推荐

  1. 使用android studio时酷狗音乐,17 Android Studio开发实战:音乐播放器——浪花音乐...

    手机上的多媒体内容讲究声情并茂.悦目且悦耳,这样才能让用户的感官得到最大享受.影视播放器由于存在视频自身的画面,反而限制了开发者的施展空间:而音乐播放器允许定制播放画面,开发者有足够空间施展拳脚.本节 ...

  2. 【毕业设计】28-基于单片机的音乐播放器简易音乐播放器设计(原理图+源代码+仿真工程+答辩PPT+答辩论文)

    typora-root-url: ./ [毕业设计]28-基于单片机的音乐播放器简易音乐播放器设计(原理图+源代码+仿真工程+答辩PPT+答辩论文) 文章目录 typora-root-url: ./ ...

  3. php 在线调用音乐播放器,宅音乐播放器,HTML5网页播放器,带后台管理及API调用,使用thinkphp编写...

    宅音乐播放器 宅音乐播放器,HTML5网页播放器,集成后台管理及API调用,目前正在开发中,敬请关注 技术栈 后端:thinkphp 5.1 前端:layui 数据库:mysql 演示 整合依赖安装包 ...

  4. mac音乐播放器QQ音乐好用吗?vip绿钻的QQ音乐有哪些版本优势?

    mac音乐播放器QQ音乐好用吗?当然!QQ音乐是Mac平台用户体验极佳的音乐播放器,最新最热的排行榜.歌单.电台.MV天天推荐,智能音乐搜索.猜你喜欢帮你轻松发现音乐.更何况是不需要绿钻和付费包,VI ...

  5. html中加入音乐播放器,HTML网页添加音乐播放器做背景音乐代码-标签audio

    是 HTML 5 的一个新标签,定义声音,比如音乐或其他音频流. 调用格式: src="http://sc1.111ttt.com/2016/1/02/04/195040016323.mp3 ...

  6. Android获取第三方音乐播放器的音乐信息

    最近在做Android手机获取第三方音乐播放器的音乐信息.一开始头疼的很,采集第三方的信息太难了,后面看了一遍博文是关于怎么监听系统的音乐播放信息,发现在播放下一首音乐的时候会发送广播,广播会包含下一 ...

  7. php文件添加音乐播放器,window_win10系统自带Groove音乐播放器在哪?自带Groove音乐播放器添加音乐等功能的使用教程,   播放器在哪?1 - phpStudy...

    win10系统自带Groove音乐播放器在哪?自带Groove音乐播放器添加音乐等功能的使用教程 播放器在哪? 1.点击桌面的左下端"开始菜单"符号,然后在右上角,找到" ...

  8. java swing 播放音乐_java swing 音乐播放器-乐乐音乐

    乐乐音乐1.0(本地版) 乐乐音乐是基于musique 开源播放器开发的java swing音乐播放器,实现了mp3.flac.ape.wav等多种音频格式的播放和ksc歌词的解析.制作和显示. 完成 ...

  9. html5模仿手机音乐播放器(添加音乐进度条和时长)

    今天用html+js+cs写了一个类似手机音乐播放器的小东东,代码规范性不是很好,高手切勿喷,新手可以看看,其中歌词同步js代码参考了一个老师的代码.自己添加的是点击按钮页面滑动,和上一曲下一曲播放, ...

最新文章

  1. 广东深圳计算机学校排名2015年,2015年深圳小学综合排名 各区小学最新排名
  2. 40年产权的商业地产,个人投资者决不能碰
  3. C++知识点20——使用C++标准库(再谈string——string的大小、容量、交换与迭代器失效)
  4. 【Android NDK 开发】NDK C/C++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 获取 tombstone_0X 崩溃日志信息 )
  5. HDU 1257 最少拦截系统
  6. PDF解决方案(2)--文件转PDF
  7. java memcached设置过期时间_Memcached的MemCachedClient设置过期时限
  8. 网上的很多Android项目源码有用吗?Android开发注意的地方。
  9. Jmeter模拟加密密码登录
  10. 坑爹!Quartz 重复调度问题,你遇到过么?
  11. C#调用C语言生成的DLL“未找到入口”
  12. mui.ajax ie8,IE8+MVVM的适配方案尝试
  13. 波形垫片弹性系数计算_波形弹簧的特点介绍
  14. 基于Python的西瓜数据集 3.0α的SVM实现
  15. 三维电子沙盘数字沙盘无人机倾斜摄影三维建模教程第45课
  16. 将iGoogle-Style新标签页添加到Chrome
  17. 基于机器学习场景,如何搭建特征数据管理中台?
  18. 查看docker应用信息
  19. 利用认知偏差打造用户体验
  20. 独家对话徐翔妻子:我为什么起诉离婚

热门文章

  1. 上传SVN删除项目中不需要文件
  2. 2021-技能大赛-信息安全管理与评估-DCN 设备总结 (中)-任务二-设备安全配置篇(2)
  3. 数据库中的结果集转换为json
  4. springBoot2整合Activiti7
  5. 模拟农场 Farming Simulator 2019 for Mac
  6. 找到所有的农场(for循环模拟)
  7. C++编程原则1 tcy
  8. Win8系统的机器如何改装Win7系统
  9. css的基础登陆页面设计 第一天
  10. 宝塔 开启xdebug_xdebug使用说明