5

Ich entwickle eine Musik-Anwendung, die Musik im Hintergrund abspielen sollte.xcode - MPNowPlayingInfoCenter Info wird nicht auf iOS 8 angezeigt

Ich verwende die MPMoviePlayerController, um die Musik zu spielen.

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]; 

Wenn ich ausführen [self.player play]; die Musik beginnt: Mein Code der MPMoviePlayerController einzuleiten. Aber ich möchte auch den Namen des Songs, den Namen des Albums und das Cover des Albums im LockScreen und im ControlCenter anzeigen. Ich verwende den folgenden Code:

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

Aber nichts wird auf dem LockScreen angezeigt. Es wird auch nicht im ControlCenter angezeigt.

Wie kann ich mein Problem lösen? Ich habe im Internet nichts gefunden.

Vielen Dank im Voraus, Fabian.

+0

Wird Ihr Code tatsächlich ausgeführt? – matt

+0

Ja, [[MPNowPlayingInfoCenter defaultCenter] .nowPlayingInfo objectForKey: MPMediaItemPropertyTitle] gibt den richtigen SongName zurück. – FTFT1234

+0

Aha! Das sind wirklich gute Neuigkeiten. Es läuft also nicht nur der Code, sondern auch die 'nowPlayingInfo'. Also lassen Sie mich Sie fragen - sind Sie Ersthelfer, damit Sie die Fernsteuerungs-Ereignisse erfolgreich vom Sperrbildschirm und vom Kontrollzentrum empfangen? – matt

Antwort

26

Das Problem ist, dass Sie die Anforderungen nicht erfüllen, um Master des Sperrbildschirms und der Steuerzentrale zu werden, wie I explain in my book. Sie sollten die modernen (iOS 8) Äquivalent davon zu sehen sein:

enter image description here

Die Tatsache, dass Sie nicht sehen es zeigt, dass Sie eine oder mehrere der Anforderungen weggelassen, die ich (in zitiere direkt aus mein Buch hier):

  • Ihre App eine UIResponder in seiner Responder-Kette, dass JA zurück von canBecomeFirstResponder, und dass Responder muss tatsächlich seinen Ersthelfer enthalten muss.
  • Einige UIResponder in der Antwortkette, bei oder über dem Ersthelfer, müssen remoteControlReceivedWithEvent: implementieren.
  • Ihre App muss die UIApplication Instanzmethode beginReceivingRemoteControlEvents aufrufen.
  • Die Audio-Richtlinie Ihrer App muss Playback sein.
  • Ihre App muss etwas Ton ausgeben.

Ich weiß nicht, welche von denen Sie weglassen; es könnte mehr als eins sein. Vielleicht möchten Sie Ihren Code mit einem Arbeitsbeispiel vergleichen, hier:

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

+0

Ja, das ist die Lösung. Vielen Dank für Ihre Hilfe! – FTFT1234

+0

Sie sind herzlich willkommen. Es sind viele Anforderungen! Einen von ihnen auszulassen, ist einfach, und dann funktionieren die Dinge auf mysteriöse Weise nicht. :( – matt

+0

Viel Glück, dass dies funktioniert, wenn ich durch ein WKWebView spiele? Ich kann andere Quellen bekommen, um das gerade spielende zu ändern, nur nicht durch WKWebView. – pir800

5

Want @ matt Antwort erweitern - Einstellung nowPlayingInfo nutzlos ist, wenn Sie AVAudioSessionCategoryOptionMixWithOthers Option verwenden.

0

Erweitern Sie weiter @ matt Antwort, ist es erforderlich, dass Sie endReceivingRemoteControlEvents und resignFirstResponder aufrufen, wenn die App wieder in den Vordergrund kommt (applicationDidBecomeActive). Andernfalls nimmt das Betriebssystem an, dass Sie ein schlechter Akteur sind (oder vergessen haben, sie auszuschalten) und deaktiviert Ihre Fähigkeit, die Schlafsteuerelemente vollständig anzuzeigen, selbst wenn Sie erneut beginReceivingRemoteControlEvents aufrufen. Ich habe diese Anrufe hinzugefügt und jetzt zeigen die Sleep Controls immer, wann sie sollten.

Verwandte Themen