Как реализовать MPNowPlayingInfoCenter с помощью AvAudioPlayer

Я занимаюсь созданием мобильного приложения iOS для клиента, которое будет воспроизводить различные звуковые дорожки.

Одной из фич, которую я хотел реализовать, было отображение информации о воспроизводимой в данный момент звуковой дорожке на экране блокировки и баннере. Это одно из тех простых удобств для мобильного пользователя, которое необходимо, если в вашем приложении воспроизводится фоновый звук. Лично я пользуюсь этой функцией постоянно!


person linto jacob    schedule 26.10.2016    source источник


Ответы (1)


Сначала вы должны наблюдать AVPlayerItem из AVAudioPlayer следующим образом:

[playerItem addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionNew context:nil];

Затем создайте несколько глобальных переменных:

NSString *title;
NSString *artist;
UIImage *artwork;

Затем вам, вероятно, понадобится функция, подобная приведенной ниже, поэтому вы наблюдаете ключевой путь timedMetadata и обновляете InfoCenter через 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]}];
}
person Ramon    schedule 26.10.2016