2015-05-06 46 views
5

Zajmuję się tworzeniem aplikacji muzycznej, która powinna odtwarzać muzykę w tle.xcode - Informacje MPNowPlayingInfoCenter nie są wyświetlane na iOS 8

Używam MPMoviePlayerController do odtwarzania muzyki. Mój kod o wszczęciu MPMoviePlayerController:

NSString* resourcePath = [[NSBundle mainBundle] resourcePath]; 
resourcePath = [resourcePath stringByAppendingString:@"/music.m4a"]; 
NSError* err; 
self.player = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:resourcePath]]; 
if (err) { 
    NSLog(@"ERROR: %@", err.localizedDescription); 
} 
AVAudioSession *session = [AVAudioSession sharedInstance]; 
[session setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil]; 
[session setActive:YES error:nil]; 
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
[self.player setShouldAutoplay:NO]; 
[self.player setControlStyle: MPMovieControlStyleEmbedded]; 
self.player.view.hidden = YES; 
[self.player prepareToPlay]; 

Kiedy wykonać [self.player play]; zaczyna się muzyka. Ale chcę również wyświetlić nazwę piosenki, nazwę albumu i okładkę albumu na LockScreen i ControlCenter. Używam następującego kodu:

Class playingInfoCenter = NSClassFromString(@"MPNowPlayingInfoCenter"); 
    if (playingInfoCenter) { 
     NSMutableDictionary *songInfo = [[NSMutableDictionary alloc] init]; 
     MPMediaItemArtwork *albumArt = [[MPMediaItemArtwork alloc] initWithImage: [UIImage imageNamed:@"artwork.png"]]; 
     [songInfo setObject:@"SongName" forKey:MPMediaItemPropertyTitle]; 
     [songInfo setObject:@"ArtistName" forKey:MPMediaItemPropertyArtist]; 
     [songInfo setObject:@"AlbumTitle" forKey:MPMediaItemPropertyAlbumTitle]; 
     [songInfo setObject:albumArt forKey:MPMediaItemPropertyArtwork]; 
     [[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:songInfo]; 
    } 

Ale nic nie wyświetla się na ekranie blokady. Nie wyświetla się również na ControlCenter.

Jak mogę rozwiązać mój problem? Nic nie znalazłem w Internecie.

Z góry dzięki, Fabian.

+0

Czy twój kod rzeczywiście jest wykonywany? – matt

+0

Tak, [[MPNowPlayingInfoCenter defaultCenter] .nowPlayingInfo objectForKey: MPMediaItemPropertyTitle] zwraca prawą nazwę utworu. – FTFT1234

+0

Aha! To naprawdę świetna wiadomość. Nie tylko twój kod działa, ale tak naprawdę ustawia "nowPlayingInfo". Więc pozwól, że cię o to zapytam - czy jesteś pierwszą osobą reagującą, aby pomyślnie odebrać zdalne sterowanie z ekranu blokady i centrum sterowania? – matt

Odpowiedz

26

Problem polega na tym, że nie spełniasz wymagań, aby zostać mistrzem blokady ekranu i centrum sterowania, jako I explain in my book. Trzeba mieć widząc nowoczesne (iOS 8) odpowiednik tego:

enter image description here

Fakt, że nie widząc to sugeruje, że jesteś pominięcie jednego lub więcej wymogów, które wymieniam (powołując się bezpośrednio z moja książka tutaj):

  • Twoja aplikacja musi zawierać UIResponder w swoim łańcuchu reagujących że powraca TAK od canBecomeFirstResponder, a responder musi faktycznie być pierwsza odpowiedź.
  • Niektóre osoby korzystające z UIR w sieci odpowiadającej, na poziomie lub powyżej pierwszego obiektu odpowiadającego, muszą wdrożyć remoteControlReceivedWithEvent:.
  • Twoja aplikacja musi wywołać metodę instancji UIApplication beginReceivingRemoteControlEvents.
  • Zasady sesji aplikacji audio muszą być odtwarzane.
  • Twoja aplikacja musi wydawać jakiś dźwięk.

Nie wiem, które z pominięć; może to być więcej niż jeden. Może chcesz porównać kod z przykładu roboczego, tutaj:

https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/iOS7bookExamples/bk2ch14p653backgroundPlayerAndInterrupter/backgroundPlayer/backgroundPlayer/ViewController.m

+0

Tak, to jest rozwiązanie. Dziękuję bardzo za pomoc! – FTFT1234

+0

Serdecznie witamy. To wiele wymagań! Pominięcie jednego z nich jest łatwe, a następnie w tajemniczy sposób nie działa. :( – matt

+0

Przy odrobinie szczęścia działa to podczas odtwarzania przez WKWebView? Mogę zdobyć inne źródła, aby zmienić teraz odtwarzane, tylko nie podczas grania przez WKWebView. – pir800

5

Chcesz poszerzyć @ odpowiedź Matta - ustawienie nowPlayingInfo jest bezużyteczny podczas korzystania AVAudioSessionCategoryOptionMixWithOthers opcję.

0

Dalsze rozszerzenie odpowiedzi @ matt wymaga, aby zadzwonić pod numer endReceivingRemoteControlEvents i resignFirstResponder, gdy aplikacja wróci na pierwszy plan (applicationDidBecomeActive). W przeciwnym razie system operacyjny zakłada, że ​​jesteś złym aktorem (lub zapomniał go wyłączyć) i wyłącza możliwość całkowitego pokazania elementów sterowania senem, nawet po ponownym zadzwonieniu pod numer beginReceivingRemoteControlEvents. Dodałem te połączenia i teraz Kontrolki Snu zawsze pokazują, kiedy powinny.