如何使用AvAudioPlayer实现MPNowPlayingInfoCenter

时间:2016-10-26 09:37:27

标签: ios objective-c avaudioplayer mpnowplayinginfocenter

我正在为一个能播放各种音轨的客户创建一个iOS移动应用程序。

我想要实现的功能之一是在锁定屏幕和横幅上显示有关当前正在播放的音轨的信息。这是移动用户的简单方便之一,如果您的应用具有播放背景音频,则必须具备此功能。就个人而言,我一直都在使用这个功能!

1 个答案:

答案 0 :(得分:1)

您应首先观察AVPlayerItem的{​​{1}},如此:

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