这篇文章主要写一个iOS系统下的音乐播放器 , 包括简单的仿QQ音乐播放器界面、音乐播放、歌词解析、后台控制等 ,如果你正好需要 , 希望你看完后能够对你的提升有所帮助 , 当然,阅读中如果发现什么错误和可优化的地方 , 希望可以得到你的指点 , 有任何不妥的地方 欢迎指正。喜欢的可以关注下我的博客、我的简书
先上截图和demo
下面说一下实现步骤吧
一、界面搭建
因为主要是为了练手音乐播放相关功能,所以界面写的比较简单,一个主界面加一个侧滑菜单,列表界面就不说了,说一个侧滑菜单和播放界面吧,侧滑菜单我这里使用的是PKRevealController,使用方法:把demo里的PKRevealController文件夹拖进你的项目里,在AppDelegate导入头文件,主要代码如下:
@property (nonatomic,strong)PKRevealController *revealVc;
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
ZQNavigationController *nav = [[ZQNavigationController alloc] initWithRootViewController:[[ZQMusiListController alloc] init]];
ZQMusicMenuController *leftVC = [[ZQMusicMenuController alloc]
init];
self.revealVc = [PKRevealController revealControllerWithFrontViewController:nav leftViewController:leftVC options:nil];
self.revealVc.animationDuration = 0.25;
self.window.rootViewController = self.revealVc;
这样就能实现右滑弹出菜单了,手动控制菜单滑出的代码如下:
#pragma mark --菜单栏滑出/隐藏
- (void)menuBtnClick
{
[self.navigationController.revealController showViewController:self.navigationController.revealController.leftViewController];
}
二、音乐播放
这里主要用到三个工具类
1、ZQMusicTool :用来获取所有歌曲、当前播放歌曲、上一首、下一首,主要方法有
+(instancetype)shareMusicTool;
// 获取所有音乐
-(NSArray *)Musics;
// 当前正在播放的音乐
-(ZQMusicModel *)playingMusic;
// 设置默认播放的音乐
-(void)setUpPlayingMusic:(ZQMusicModel *)playingMusic;
// 返回上一首音乐
- (ZQMusicModel *)previousMusic;
// 返回下一首音乐
- (ZQMusicModel *)nextMusic;
2、ZQPlayerTool :用来控制音乐的启停、进度、切换,主要方法有
/// 播放
/// @param name 歌曲名称
-(void)playMusicWithMusicName:(NSString *)name;
/// 暂停
-(void)pause;
/// 歌曲总时长字符串
-(NSString *)durationMusicString;
/// 总时长
-(NSTimeInterval)durationMusic;
/// 当前播放时长
-(NSString *)currentTimeString;
/// 当前时长
-(NSTimeInterval)currentTime;
/// 进度
-(CGFloat)musicProgress;
/**
是否正在播放
*/
- (BOOL)isplaying;
/**
下一首
*/
- (void)nextMusic;
/**
上一首
*/
- (void)previousMusic;
+(NSArray *)lyricListWithName:(NSString *)name;
具体的使用方法参考demo
三、锁屏播放
锁屏效果包括:锁屏歌曲信息和远程控制音乐播放,首先满足后台播放音乐的条件,具体步骤参考下图
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setActive:YES error:nil];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];
下面实现锁屏歌曲信息展示,我是在程序进入后台的时候如果还在播放音乐就创建一个NSTimer用来刷新锁屏歌曲信息,具体代码如下:
进入后台
- (void)applicationEnterBackground
{
if ([[ZQPlayerTool sharePlayerTool] isplaying]) {
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0/30.0 target:self selector:@selector(updateScreenMusicInfo) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];
}
}
-(void)updateScreenMusicInfo {
MPNowPlayingInfoCenter *infoCenter = [MPNowPlayingInfoCenter defaultCenter];
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
ZQMusicModel *music = [[ZQMusicTool shareMusicTool] playingMusic];
//初始化 给他 专辑图片 播放时间进度
//歌手名称
dict[MPMediaItemPropertyAlbumTitle]= music.zhuanji;
dict[MPMediaItemPropertyArtist]= music.singer;
dict[MPMediaItemPropertyTitle]= music.name;
//设置当前时间
dict[MPNowPlayingInfoPropertyElapsedPlaybackTime]=@([[ZQPlayerTool sharePlayerTool] currentTime]);
//总时间
dict[MPMediaItemPropertyPlaybackDuration]= @([[ZQPlayerTool sharePlayerTool] durationMusic]);
// 开启上下文
CGRect rect = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width - 20, [UIScreen mainScreen].bounds.size.width - 20);
UIGraphicsBeginImageContextWithOptions(rect.size, YES, [UIScreen mainScreen].scale);
UIImage *sourceImage = [UIImage imageNamed:music.image];
[sourceImage drawInRect:rect];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
dict[MPMediaItemPropertyArtwork] = [[MPMediaItemArtwork alloc]initWithImage:newImage];
infoCenter.nowPlayingInfo = dict;
}
回到前台
- (void)applicationBecomeActive
{
[self.timer invalidate];
self.timer = nil;
}
#pragma mark -- 响应锁屏点击
-(void)remoteControlReceivedWithEvent:(UIEvent *)event {
switch (event.subtype) {
case UIEventSubtypeRemoteControlPlay:
{
ZQMusicModel *music = [[ZQMusicTool shareMusicTool] playingMusic];
[[ZQPlayerTool sharePlayerTool] playMusicWithMusicName:music.mp3];
}
break;
case UIEventSubtypeRemoteControlPause:
[[ZQPlayerTool sharePlayerTool] pause];
break;
case UIEventSubtypeRemoteControlPreviousTrack:
{
ZQMusicModel *model = [[ZQMusicTool shareMusicTool] previousMusic];
[[ZQMusicTool shareMusicTool] setUpPlayingMusic:model];
[[ZQPlayerTool sharePlayerTool] playMusicWithMusicName:model.mp3];
}
break;
case UIEventSubtypeRemoteControlNextTrack:
{
[[ZQPlayerTool sharePlayerTool] nextMusic];
}
break;
default:
break;
}
}
到这里一个简单的音乐播放器就完成了,不怎么会讲解,具体实现还是看demo吧,如果有什么疑问或者发现什么不足,欢迎指正。如果有时间的话后续会添加些动画效果和细节修改,最后的最后,别忘了点赞收藏