Iphone 未收到UIMoviePlayerController illexitFullScreen通知

Iphone 未收到UIMoviePlayerController illexitFullScreen通知,iphone,ios,objective-c,uiwebview,Iphone,Ios,Objective C,Uiwebview,我的应用程序只是纵向的,但我想允许用户在通过UIWebview观看全屏视频时旋转到横向。我做了一些研究,发现我应该添加我的类作为这些通知的观察者: UIMoviePlayerController标识符完整屏幕通知 UIMoviePlayerController illexitFullScreenNotification 我以观察者的身份添加和删除该类,如下所示: - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:a

我的应用程序只是纵向的,但我想允许用户在通过UIWebview观看全屏视频时旋转到横向。我做了一些研究,发现我应该添加我的类作为这些通知的观察者:

UIMoviePlayerController标识符完整屏幕通知 UIMoviePlayerController illexitFullScreenNotification

我以观察者的身份添加和删除该类,如下所示:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerDidEnterFullScreen:) name:@"UIMoviePlayerControllerDidEnterFullscreenNotification" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayerWillExitFullScreen:) name:@"UIMoviePlayerControllerWillExitFullscreenNotification" object:nil];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"UIMoviePlayerControllerDidEnterFullscreenNotification" object:nil];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"UIMoviePlayerControllerWillExitFullscreenNotification" object:nil];
}

- (void)moviePlayerDidEnterFullScreen:(NSNotification *)notification
{
    self.videoPlayingFullScreen = YES;
}

- (void)moviePlayerWillExitFullScreen:(NSNotification *)notification
{
    self.videoPlayingFullScreen = NO;
}

- (NSUInteger)supportedInterfaceOrientations
{
    if (self.videoPlayingFullScreen)
    {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }

    return UIInterfaceOrientationMaskPortrait;
}
我的问题是:我从未收到“UIMoviePlayerController illexitFullScreen通知”。我无法使用UIMoviePlayerController IDEXITFullScreenNotification,因为如果用户以横向方式观看完全屏视频并按下“完成”,则上一个视图控制器也会以横向方式显示,而它应该是纵向的

是否有其他方法可以检测用户何时“确实”进入全屏,何时“将”退出全屏?还是我遗漏了什么

编辑:
我的应用程序仅适用于iOS 7。

您没有收到
UIMoviePlayerController illexitFullScreenNotification
回调的原因是因为您将自己从
视图中移除为观察者将消失:

您没有收到
UIMoviePlayerController illexitFullScreenNotification
回调的原因是因为您将自己从
视图中移除为观察者,所以将消失:

因为这些回调没有记录,所以我使用Javascript事件(如H2CO3建议的)来确定视频开始、结束或暂停的时间

顺便说一下,我正在使用YouTube播放器

首先,我设置UIWebview并将我的ViewController设置为代理

接下来,我将HTML文件加载到UIWebview中

Index.html

<html>
    <body bgcolor=#8C1717 style="margin:0px;">
        <div id="ytplayer"></div>
        <script type="text/javascript">
            var tag = document.createElement('script');
            tag.src = "https://www.youtube.com/player_api";

            var firstScriptTag = document.getElementsByTagName('script')[0];
            firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

            var player;
            function onYouTubeIframeAPIReady()
            {
                player = new YT.Player('ytplayer',
                                       {
                                       height: 'videoHeight',
                                       width: 'videoWidth',
                                       videoId: 'videoID',
                                       playerVars: { 'showinfo':0, 'rel':0 },
                                       events: { 'onStateChange': onPlayerStateChange }
                                       });
            }

            function playerDidBeginPlaying()
            {
                document.location.href = "fake://video-began";
            }

            function playerDidEndPlaying()
            {
                document.location.href = "fake://video-ended";
            }

            var done = false;
            function onPlayerStateChange(event)
            {
                if (event.data == YT.PlayerState.PLAYING && !done)
                {
                    done = true;
                    playerDidBeginPlaying();
                }
                else if (event.data == YT.PlayerState.ENDED)
                {
                    playerDidEndPlaying();
                }
                else if (event.data == YT.PlayerState.PAUSED)
                {
                    playerDidEndPlaying();
                }
            }
        </script>
    </body>
