일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 네이버알고리즘
- 아이폰 비율
- android
- objective-c
- codemonkey
- 아이폰
- 코딩테스트
- 네이버구름
- ios
- 구름TEST
- error
- codility
- code
- iPhone
- goormtest
- Swift
- 네이버
- naver
- 헬스
- 구름알고리즘
- Cordova
- 알고리즘
- 안드로이드
- Object-c
- 맥북
- java
- 코딩
- 맥용
- algorism
- 아이폰 해상도
- Today
- Total
그래오늘은이거야
ios swift object-c how to make didterminate background app wkwebview crash webViewWebContentProcessDidTerminate suspend 백화현상재현 about:blank 상태 wkwebview memory leak 메모리 full 본문
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안녕하세요
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