摘要:我使用的是AVPlayer播放的音频。故以AVplayer为例。我们进入正题
一、我们先完成实现锁屏播放的功能。
(1)首先要在plist中添加一个Key 为Required background modes, Value为App plays audio or streams audio/video using AirPlay。见下图
(2)代码的实现 在AppDelegate.m中
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];
[audioSession setActive:YES error:nil];
//启用远程控制事件接收
[application beginReceivingRemoteControlEvents];
return YES;
}
这里强调一下AVAudioSessionCategoryPlayback是独占音乐播放,可以实现后台播放。AVAudioSession的Category有很多,我这就不介绍了,有兴趣你可以查看一下API。
以上设置完成即可实现后台锁屏播放。
二、(1)锁屏显示信息,直接上代码。
/**
锁屏时候的设置,效果需要在真机上才可以看到
*/
- (void)updateLockedScreenMusic{
// 初始化播放信息
NSMutableDictionary *infoMusic = [NSMutableDictionary dictionary];
// 专辑名称
infoMusic[MPMediaItemPropertyAlbumTitle] = @"专辑名称";
// 歌手名称
infoMusic[MPMediaItemPropertyArtist] = @"歌手名称";
// 歌曲名称
infoMusic[MPMediaItemPropertyTitle] = [self.hisBookDic objectForKey:@"title"];
//block实现锁屏状态下点击播放,下一曲,上一曲等的响应事件
[(AppDelegate*)[UIApplication sharedApplication].delegate pushPushReceivedWithEvent:^(UIEvent *event) {
[self remoteControlReceivedWithEvent:event];
}];
NSData * data = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:self.bookImg]];
UIImage *image = [[UIImage alloc]initWithData:data];
//锁屏显示的图片信息
infoMusic[MPMediaItemPropertyArtwork] = [[MPMediaItemArtwork alloc] initWithImage:image];
// 设置持续时间(歌曲的总时间)
[infoMusic setObject:[NSNumber numberWithFloat:CMTimeGetSeconds([self.player.currentItem duration])] forKey:MPMediaItemPropertyPlaybackDuration];
// 设置当前播放进度
[infoMusic setObject:[NSNumber numberWithFloat:CMTimeGetSeconds([self.player.currentItem currentTime])] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];
[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:infoMusic];
}
(2)下面我们看一下锁屏状态下如何接收用户点击事件。
第一个代码片中我们已经加了这一句[application beginReceivingRemoteControlEvents];启用远程控制事件接收。这样我们就直接坐等接收响应事件就好了。因为我是再单独封装的一个播放类所以采用了一个block传递事件。
#import <UIKit/UIKit.h>
//传递锁屏音频播放ing的用户点击事件
typedef void(^PushReceivedWithEvent)(UIEvent *event);
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (nonatomic,copy)PushReceivedWithEvent pushReceivedWithEvent;
- (void)pushPushReceivedWithEvent:(PushReceivedWithEvent)pushReceivedWithEvent;
@end
// 在具体的控制器或其它类中捕获处理远程控制事件AppDelegate中调用
// 在具体的控制器或其它类中捕获处理远程控制事件
- (void)remoteControlReceivedWithEvent:(UIEvent *)event
{
if (self.pushReceivedWithEvent) {
self.pushReceivedWithEvent(event);
}
}
- (void)pushPushReceivedWithEvent:(PushReceivedWithEvent)pushReceivedWithEvent
{
self.pushReceivedWithEvent = pushReceivedWithEvent;
}
播放类中响应事件代码如下。(与锁屏显示信息是同一个类里,锁屏信用中有block)
- (void)remoteControlReceivedWithEvent:(UIEvent *)event
{
// 根据事件的子类型(subtype) 来判断具体的事件类型, 并做出处理
switch (event.subtype) {
case UIEventSubtypeRemoteControlPlay:
case UIEventSubtypeRemoteControlPause: {
DLog(@" 执行播放或暂停的相关操作 (锁屏界面和上拉快捷功能菜单处的播放按钮)");
break;
}
case UIEventSubtypeRemoteControlPreviousTrack: {
DLog(@" 执行上一曲的相关操作 (锁屏界面和上拉快捷功能菜单处的上一曲按钮)");
break;
}
case UIEventSubtypeRemoteControlNextTrack: {
DLog(@"执行下一曲的相关操作 (锁屏界面和上拉快捷功能菜单处的下一曲按钮)");
break;
}
case UIEventSubtypeRemoteControlTogglePlayPause: {
DLog(@"进行播放/暂停的相关操作 (耳机的播放/暂停按钮)");
break;
}
default:
break;
}
}
以上就是就完成了锁屏的的一些设置。