iOS12网页视频播放点击全屏按钮会导致闪退

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CodingFire/article/details/83113580

最近在app中有一个h5界面,是一个视频播放的列表,然后在iOS12的手机上发生了如下几个问题:
第一,自动全屏播放,这个问题历来就有,很好解决;
第二,全屏后取消全屏,状态栏消失;
第三,多个视频间来回点全屏按钮导致app崩溃闪退;

以上三个问题,我们下面一一来说明:
1.自动全屏播放,历来如此,想要解决也很简单:

//在video标签中加上下面属性
<video playsinline="true" webkit-playsinline="true"><video>

同时在app中对webview设置一个属性:

    self.webView.allowsInlineMediaPlayback = YES;

这样,视频在开始播放的时候就不会自动全屏了。

2.全屏后退出全屏,状态栏消失
这个问题在iOS12以下的手机中都不存在,推测应该也是iOS12 做出的新改变或者bug,解决办法在webview所在的ViewCOntroller中调用下面的方法:

#pragma mark  --通知
-(void)addObserverNotification
{
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(windowDidBecomeHidden:) name:UIWindowDidBecomeHiddenNotification object:nil];
}

-(void)windowDidBecomeHidden:(NSNotification *)nitice
{
    UIWindow * window = (UIWindow *)nitice.object;
    if(window){
        UIViewController *rootViewController = window.rootViewController;
        NSArray<__kindof UIViewController *> *viewVCArray = rootViewController.childViewControllers;
        if([viewVCArray.firstObject isKindOfClass:NSClassFromString(@"AVPlayerViewController")]){
            [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
        }
    }
}

调用的时候最好这么写:

    if (@available(iOS 12.0, *)){
        [self addObserverNotification];
    }
    //这个方法的作用是在退出全屏时监听到,然后设置状态栏显示,状态栏显示的方法除了上面的代码,plist也要处理,不多说了,老生常谈的问题了,退出全屏瞬间状态栏还是隐藏的,之后才又显示,这是个小缺陷。

调用方法可以写在viewDidLoad中。

3.切换点击几个视频的全屏按钮导致崩溃
这是我们要着重说的一个问题,经试验,iOS12以下手机不会崩溃,很明显,这是一个iOS12的bug,目前无法处理,想了几个方案:
i)不允许多个视频处于播放暂停状态,退出全屏后,恢复初始状态,但是需要h5去监听这个状态来做处理,不知道h5能不能兼听到,如果监听不到,就用上面iOS的兼听通过JS告诉h5来做处理;
ii)禁止全屏,并在播放期间隐藏全屏按钮,音量按钮,进度条,暂定播放这些按钮。前提是你的视频不需要全屏显示处理方法是 video 元素上不能写 controls 特性。

如果你有更好的方法来解决这个崩溃问题,欢迎一起探讨。

猜你喜欢

转载自blog.csdn.net/CodingFire/article/details/83113580