Как получить описание ошибки при сбое воспроизведения на MPMoviePlayerController - PullRequest
10 голосов
/ 18 марта 2011

Я хочу показать UIAlert, если не удается воспроизвести видео. Итак, я зарегистрировал MPMoviePlayerPlaybackDidFinishNotification для моего Movie Player:

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (myMovieFinishedCallback :) name: MPMoviePlayerPlaybackDidFinishNotification объект: self.moviePlayer];

В моем myMovieFinishedCallback: я проверяю, есть ли в словаре информации пользователя объект с именем error. На моем реальном устройстве я не получаю эту ошибку (нет сетевой ошибки, ошибка 404 для файла). На симуляторе iPhone я получаю сообщение об ошибке.

Как правильно проверить обоснование при получении MPMoviePlayerPlaybackDidFinishNotification?

Ответы [ 3 ]

18 голосов
/ 24 марта 2011

К сожалению, MPMoviePlayerController (до, но не включая iOS 4.3) не имеет подробного определения проблем из того, что доступно из документации. Он просто возвращает MPMovieFinishReasonPlaybackError в случае любой проблемы в UserInfo этого MPMoviePlayerPlaybackDidFinishNotification.

В iOS 4.3 мы наконец получили свойства errorLog и accessLog, содержащие расширенную и довольно полезную информацию. См. Справочник MPMoviePlayerController .

В iOS 5.0 есть ключ error, который поставляется с этим уведомлением также о сборках устройства, а не только внутри симулятора. Это error является экземпляром NSError и предоставляет очень полезную информацию. К сожалению, это не было задокументировано Apple, поэтому оно может измениться в любом выпуске iOS. Кроме того, кажется, что нет никаких объяснений по приведенным кодам ошибок. Например, HTTP-статус: 404 приведет к коду ошибки -1100 в данном экземпляре ошибки. Однако это будет примером того, как обработать это уведомление наиболее правильным способом.

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(handleMPMoviePlayerPlaybackDidFinish:)
                                            name:MPMoviePlayerPlaybackDidFinishNotification
                                          object:nil];

Это был бы правильный обработчик уведомлений:

- (void)handleMPMoviePlayerPlaybackDidFinish:(NSNotification *)notification
{
    NSDictionary *notificationUserInfo = [notification userInfo];
    NSNumber *resultValue = [notificationUserInfo objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey];
    MPMovieFinishReason reason = [resultValue intValue];
    if (reason == MPMovieFinishReasonPlaybackError)
    {
        NSError *mediaPlayerError = [notificationUserInfo objectForKey:@"error"];
        if (mediaPlayerError) 
        {
            NSLog(@"playback failed with error description: %@", [mediaPlayerError localizedDescription]);
        }
        else
        {
            NSLog(@"playback failed without any given reason");
        }
    }
}

И последнее, но не менее важное: не забудьте удалить этот обработчик уведомлений из центра по умолчанию при освобождении экземпляра объекта, с которым вы его обрабатываете.

[[NSNotificationCenter defaultCenter] removeObserver:self
                                                name:MPMoviePlayerPlaybackDidFinishNotification
                                              object:nil];
2 голосов
/ 25 февраля 2012

У меня была такая же проблема.Хотя я регистрировал функцию обратного вызова MPMoviePlayerLoadStateDidChangeNotification и получал ошибку из переменной userInfo, она не показывала ошибку.Я потратил много времени на поиск по форумам и, поиграв с кодом, понял, в чем проблема.

Сначала вам нужно зарегистрировать функцию обратного вызова:

 // Register that the did finish notification (movie stopped)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMovieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:self.moviePlayer];

в MovieFinishedВам понадобится функция обратного вызова:

NSDictionary *notice = [paramNotification userInfo];

if (notice != nil)
{
    NSError *errorInfo = [notice objectForKey:@"error"];

    if ( errorInfo != nil ) {
        UIAlertView *notice = [[UIAlertView alloc] initWithTitle:@"Error" message:[errorInfo localizedDescription] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];   
        [notice show];
        [notice release];            
    }
}

Этот код покажет любую ошибку, связанную с контроллером фильма.Итак ... в чем была проблема в моем коде? .. Я использовал метод [moviecontroller play] в неправильных местах, поэтому проверьте его в своем.

Удачи!

0 голосов
/ 25 марта 2011

Вы можете посмотреть значение за userinfo в словаре MPMoviePlayerPlaybackDidFinishReasonUserInfoKey. Если значение MPMovieFinishReasonPlaybackError, вы можете предположить, что некоторые вещи пошли не так. Этот метод довольно надежен.

...