MPMoviePlayerViewController фоновая сделка. Как продолжить игру после возвращения с фона на передний план?

Я работаю над приложением для потоковой передачи видео. Он построен с ARC для iOS5. Для отображения просмотра я используюMPMoviePlayerViewController сюда:

.час

@interface EpisodesTableViewController : UITableViewController<EpisodeUrlResolverDelegate> {
    NSTimeInterval playbackTime;
    EpisodeUrlResolver *episodeUrlResolver;
}
@property (strong, nonatomic) MPMoviePlayerViewController *player;
@end

.m

@implementation EpisodesTableViewController
@synthesize episodes, player;

- (void)viewDidLoad
{
    [super viewDidLoad];
    episodeUrlResolver = [[Soap4MeEpisodeUrlResolver alloc] init];
    [episodeUrlResolver setDelegate:self];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterForeground) name:@"WillEnterForeground" object:nil];                 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willEnterBackground) name:@"WillEnterBackground" object:nil];
}

- (void)viewDidUnload
{
    episodeUrlResolver = nil;
    player = nil;
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"WillEnterForeground" object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"WillEnterBackground" object:nil];
    [super viewDidUnload];
}

- (void)url:(NSURL *)url WasResolvedForEpisode:(Episode *)episode {
    player = [[MPMoviePlayerViewController alloc] initWithContentURL:url];
    player.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    player.moviePlayer.allowsAirPlay = YES;
    [self presentModalViewController:player animated:YES];
}

- (void)willEnterBackground {
    if (player) {
        playbackTime = player.moviePlayer.currentPlaybackTime;
    }
}

- (void)willEnterForeground {
    if (!player)
        return;
    if(player.moviePlayer.playbackState == MPMoviePlaybackStateInterrupted || player.moviePlayer.playbackState == MPMoviePlaybackStateStopped || player.moviePlayer.playbackState == MPMoviePlaybackStatePaused)
    {
        [self continuePlayback];
    }
}

- (void)continuePlayback {
    [self presentModalViewController:player animated:YES];
    [player.moviePlayer setInitialPlaybackTime:playbackTime];
    NSLog(@"%f", player.moviePlayer.initialPlaybackTime);
    [player.moviePlayer play];
}

Несколько слов о представленном коде: когда URL для видео разрешен, я создаюMPMoviePlayerViewController объект для воспроизведения видео. Воспроизведение началось. Тогда, когда приложение собирается фон с кнопкой домойMPMoviePlayerViewController автоматически приостанавливает воспроизведение и исчезает с экрана (странное поведение, как по мне). Вот почему я должен сэкономить время воспроизведения, когда приложение идет в фоновом режиме и показать существующиеMPMoviePlayerViewController снова с восстановленным временем воспроизведения, когда приложение вернулось на передний план. Он отлично работает, когда пользователь нажимает кнопку «Домой», а затем возвращается в приложение.

Но это не работает, когда пользователь блокирует устройство.WillEnterBackground уведомление срабатывает, когда applicationWillEnterForeground называется, поэтому для события блокировки он тоже вызывается. Но в случае, когда пользователь блокирует устройство, MPMoviePlayerViewController не отклоняется должным образом, как в случае, когда пользователь нажимает кнопку «Домой». Он скрыт от экрана, но вызывает код

[self presentModalViewController:player animated:YES];

бросает исключение

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present modally an active controller <EpisodesTableViewController: 0x91b3950>.'

Я попытался изменить код для отклонения контроллера:

- (void)willEnterForeground {
        if (!player)
            return;
        if(player.moviePlayer.playbackState == MPMoviePlaybackStateInterrupted || player.moviePlayer.playbackState == MPMoviePlaybackStateStopped || player.moviePlayer.playbackState == MPMoviePlaybackStatePaused)
        {
            if (self.presentedViewController) {
            [self dismissViewControllerAnimated:YES completion:^{
                [self continuePlayback];

            }];
        }
        else {
            [self continuePlayback];
        }
        }
    }

Теперь он не выдает исключение, а отображает предупреждение

wait_fences: failed to receive reply: 10004003

Такжеcompletion Блок никогда не называется.

How to properly to solve the background/foreground continue playing with modally displayed MPMoviePlayerViewController? Спасибо за ответы.

Ответы на вопрос(1)

Ваш ответ на вопрос