摘要:我使用的是AVPlayer播放的音频。故以AVplayer为例。我们进入正题

一、我们先完成实现锁屏播放的功能。

(1)首先要在plist中添加一个Key 为Required background modes, Value为App plays audio or streams audio/video using AirPlay。见下图

audio ios 缩略 锁屏 ios6锁屏音效_锁屏


(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;
    }
}

以上就是就完成了锁屏的的一些设置。