К сожалению, 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];