iOS12 bug總結(持續更新)
阿新 • • 發佈:2018-12-30
第一、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來處理異常。