2016-10-26 5 views
0

다양한 오디오 트랙을 재생할 클라이언트 용 iOS 모바일 앱을 만드는 중입니다.AvAudioPlayer를 사용하여 MPNowPlayingInfoCenter를 구현하는 방법

구현하려는 기능 중 하나는 잠금 화면과 배너에서 현재 재생중인 오디오 트랙에 대한 정보를 표시하는 것이 었습니다. 이것은 모바일 사용자가 간편하게 사용할 수있는 기능 중 하나이며 앱에 백그라운드 오디오가 재생되어야하는 경우 필수 기능입니다. 개인적으로, 나는 항상이 기능을 사용합니다!

답변

1

먼저과 같이 AVAudioPlayerAVPlayerItem을 준수해야합니다

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

그런 다음 몇 가지 글로벌 변수를 만들 : 당신은 관찰 할 수 있도록

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

그러면 아마, 아래와 같은 기능을 필요 키 경로 timedMetadataupdateInfoCenterWithTitle: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]}]; 
} 
관련 문제