2013-04-25 11 views
12

Mam awarię mającą wpływ na około 10% moich użytkowników, ale nie jestem w stanie jej odtworzyć i nie wiem dokładnie kiedy to się stanie.Crash in - [AVPlayerItem _attachToPlayer:] AVPlayerItem nie może być powiązany z więcej niż jednym wystąpieniem AVPlayer

Crashlytics zgłasza, że ​​połowa użytkowników, którzy ulegli awarii, nie jest w centrum zainteresowania aplikacji, tj. wykonywanie dźwięku w tle lub AirPlay. Aplikacja odtwarza strumień wideo HLS i przełącza na wersję audio tylko w tle.

Jakieś pomysły, co jest nie tak, lub dlaczego istnieje wiele instancji AVPlayer z mojej singletonowej klasy Player?

Dzięki!

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

Może doszło do awarii podczas próby ponownego połączenia po spadku lub niskiej łączności? – Winston

+0

Widząc ten sam problem w naszej aplikacji w Crashlytics, nie znaleźliśmy problemu. Jest to jedna z naszych najlepszych awarii systemu iOS 7, a dla nas 97% użytkowników ma w centrum zainteresowania aplikację. – ToddH

+0

Widzimy również tysiące awarii z tym samym logiem. Ponieważ nie mamy żadnych odtwarzaczy filmów w naszej aplikacji, dzieje się tak, gdy użytkownicy oglądają filmy w przeglądarce aplikacji. Uważamy, że problem został rozwiązany w przypadku filmów wyświetlających reklamy przed wideo (na przykład DailyMotion), a następnie następuje awaria po przełączeniu z odtwarzacza reklam do rzeczywistego odtwarzacza. Nie udało się tego naprawić, ponieważ nie ma go w naszym kodzie. Myślę, że to błąd iOS7. – Accatyyc

Odpowiedz

1

Znaleziono przyczynę tego problemu ... Jeśli MovieViewController został stworzony, i jest obecnie buforujące (tj stan! = MPMovieLoadStatePlayable lub MPMovieLoadStatePlaythroughOK) nazywając „play” metoda padnie aplikację z tego wyjątku.

+0

Zaktualizowałem aplikację tak, aby wywoływała tylko grę, gdy nie była buforowana, ale awarie nadal się pojawiają, nadal nie mogę się reprodukować. – THM

5

Wygląda na to, że został rozwiązany przez wyraźne zatrzymanie odtwarzania przed ustawieniem nowego adresu URL, np.

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

Spróbuj ustawić ContentURL po SourceType

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

Jeżeli nie jesteś pewien rodzaj zawartości wideo idziesz pobrać ustawić typ źródła nieznanych. Będzie to działać we wszystkich przypadkach.

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

kilka rzeczy do rozważenia:

  1. pełnomocnika między pozycji gracza, a gracz będzie zapewnić środki do kontrolowania dostępu do pozycji gracza za pomocą wystąpień AVPlayer.

  2. Powiązane odwołania umożliwiają przechowywanie właściwości dodanych do danej klasy za pośrednictwem kategorii; więc możesz stworzyć kategorię dla klasy item gracza, która składa się z jednej właściwości, która jest ustawiona za każdym razem, gdy element gracza jest przypisany do AVPlayer (na przykład jest to ciąg opisów). Aby upewnić się, że przedmiot gracza nie jest przypisany do innego gracza, po prostu porównaj opis zachowany w AVPlayer z opisem zwróconym przez gracza, którego dotyczy.

Powiązane problemy