Ответ 1
К сожалению, MPMoviePlayerController
(вплоть до iOS 4.3) до сих пор не содержит подробной информации о проблемах из того, что доступно в документации. Он просто возвращает MPMovieFinishReasonPlaybackError
в случае каких-либо проблем в UserInfo этого MPMoviePlayerPlaybackDidFinishNotification
.
С iOS 4.3 мы наконец получили свойства errorLog
и accessLog
, содержащие расширенную и довольно полезную информацию.
См. Справка MPMoviePlayerController.
В iOS 5.0 есть ключ error
, который приходит с этим уведомлением также в строках устройства, а не только в симуляторе. Это error
является экземпляром NSError
и предоставляет очень полезную информацию. К сожалению, это не было зарегистрировано Apple, поэтому оно может измениться при любой выпуске iOS. Кроме того, похоже, что никаких пояснений по данным кодам ошибок нет. Например, HTTP-Status: 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];