2013-09-20 21 views
8

Ho un'applicazione iOS7 con lettore musicale. Sto utilizzando il seguente codice per verificare le modifiche dello stato di riproduzione da MPMusicPlayerController per aggiornare l'interfaccia utente. Più precisamente alterno l'aspetto del pulsante di riproduzione tra riproduzione e pausa.iOS7 MPMusicPlayerController afferma errato

[[NSNotificationCenter defaultCenter] addObserver: self 
        selector: @selector (handle_NowPlayingItemChanged:) 
         name: MPMusicPlayerControllerNowPlayingItemDidChangeNotification 
        object: self.musicPlayer]; 

[[NSNotificationCenter defaultCenter] addObserver: self 
        selector: @selector (handle_PlaybackStateChanged:) 
         name: MPMusicPlayerControllerPlaybackStateDidChangeNotification 
        object: self.musicPlayer]; 

[self.musicPlayer beginGeneratingPlaybackNotifications]; 

se faccio funzionare l'app su iOS7 su un iPad o iPhone, ottengo il seguente sequenza invece di una sola richiamata:

-[MyMediaPlayer handle_PlaybackStateChanged:] :: playbackState: 1 
-[MyMediaPlayer handle_PlaybackStateChanged:] :: playbackState: 2 
-[MyMediaPlayer handle_PlaybackStateChanged:] :: playbackState: 1 
-[MyMediaPlayer handle_PlaybackStateChanged:] :: playbackState: 2 

playbackState 2 significa MPMusicPlaybackStatePaused e causa la mia applicazione per visualizzare la stato errato nell'interfaccia utente, mentre la canzone viene effettivamente riprodotta. Non ha senso che il callback venga chiamato 4 volte, con valori alternati.

Ciò accade quando si modifica solo la coda. Sembra che il sistema non cancelli correttamente la coda.

Qualche idea su come risolvere questo?

risposta

4

Ho riscontrato lo stesso problema dal rilascio di iOS 7. È defeinitivamente un problema con iOS; Non solo è segnalando uno stato di riproduzione non corretta, ma anche in occasioni non riesce a ricevere le notifiche di modifica di riproduzione stato (MPMusicPlayerControllerPlaybackStateDidChangeNotification)

Ho segnalato il bug ad Apple e vi suggerisco di fare la stessa cosa (Apple Bug Reporter)

+0

Sì, ho inviato un bug ad Apple ma ho bisogno di una soluzione alternativa per risolvere ... – swifferina

+1

@ user1763004 Non c'è soluzione per questo. Se a volte viene assegnato lo stato di riproduzione errato, non è possibile determinare se sia giusto o sbagliato per un dato momento. Immagino che l'unica altra opzione sia avere un pulsante play e pause, ma suppongo che non sia qualcosa che vuoi. – sooper

+0

Ho questo problema anche su un lettore musicale.Non c'è modo di sbarazzarsi di quello finora. Questo è un problema serio su iOS7. – loretoparisi

4

Ho avuto lo stesso problema. Ho trovato questa soluzione, invece di utilizzare playbackState per controllare se l'audio è in riproduzione, ho usato questa condizione:

if([[AVAudioSession sharedInstance] isOtherAudioPlaying])

3

Un'altra soluzione è controllare:

if([[MPMusicPlayerController iPodMusicPlayer] currentPlaybackRate] == 0) 
+1

Trovo che il controllo di 'currentPlaybackRate' risolva il problema che stavo riscontrando. Tuttavia, non dovresti mai confrontare un float usando l'uguaglianza! – matt

1

La soluzione dipende l'implementazione di i callback Quello che ho fatto è il seguente:

(1) Sopprimere i callback durante il cambio di coda. Quindi, ho un ivor BOOL doNotNoteNowPlayingItem. Un esempio di callback inizia così:

if (self.doNotNoteNowPlayingItem) // flag to prevent 
     return; 

Così, quando sto per cambiare la coda, alzo la bandiera, l'impostazione di questa ivar su YES, e abbasso di nuovo quando sto per impostare il nowPlayingItem e sono di nuovo pronto per le callback. Altre callback funzionerebbero allo stesso modo.

(2) Non utilizzare playbackState come prova di se stiamo giocando contro pausa. La risposta sarà giusta se ci fermiamo, ma se stiamo giocando, la risposta potrebbe essere segnalata come in pausa. Per distinguere la riproduzione dalla pausa, selezionare currentPlaybackRate; se è vicino a 1 stiamo giocando, ma se è vicino a 0 siamo in pausa.