2013-04-25 6 views
12

ho avuto un arresto anomalo che ha colpito circa il 10% dei miei utenti, ma non riesco a riprodurlo e non lo so esattamente quando questo accade.Arresto anomalo - [AVPlayerItem _attachToPlayer:] Un AVPlayerItem non può essere associato a più di un'istanza di AVPlayer

Crashlytics segnala che metà degli utenti che si bloccano hanno l'App non a fuoco, I.e. facendo audio di sottofondo o AirPlay. L'App riproduce un flusso video HLS e passa a una versione solo audio in background.

Qualche idea cosa non va, o perché ci sono più istanze di AVPlayer dalla mia classe di giocatore Singleton?

Grazie!

Exception Type: 
NSInvalidArgumentException 
Reason: 
An AVPlayerItem cannot be associated with more than one instance of AVPlayer 
Fatal Exception 
Latest Crash: 4/06/2013 at 8:48:46 UTC+0200 
0 CoreFoundation __exceptionPreprocess + 162 
1 libobjc.A.dylib objc_exception_throw + 30 
2 AVFoundation -[AVPlayerItem _attachToPlayer:] + 188 
3 AVFoundation -[AVPlayer _attachItem:andPerformOperation:withObject:] + 336 
4 AVFoundation -[AVPlayer _insertItem:afterItem:] + 26 
5 AVFoundation -[AVQueuePlayer insertItem:afterItem:] + 136 
6 MediaPlayer __block_global_4 + 520 
7 
... 
libdispatch.dylib _dispatch_call_block_and_release + 10 
14 
+1

Forse si verifica un arresto anomalo quando si tenta di riconnettersi dopo una caduta o una bassa connettività? – Winston

+0

Vedendo questo stesso problema nella nostra app in Crashlytics, non abbiamo rintracciato il problema. È uno dei nostri principali crash di iOS 7 e per noi il 97% degli utenti ha l'app in primo piano. – ToddH

+0

Vediamo anche migliaia di arresti anomali con lo stesso registro. Poiché nella nostra app non sono presenti lettori di film, ciò accade quando gli utenti guardano film in un browser in-app. Pensiamo di aver rintracciato il problema nei video che mostrano annunci prima del video (ad esempio DailyMotion) e poi l'arresto si verifica quando passa dal giocatore dell'annuncio al giocatore reale. Non siamo stati in grado di risolverlo poiché non è nel nostro codice. Penso che sia un bug iOS7. – Accatyyc

risposta

1

trovato la causa di questo problema ... Se MovieViewController è stato creato, ed è attualmente il buffering (cioè lo stato! = MPMovieLoadStatePlayable o MPMovieLoadStatePlaythroughOK) Metodo di chiamare 'play' andrà in crash l'applicazione con questa eccezione.

+0

Ho aggiornato l'app per chiamare solo play quando non si esegue il buffering, ma gli arresti anomali si verificano ancora, non riesco ancora a riprodurre me stesso. – THM

5

Sembra risolto interrompendo esplicitamente la riproduzione prima di impostare un nuovo URL, ad es.

[moviePlayer stop]; 
moviePlayer.movieSourceType = MPMovieSourceTypeStreaming; 
[moviePlayer setContentURL:[NSURL URLWithString:[videos objectForKey:quality]]]; 
1

tenta di impostare la contentURL dopo la SourceType

moviePlayerController_ = [[MPMoviePlayerViewController alloc] init]; 
moviePlayerController_.movieSourceType = MPMovieSourceTypeStreaming; 
[moviePlayerController_.moviePlayer setContentURL:url]; 
0

Se non si è sicuri tipo di URL del video che si sta recuperare impostare il tipo di fonte alla sconosciuta. Questo funzionerà per tutti i casi.

moviePlayerController = [[MPMoviePlayerViewController alloc] init]; 
moviePlayerController.movieSourceType = MPMovieSourceTypeUnknown; 
[moviePlayerController.moviePlayer setContentURL:url]; 
0

paio di cose da prendere in considerazione:

  1. proxy tra l'oggetto giocatore e il giocatore avrebbe fornito un mezzo per controllare l'accesso alla voce giocatore da istanze di AVPlayer.

  2. I riferimenti associati consentono di memorizzare le proprietà aggiunte a una determinata classe tramite una categoria; pertanto, è possibile creare una categoria per la classe articolo del giocatore che consiste in una singola proprietà che viene impostata ogni volta che l'elemento giocatore è assegnato ad un AVPlayer (ad esempio, è una stringa descrittiva). Per garantire che l'elemento giocatore non sia assegnato a un altro giocatore, è sufficiente confrontare la descrizione memorizzata con AVPlayer con quella restituita dal giocatore in questione.