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:
- 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?
- 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.
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
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