2010-08-21 10 views
10

Ich verwende eine Musik-Player-Eigenschaft für den iPod-Player-Controller.MPMusicPlayerController: Der iPod hört auf, Benachrichtigungen zu senden, wenn die iPod App im Hintergrund beendet wird

// .h 
@property (nonatomic, retain) MPMusicPlayerController *ipodPlayer; 

// .m 
ipodPlayer = [MPMusicPlayerController iPodMusicPlayer]; 

NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 

[notificationCenter addObserver:self selector:@selector(changedPlaybackState:) name:MPMusicPlayerControllerPlaybackStateDidChangeNotification object:ipodPlayer]; 
[notificationCenter addObserver:self selector:@selector(changedNowPlayingItem:) name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification object:ipodPlayer]; 

[ipodPlayer beginGeneratingPlaybackNotifications]; 

Während der Hintergrundverarbeitung, wenn der iPod-Player App beendet wird, die Konsole druckt:

MediaPlayer: Message playbackState timed out. 

Wenn es nicht abstürzt (oder friert, verlangsamt Leistung) wird die Benachrichtigung nicht gesendet werden zu meinen Beobachtungsmethoden. Ich kann immer noch Nachrichten wie senden:

[ipodPlayer pause]; 
[ipodPlayer play]; 
[ipodPlayer skipToNextItem]; 
[ipodPlayer skipToPreviousItem]; 

kann aber keine Benachrichtigungen nicht erhalten

Meine Fragen sind:

  1. Gibt es sind Art und Weise neu zuordnen, laden Zeiger während der Laufzeit? Wie kann ich die Eigenschaft wiederherstellen, genau wie beim ersten Start?
  2. Wie kann ich fangen die Messe: "MediaPlayer: Message PlaybackState abgelaufen." in der Konsolenausgabe? Dies ist nicht wie NSLog verwenden.

Vielen Dank für Ihre Hilfe.

AKTUALISIERT: Es scheint wie assign oder weak für ipodPlayer Eigenschaft mit der Lösung. Der Zugriff darauf erfolgt unter der Annahme, dass die Eigenschaft möglicherweise nicht vorhanden ist. Nach vielen Versuchen und einem Jahr, in denen ich es tatsächlich in meiner App verwendet habe, war das die richtige Lösung.

+0

Verwenden Sie iOS 5? Wenn nicht, dann sollten Sie folgendes tun: selb.ipodPlayer = [MPMusicPlayerController ...] Andernfalls würde die von iPodMusicPlayer erstellte Instanz gesammelt werden und Sie hätten die ref-Zählung nicht erhöht, so dass Sie einen Nullzeiger erhalten würden irgendwann. Dies gilt nicht, wenn Sie diese Methode nicht vor jeder Interaktion mit dem Musikplayer aufrufen, was ein weiterer Grund für Ihre Probleme sein kann. Eine Instanz wird gesammelt und Sie binden sich nicht an die neue Instanz an. – hktegner

+0

Vielen Dank für das Kommentieren dieses alten Posts. Ich hatte meinen Zugriff auf diese ipodPlayer-Eigenschaft mit der Möglichkeit ihrer Abwesenheit geändert. Also habe ich die Eigenschaft 'assign' oder' weak' verwendet und initialisiert mit '[MPMusicPlayerController iPodMusicPlayer];' wann immer es nicht dort ist – petershine

Antwort

1

Ich hatte ähnliches Problem mit meinem MpMoviePlayerController in iOS 5. Ich fand eine Lösung, die sich darum kümmerte. Es könnte auch hier funktionieren.

Anzahl:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

in viewDidLoad.

Mehr meiner anderen post

+0

Vielen Dank für die Beantwortung dieser alten Post. Da ich 'AVAudioPlayer' nicht verwende, weiß ich nicht, ob dies die richtige Lösung für mich ist. Stattdessen habe ich sichergestellt, dass die Zuweisung für die iPodPlayer-Eigenschaft schwach ist, und seitdem es so verwendet wird, passiert das Auftreten eines Absturzes fast gar nicht. Ich vermute, es hat damit zu tun, dass ich auf ein Objekt referenziere, das mir nicht gehört. Danke trotzdem – petershine

Verwandte Themen