1. 程式人生 > >iOS12 bug總結(持續更新)

iOS12 bug總結(持續更新)

第一、webview內開啟全屏播放器播放完視訊後,狀態列被隱藏

如上圖,圖一在視訊未播放時狀態列正常,圖二是全屏播放h5視訊,圖三退出全屏時狀態列消失。

修復:

全屏視訊的播放本質上是新加了一個window,且該window最終包裹了視訊播放的VC,當退出全屏視訊時,其實是對應的window進行了隱藏,所以,我們可以監聽window隱藏的通知:

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(windowDidBecomeHidden:) name:UIWindowDidBecomeHiddenNotification object:nil];

在該通知觸發時去把狀態列設定回來。

這種修改需要考慮以下幾種情況:

1、當前應用可能同時存在多個webview,而且應用本身的某些頁面存在確切的隱藏狀態列的需求,所以,不能簡單的監聽到通知後就把狀態列顯示。因此:

第一、不能把這個邏輯放在webview這一層;

第二、這個邏輯可以放在webviewVC這一層,但是需要保證webviewVC正在展示才行;

第三、iOS12以上的條件;

第四、當前window確實時播放視訊所加的window,其他window的變化不能觸發該邏輯;

前三點很容易做到,第四點,我們的實現是這樣的:


        UIWindow * win = (UIWindow *)noti.object;
        if(win){
            UIViewController *rootVC = win.rootViewController;
            NSArray<__kindof UIViewController *> *vcs = rootVC.childViewControllers;
            if([vcs.firstObject isKindOfClass:NSClassFromString(@"AVPlayerViewController")]){
                [[UIApplication sharedApplication]setStatusBarHidden:false animated:false];
            }
        }

這樣就可以保證在確定的window隱藏時才觸發設定狀態列的操作。

第二、kscrash記錄殭屍物件時,NSException的物件會引起crash!


0	xxxx	getClassRW (in xxxx) (KSObjC.c:239)
1	xxxx	getClassRO (in xxxx) (KSObjC.c:245)
2	xxxx	ksobjc_ivarValue (in xxxx) (KSObjC.c:811)
3	xxxx	copyStringIvar (in xxxx) (KSZombie.c:73)
4	xxxx	storeException (in xxxx) (KSZombie.c:107)
5	xxxx	handleDealloc (in xxxx) (KSZombie.c:125)
6	xxxx	handleDealloc_NSObject (in xxxx) (KSZombie.c:149)
7	CoreFoundation	-[NSException dealloc] (in CoreFoundation) + 136

這裡NSException在dealloc時ks去記錄殭屍資訊時會崩潰。其原因如下:

主要是蘋果修改了一個mask(ISA_MASK)的值引起了崩潰。

這裡需要再次強調一下,NSException物件一般是try-catch機制的產物,我曾經在一篇文章中提到過:

try-catch會引起記憶體洩露。大家在用OC編碼時還是要遵守蘋果的開發規範,儘量不要使用try-catch來處理異常。