MPMoviePlayerPlaybackDidFinishNotification вызывается, когда это не должно - PullRequest
5 голосов
/ 11 ноября 2010

Согласно документации Apple MPMoviePlayerController:

MPMoviePlayerPlaybackDidFinishNotification - Это уведомление не отправляется в тех случаях, когда проигрыватель фильмов отображается в полноэкранном режиме, а пользователь нажимает кнопку Готово.

Мне кажется, это совершенно неправильно. Используя приведенный ниже код, playerPlaybackDidFinish вызывается, когда я нажимаю кнопку «Готово».

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerPlaybackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:self.player];

- (void) playerPlaybackDidFinish:(NSNotification*)notification
{
    NSLog(@"WHY?");
    self.player.fullscreen = NO;
}

Мне нужно различать пользователя, нажимающего кнопку «Готово», и фильма, заканчивающего весь процесс воспроизведения. playerPlaybackDidFinish вызывается по окончании фильма, но, как я уже сказал, он также вызывается при нажатии Готово.

Ответы [ 4 ]

22 голосов
/ 17 января 2012

Вот как вы можете проверить MPMoviePlayerPlaybackDidFinishReasonUserInfoKey, который является частью уведомления MPMoviePlayerPlaybackDidFinishNotification

- (void) playbackDidFinish:(NSNotification*)notification {
    int reason = [[[notification userInfo] valueForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey] intValue];
    if (reason == MPMovieFinishReasonPlaybackEnded) {
        //movie finished playin
    }else if (reason == MPMovieFinishReasonUserExited) {
        //user hit the done button
    }else if (reason == MPMovieFinishReasonPlaybackError) {
        //error
    }
}
3 голосов
/ 31 октября 2014

Я использую следующее, чтобы сделать что-то, когда фильм воспроизводится до конца:

- (void)playbackDidFinish:(NSNotification*)notification
{
    BOOL playbackEnded = ([[[notification userInfo] valueForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey] intValue] == MPMovieFinishReasonPlaybackEnded);
    BOOL endReached = (self.player.currentPlaybackTime == self.player.playableDuration);

    if (playbackEnded && endReached) {
        // Movie Ended
    }
}
2 голосов
/ 12 ноября 2010

Когда вы получаете уведомление, вы можете проверить endPlaybackTime игрока. Если это -1, то фильм закончился полностью назад естественным образом.

Для потокового содержимого вы можете проверить MPMoviePlayerPlaybackDidFinishReasonUserInfoKey внутри userInfo в MPMoviePlayerPlaybackDidFinishNotification.

Если он равен MPMovieFinishReasonUserExited, значит, пользователь прекратил воспроизведение контента.

0 голосов
/ 09 сентября 2014

Убедитесь, что

    moviePlayer.repeatMode = MPMovieRepeatModeNone;
...