2010-08-21 10 views
10

Sto utilizzando una proprietà di lettore musicale per il controller del lettore iPod.MPMusicPlayerController: l'iPod interrompe l'invio di notifiche, quando l'app iPod viene interrotta in background

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

Durante l'elaborazione in background, se iPod giocatore app è terminata, la console stampe fuori:

MediaPlayer: Message playbackState timed out. 

Se non va in crash (o si blocca, rallentando le prestazioni), la notifica non è inviati ai miei metodi di osservazione più. Posso ancora inviare messaggi come:

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

ma non posso ricevere alcuna notifica

Le mie domande sono:

  1. è che ci sono modo per riassegnare, ricaricare puntatori durante il runtime? Come posso ripristinare la proprietà come proprio come quando è stata lanciata per la prima volta?
  2. Come posso catturare il messaggio: "MediaPlayer: Message playbackState scaduto." nell'output della console? Non è come usare NSLog.

Grazie per avermi aiutato.

AGGIORNATO: Sembra utilizzando assign o weak per la proprietà ipodPlayer è stata la soluzione. Inoltre, l'accesso è fatto con l'ipotesi che la proprietà potrebbe non esserci. Dopo molte prove e un anno di utilizzo effettivo nella mia app, penso che questa fosse la soluzione giusta.

+0

Stai utilizzando iOS 5? In caso contrario, procedere nel modo seguente: self.ipodPlayer = [MPMusicPlayerController ...] Altrimenti in teoria l'istanza creata da iPodMusicPlayer viene raccolta e non è stato aumentato il conteggio ref in modo da ottenere un puntatore nullo ad un certo punto. A meno che non chiami quel metodo prima di ogni interazione con il lettore musicale, che potrebbe essere un'altra ragione per i tuoi problemi. Una istanza viene raccolta e tu non ti leghi alla nuova istanza? – hktegner

+0

Grazie per aver commentato questo vecchio post. Avevo cambiato il mio flusso di accesso a questa proprietà ipodPlayer con la possibilità della sua assenza. Quindi, ho reso la proprietà usare 'assign' o' weak' e inizializzato con '[MPMusicPlayerController iPodMusicPlayer];' ogni volta che non è lì – petershine

risposta

1

Ho riscontrato un problema simile con il mio MpMoviePlayerController in iOS 5. Ho trovato una correzione che si è occupata di esso. Potrebbe funzionare anche qui.

Add:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

in viewDidLoad.

Altro altro post

+0

Grazie per aver risposto a questo vecchio post. Dato che non sto usando 'AVAudioPlayer', non so se questa è la soluzione giusta per me. Invece, mi sono assicurato di usare assegnamento debole per la proprietà di iPodPlayer e da quando l'ho usato in questo modo, il verificarsi di crash non è quasi finito. Suppongo che abbia a che fare con il riferimento a un oggetto che non è di mia proprietà. Grazie comunque – petershine