1. 程式人生 > >iOS12網頁視訊播放點選全屏按鈕會導致閃退

iOS12網頁視訊播放點選全屏按鈕會導致閃退

最近在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 特性。

如果你有更好的方法來解決這個崩潰問題,歡迎一起探討。