본문 바로가기
프로그래밍/iOS

MPMoviePlayerController의 상태에 따른 처리팁

by 백룡화검 2012. 5. 15.

- (void)viewDidLoad {
// 노티센터에 상태값 등록
// 동영상 상태값 변경
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerPlaybackStateDidChange:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:self.movieController];
    
// 동영상 종료 원인 파악
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:self.movieController];

}


-(void) moviePlayerPlaybackStateDidChange:(NSNotification*)notification {
    MPMoviePlayerController *moviePlayer = notification.object;
    MPMoviePlaybackState playbackState = moviePlayer.playbackState;
     
    switch (playbackState) {
        case MPMoviePlaybackStateStopped:
            NSLog(@"종료이벤트 발생");
            break;
        case MPMoviePlaybackStatePlaying:
            NSLog(@"MPMoviePlaybackStatePlaying");
            break;
        case MPMoviePlaybackStatePaused:
            NSLog(@"MPMoviePlaybackStatePaused");
            break;
        case MPMoviePlaybackStateInterrupted:
            NSLog(@"MPMoviePlaybackStateInterrupted");
            break;
        case MPMoviePlaybackStateSeekingForward:
            NSLog(@"MPMoviePlaybackStateSeekingForward");
            break;
        case MPMoviePlaybackStateSeekingBackward:
            NSLog(@"MPMoviePlaybackStateSeekingBackward");
            break;
        default:
            break;
    }
    /*
     MPMoviePlaybackStateStopped : 동영상이 정지됨
     MPMoviePlaybackStatePlaying : 동영상이 재생중
     MPMoviePlaybackStatePaused :  동영상이 일시정지
     MPMoviePlaybackStateInterrupted : 동영상 재생이 일시적으로 멈춤 (동영상 버퍼가 부족)
     MPMoviePlaybackStateSeekingForward : 동영상을 끝으로 빨리감기중
     MPMoviePlaybackStateSeekingBackward : 동영상을 처음으로 향해 빨리감기중
     */
}

- (void)playbackDidFinish:(NSNotification *)noti {
    MPMoviePlayerController *player = [noti object];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:player]; // 동영상 상태 노티 제거
    
    [player stop];
    
    NSDictionary *userInfo = [noti userInfo]; // 종료 원인 파악
    if ([[userInfo objectForKey:@"MPMoviePlayerPlaybackDidFinishReasonUserInfoKey"] intValue] == MPMovieFinishReasonUserExited) {
        NSLog(@"유저종료");
        [self.navigationController popViewControllerAnimated:YES];
    }
    else {
        NSLog(@"자연종료");
        [self showPopup]; // 이 함수는 유저종료가 아닌 플레이 완료로 인한 종료시 팝업뷰를 호출하기 위해 만든 개인 함수입니다.
    }
}



이번에 MPMoviePlayerController를 통해 동영상 플레이어를 만들던 중 이용자의 행동에 따른 메세지 분기처리가 필요하여 알게 된 내용입니다.
이용자가 완료를 누르면 리스트로 이동을 해야 하고, 이용자가 동영상을 끝까지 봤으면 다음동영상을 보시겠냐? 식의 팝업뷰를 호출해야 하는데
완료버튼을 눌렀을 때와 동영상을 끝까지 봤을 때 날라오는 이벤트가 동일하더군요.
위처럼 노티 등록해주고 NSDictionary로 원인 파악하면 분기가 가능하네요.