MPMoviePlayerPlaybackDidFinishNotification вызывается, когда не должно

Согласно документу 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 вызывается, когда фильм заканчивается, но, как я уже сказал, он также вызывается, когда вы нажимаете «Готово».


person sol    schedule 11.11.2010    source источник
comment
вы не можете зафиксировать событие на кнопке «Готово»?   -  person Aaron Saunders    schedule 11.11.2010
comment
Я так не думаю. Это часть MPMoviePlayer, и для него нет обратного вызова.   -  person sol    schedule 11.11.2010
comment
У меня такая же ситуация, помогите пожалуйста!   -  person iOS Monster    schedule 01.12.2012


Ответы (4)


Вот как вы проверяете 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
    }
}
person GhostM    schedule 16.01.2012

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

- (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
    }
}
person tagy22    schedule 31.10.2014

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

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

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

person Nevin    schedule 12.11.2010
comment
только что попробовал это. self.player.endPlaybackTime равен -1 независимо от того, закрываетесь ли вы с помощью кнопки «Готово» или если он воспроизводится полностью. Проверил документацию. Это свойство неприменимо для потокового контента. - person sol; 12.11.2010
comment
О, я не знаю, что вы говорите о потоковом контенте .... Я пересмотрел свой ответ. - person Nevin; 12.11.2010
comment
Это кажется отличной идеей, но если ([[[notification userInfo] objectForKey:@MPMoviePlayerPlaybackDidFinishReasonUserInfoKey] intValue] == MPMovieFinishReasonUserExited) всегда возвращает false, независимо от того, нажимаю ли я «Готово» или пользователь завершает работу естественным образом. - person sol; 12.11.2010

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

    moviePlayer.repeatMode = MPMovieRepeatModeNone;
person Hardik Mamtora    schedule 09.09.2014