Как реализовать MPNowPlayingInfoCenter с помощью AvAudioPlayer
Я нахожусь в процессе создания мобильного приложения для iOS для клиента, который будет воспроизводить различные звуковые дорожки.
Одной из функций, которые я хотел реализовать, было отображение информации о воспроизводимой в данный момент звуковой дорожке на экране блокировки и баннере. Это одно из тех простых удобств для мобильного пользователя, которое необходимо иметь, если в вашем приложении воспроизводится фоновый звук. Лично я использую эту функцию все время!
1 ответ
Вы должны сначала соблюдать AVPlayerItem
из AVAudioPlayer
вот так:
[playerItem addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionNew context:nil];
Затем создайте несколько глобальных переменных:
NSString *title;
NSString *artist;
UIImage *artwork;
Тогда вам, вероятно, понадобится функция, подобная приведенной ниже, поэтому вы соблюдаете ключевой путь timedMetadata
и обновить инфоцентр через updateInfoCenterWithTitle:andArtist:andCover:
,
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"timedMetadata"])
{
for (int i = 0; i < [audioPlayer.currentItem.timedMetadata count]; i++)
{
AVMetadataItem *metaData = [audioPlayer.currentItem.timedMetadata objectAtIndex:i];
if ([[metaData commonKey] isEqualToString:AVMetadataCommonKeyArtist]) {
artist = (NSString *)metaData.value;
}
else if ([[metaData commonKey] isEqualToString:AVMetadataCommonKeyTitle])
{
title = (NSString *)metaData.value;
[self updateInfoCenterWithTitle:title andArtist:artist andCover:artwork];
}
else if ([[metaData commonKey] isEqualToString:AVMetadataCommonKeyArtwork])
{
if ([metaData.keySpace isEqualToString:AVMetadataKeySpaceID3])
{
NSDictionary *dictionary = [metaData.value copyWithZone:nil];
artwork = [UIImage imageWithData:[dictionary objectForKey:@"data"]]];
} else if ([metaData.keySpace isEqualToString:AVMetadataKeySpaceiTunes]) {
artwork = [UIImage imageWithData:[metaData.value copyWithZone:nil]];
}
}
else {
NSLog(@"%@ --> %@", [metaData commonKey], metaData.value);
}
}
}
}
Вот где происходит волшебство:
- (void)updateInfoCenterWithTitle:(NSString *)title andArtist:(NSString *)artist andCover:(UIImage *)cover
{
if (cover == nil) {
cover = [UIImage imageNamed:@"defaultCover"];
}
MPNowPlayingInfoCenter *infoCenter = [MPNowPlayingInfoCenter defaultCenter];
[infoCenter setNowPlayingInfo:@{MPMediaItemPropertyTitle:title,
MPMediaItemPropertyArtist:artist,
MPMediaItemPropertyArtwork:[[MPMediaItemArtwork alloc] initWithImage:cover]}];
}