그래오늘은이거야

ios swift object-c how to make didterminate background app wkwebview crash webViewWebContentProcessDidTerminate suspend 백화현상재현 about:blank 상태 wkwebview memory leak 메모리 full 본문

세상 개발/IOS(Swift)

ios swift object-c how to make didterminate background app wkwebview crash webViewWebContentProcessDidTerminate suspend 백화현상재현 about:blank 상태 wkwebview memory leak 메모리 full

jinhongstar 2023. 8. 9. 15:47
728x90
반응형

안녕하세요

 

wkwebview 가 장시간 냅두면 crash를 안내고 ViweController가 상태 그대로 앱이 메모리가 해제가 되버립니다.

 

uiwebview 일때는 crash가 나면서 앱이 꺼지는 증상을 wkwebview에서 개선 된 듯 합니다.

 

장시간동안 냅두면 webViewWebContentProcessDidTerminate 델리게이터로 들어오게 되는데 해당증상을 재현하려면 아래 소스 처럼 webview 에 evaluateJavaScript를 실행시키면 증상이 재현됩니다.

 

swift 소스

let javascriptCode = "window.OOMString = Array(1024 * 1024 * 1000).fill('A').join('');" wkWebView.evaluateJavaScript(javascriptCode, completionHandler: nil)

 

objective -c, object-c 소스

 

[wkWebView evaluateJavaScript:@"window.OOMString = Array(1024 * 1024 * 1000).fill('A').join(''));" completionHandler:nil]

 

sample 

 

    func applicationDidEnterBackground(_ application: UIApplication) {

        //5초후 앱 terminate 웹뷰 메모리 터트리기
        Timer.scheduledTimer(timeInterval: 5,
          target: self, selector: #selector(self.startDidTerminate(_:)),
          userInfo: nil, repeats: false);
        UIApplication.shared.saveLog()

 

}

 

    @objc private func startDidTerminate(_ sender: Timer) {
        Dispatch.main.async {
            print("jinhongstar :: \(#function)")
            let javascriptCode = "window.OOMString = Array(1024 * 1024 * 1000).fill('A').join('');"
            webView.evaluateJavaScript(javascriptCode, completionHandler: nil)
        }
    }

 

백그라운드 진입시 5초 후 terminat 발생

 

 func webViewWebContentProcessDidTerminate(_ webView: WKWebView){
        print("\(#function) Reload Start")
        print("👎🍇🍑👀 webViewWebContentProcessDidTerminate 시작")
                    webView.reload()
        }
        
    }
    

 

이증상이 나올때 stackoverflow 에서는

 

reload 만 하면된다는데 상황에 따라 웹뷰를 init 부터 새로 그려야 하는 상황이 있을 수 있습니다.

 

 

2편 https://jinhongstar.tistory.com/98

 

swift IOS about blank 백화현상 wkwebview crash dead webview white background suspend

안녕하세요 백화현상관련 //wkwebview 메모리 누수 weak 로 만든 후 delegate 를 발생시킨다. class JBWebVCLeakAvoider: NSObject, WKScriptMessageHandler { weak var delegate: WKScriptMessageHandler? init(delegate: WKScriptMessageHandler)

jinhongstar.tistory.com

 

반응형
Comments