2016-10-26 8 views
0

さまざまなオーディオトラックを再生するクライアント向けにiOSモバイルアプリケーションを作成中です。AvAudioPlayerを使用してMPNowPlayingInfoCenterを実装する方法

私が実装したい機能の1つは、現在再生中のオーディオトラックに関する情報をロック画面とバナーに表示することでした。これは、モバイルユーザーにとって単純な便利な機能の1つで、アプリでバックグラウンドのオーディオ再生が必要な場合に備えておく必要があります。個人的には、私はいつもこの機能を使っています!

答えて

1

あなたはまずそのようAVAudioPlayerAVPlayerItemを守るべきです。

[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]}]; 
} 
関連する問題