</html>
然后,我实现了方法
webView:shouldStartLoadWithRequest:navigationType:
,以便在事件发生时得到通知

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if ([[[request URL] absoluteString] hasPrefix:@"fake://video-began"])
    {
        self.videoPlayingFullScreen = YES;

        return NO;
    }
    else if ([[[request URL] absoluteString] hasPrefix:@"fake://video-ended"])
    {
        self.videoPlayingFullScreen = NO;

        return NO;
    }

    return YES;
}

由于这些回调没有文档记录,我使用Javascript事件(如H2CO3所建议的)来确定视频何时开始、何时结束或何时暂停

顺便说一下,我正在使用YouTube播放器

首先,我设置UIWebview并将我的ViewController设置为代理

接下来,我将HTML文件加载到UIWebview中

Index.html

<html>
    <body bgcolor=#8C1717 style="margin:0px;">
        <div id="ytplayer"></div>
        <script type="text/javascript">
            var tag = document.createElement('script');
            tag.src = "https://www.youtube.com/player_api";

            var firstScriptTag = document.getElementsByTagName('script')[0];
            firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

            var player;
            function onYouTubeIframeAPIReady()
            {
                player = new YT.Player('ytplayer',
                                       {
                                       height: 'videoHeight',
                                       width: 'videoWidth',
                                       videoId: 'videoID',
                                       playerVars: { 'showinfo':0, 'rel':0 },
                                       events: { 'onStateChange': onPlayerStateChange }
                                       });
            }

            function playerDidBeginPlaying()
            {
                document.location.href = "fake://video-began";
            }

            function playerDidEndPlaying()
            {
                document.location.href = "fake://video-ended";
            }

            var done = false;
            function onPlayerStateChange(event)
            {
                if (event.data == YT.PlayerState.PLAYING && !done)
                {
                    done = true;
                    playerDidBeginPlaying();
                }
                else if (event.data == YT.PlayerState.ENDED)
                {
                    playerDidEndPlaying();
                }
                else if (event.data == YT.PlayerState.PAUSED)
                {
                    playerDidEndPlaying();
                }
            }
        </script>
    </body>
</html>
然后,我实现了方法
webView:shouldStartLoadWithRequest:navigationType:
,以便在事件发生时得到通知

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if ([[[request URL] absoluteString] hasPrefix:@"fake://video-began"])
    {
        self.videoPlayingFullScreen = YES;

        return NO;
    }
    else if ([[[request URL] absoluteString] hasPrefix:@"fake://video-ended"])
    {
        self.videoPlayingFullScreen = NO;

        return NO;
    }

    return YES;
}

这些通知没有文档记录,因此在使用时存在极大的风险,一旦发布新的操作系统更新,就会破坏应用程序。例如,
UIMoviePlayerController IDEXITFullScreenNotification
从未在iOS6上发送过。是否有记录在案的方法来检测UIWebview何时进入并将退出全屏?使用中描述的JavaScript事件。这些通知没有记录在案,因此,当他们可能被使用时,风险极高,一旦发布新的操作系统更新,就会破坏应用程序。例如,
UIMoviePlayerController IDEXITFullScreenNotification
从未在iOS6上发送过。是否有记录在案的方法来检测UIWebview何时进入并将退出全屏?请使用所述的JavaScript事件。谢谢您的回答。作为观察者,我应该使用哪种方法删除自己?当使用dealloc删除通知时,请确保在init方法中附加通知,而不是在外观回调中附加通知。谢谢您的回答。作为观察者,我应该使用哪种方法删除自己?当使用dealloc删除通知时,请确保在init方法中附加通知,而不是在外观回调中附加通知。