demo中提供CCLockView可以直接使用来实现锁屏播放
技术:MPNowPlayingInfoCenter
1:MPNowPlayingInfoCenter简介
MPNowPlayingInfoCenter provides an interface for setting the current now
MPNowPlayingInfoCenter提供了一个用于设置当前值的借口
// playing information for the application. This information will be displayed
显示播放程序的信息
// wherever now playing information typically appears, such as the lock screen
锁屏时正在播放的信息的位置
// and app switcher. The now playing info dictionary contains a group of
可以获得APP正在播放的相关信息
// metadata properties for a now playing item. The list of property constants
正在播放的原数据属性列表
// is available in . The properties which are
这些属性是在中可用
2:支持的属性
属性 | 传值类型 | 作用 |
---|---|---|
MPMediaItemPropertyAlbumTitle | NSString | 专辑歌标题 |
MPMediaItemPropertyAlbumTrackCount | NSNumber of NSUInteger | 专辑歌曲数 |
MPMediaItemPropertyAlbumTrackNumber | NSNumber of NSUInteger | 专辑歌曲数 |
MPMediaItemPropertyArtist | NSString | 艺术家/歌手 |
MPMediaItemPropertyArtwork | MPMediaItemArtwork | 封面图片 |
MPMediaItemPropertyComposer | NSString | 作曲 |
MPMediaItemPropertyDiscCount | NSNumber of NSUInteger | 专辑数 |
MPMediaItemPropertyDiscNumber | NSNumber of NSUInteger | 专辑编号 |
MPMediaItemPropertyGenre | NSString | 类型/流派 |
MPMediaItemPropertyPersistentID | NSNumber of uint64_t | 唯一标识符 |
MPMediaItemPropertyPlaybackDuration | NSNumber of NSTimeInterval | 歌曲时长 |
MPMediaItemPropertyTitle | NSString | 歌曲名称 |
MPNowPlayingInfoPropertyElapsedPlaybackTime | NSNumber (double) | 在播资源的时间流逝,s为单位。流逝时间会从播放时间和播放速率中自动计算,不合适频繁得更新 |
MPNowPlayingInfoPropertyPlaybackRate | NSNumber (double) | 在播资源的速率(保持与APP内播放器的速率一致) |
MPNowPlayingInfoPropertyDefaultPlaybackRate | NSNumber (double) | 在播资源的“默认”播放速率,当你的APP需要播放资源的播放速率默认都是大于1的,那么就应该使用这属性 |
MPNowPlayingInfoPropertyPlaybackQueueIndex | NSNumber (NSUInteger) | 应用重放队列中,当前播放项的索引。注意索引值从0开始 |
MPNowPlayingInfoPropertyPlaybackQueueCount | NSNumber (NSUInteger) | 应用重放队列的总资源数目 |
MPNowPlayingInfoPropertyChapterNumber | NSNumber (NSUInteger) | 这在播放的部分,索引值从0开始 |
MPNowPlayingInfoPropertyChapterCount | NSNumber (NSUInteger) | 在播资源的总章节数目 |
MPNowPlayingInfoPropertyIsLiveStream(iOS 10.0) | NSNumber (BOOL) | 表示当前的资源是不是实时流 |
MPNowPlayingInfoPropertyAvailableLanguageOptions(iOS 9.0) | NSArrayRef of MPNowPlayingInfoLanguageOptionGroup | 在播资源的一组可用的语言类型。在给定组中一次只能播放一种语言类型的资源 |
MPNowPlayingInfoPropertyCurrentLanguageOptions(iOS 9.0) | NSArray of MPNowPlayingInfoLanguageOption | 当前播放项目的语言选项列表 |
MPNowPlayingInfoCollectionIdentifier(iOS 9.3) | NSString | 表示当前播放资源所归属的那个集合的标识符,可指作者、专辑、播放列表等。可用于请求重新播放这个集合。 |
MPNowPlayingInfoPropertyExternalContentIdentifier(iOS 10.0) | NSString | 一个不暴露的唯一标志符,标志当前正在播放的item,贯穿APP重启。可使用任何格式,仅用于引用这个item和返回到正在播放资源的APP中 |
MPNowPlayingInfoPropertyExternalUserProfileIdentifier(iOS 10.0) | NSString | 一个可选型的不暴露的标志,标志当前正在播放的资源的配置文件,贯穿APP重启。可使用任何格式,仅用于返回到这个配置文件对应的正在播放视频的APP |
MPNowPlayingInfoPropertyServiceIdentifier(iOS 11.0) | NSString | 服务商的唯一标志。如果当前播放的资源属于一个频道或者是定于的服务类型,这个ID可以用于区分和协调特定服务商的多种资源类型 |
MPNowPlayingInfoPropertyPlaybackProgress(iOS 10.0) | NSNumber (float) | 表示当前播放资源的播放进度,0.0表示未开始,1.0表示完全浏览完。区分于ElapsedPlaybackTime,无需更高的精度要求。如:当字幕开始滚动时,这个电影可能被用户期望开始播放(由字幕驱动播放进度) |
MPNowPlayingInfoPropertyMediaType | NSNumber (MPNowPlayingInfoMediaType) | 指定当前媒体类型,用于确定系统显示的用户界面类型 |
MPNowPlayingInfoPropertyAssetURL(iOS 10.3) | NSURL | 指向当前正播放的视频或音频资源的URL。可将视频缩略图或者音频的波普图使用于系统的UI上 |
3:使用方法:
3.1:引用头文件
#import
#import
#import
3.2: 设置锁屏信息显示
- (void)setLockScreenDisplay
{
NSMutableDictionary *info = [NSMutableDictionary dictionary];
[info setObject:_roomName forKey:MPMediaItemPropertyTitle];//标题
// [info setObject:@"作者" forKey:MPMediaItemPropertyArtist];//作者
// [info setObject:@"专辑作者" forKey:MPMediaItemPropertyAlbumArtist];//专辑作者
[info setObject:[[MPMediaItemArtwork alloc]initWithImage:[UIImage imageNamed:@"LockIcon"]] forKey:MPMediaItemPropertyArtwork];//显示的图片
[info setObject:[NSNumber numberWithDouble:_duration] forKey:MPMediaItemPropertyPlaybackDuration];//总时长
[info setObject:[NSNumber numberWithDouble:0] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];//当前播放时间
[info setObject:[NSNumber numberWithFloat:1.0] forKey:MPNowPlayingInfoPropertyPlaybackRate];//播放速率
[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:info];
}
3.3:设置支持后台播放
- (void)playingBackground
{
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];
[session setActive:YES error:nil];
}
注意 需要在视频处于播放状态后再设置完锁屏界面和支持后台播放,然后要变成第一响应者,所以调用顺序为
[self setLockScreenDisplay];//设置锁屏界面视图
[self playingBackground];//后台支持播放
[self becomeFirstResponder];
[[UIApplication sharedApplication]beginReceivingRemoteControlEvents];
3.4:更新当前播放进度
-(void)updateCurrentDurtion:(int)currentDurtion{
NSMutableDictionary *info = [[[MPNowPlayingInfoCenter defaultCenter]nowPlayingInfo] mutableCopy];
[info setObject:[NSNumber numberWithDouble:currentDurtion] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime];
[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:info];
// NSLog(@"当前播放进度:%lf", currentDurtion);
}
3.5:更新当前回放速率
-(void)updatePlayBackRate:(float)rate{
NSMutableDictionary *info = [[[MPNowPlayingInfoCenter defaultCenter]nowPlayingInfo] mutableCopy];
[info setObject:[NSNumber numberWithFloat:rate] forKey:MPNowPlayingInfoPropertyPlaybackRate];
[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:info];
}
3.6:更新歌词信息
-(void)updateCurrentChat:(NSString *)str{
// NSLog(@"currentChat:%@", str);
NSMutableDictionary *info = [[[MPNowPlayingInfoCenter defaultCenter]nowPlayingInfo] mutableCopy];
[info setObject:str forKey:MPMediaItemPropertyArtist];
[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:info];
}
3.7:播放暂停方法
- (void)resumeAndPauseWhtherPause:(BOOL)pause
{
NSMutableDictionary *info = [[[MPNowPlayingInfoCenter defaultCenter]nowPlayingInfo] mutableCopy];
if (pause) {
[info setObject:[NSNumber numberWithFloat:0.00001] forKey:MPNowPlayingInfoPropertyPlaybackRate];
}else
{
[info setObject:[NSNumber numberWithFloat:1.0] forKey:MPNowPlayingInfoPropertyPlaybackRate];
}
[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:info];
}
3.9:锁屏控制
- (void)remoteControlReceivedWithEvent:(UIEvent *)event
{
if (event.type == UIEventTypeRemoteControl) {
switch (event.subtype) {
case UIEventSubtypeRemoteControlPlay://播放
NSLog(@"开始播放");
break;
case UIEventSubtypeRemoteControlPause://暂停
NSLog(@"暂停播放");
break;
case UIEventSubtypeRemoteControlStop://停止
break;
case UIEventSubtypeRemoteControlTogglePlayPause://切换播放暂停(耳机线控)
break;
case UIEventSubtypeRemoteControlNextTrack://下一首
NSLog(@"下一首");
break;
case UIEventSubtypeRemoteControlPreviousTrack://上一首
NSLog(@"上一首");
break;
case UIEventSubtypeRemoteControlBeginSeekingBackward://开始快退
NSLog(@"开始快退");
break;
case UIEventSubtypeRemoteControlEndSeekingBackward://结束快退
NSLog(@"结束快退");
break;
case UIEventSubtypeRemoteControlBeginSeekingForward://开始快进
NSLog(@"开始快进");
break;
case UIEventSubtypeRemoteControlEndSeekingForward://结束快进
NSLog(@"结束快进");
break;
default:
break;
}
}
}