wkwebview script message handler memory leak 해결하기

Lin·2021년 6월 30일
3

iOS

목록 보기
7/7
post-thumbnail

삽질 후기

view controller가 메모리에서 계속 사라지지가 않아서 열심히 찾아보다가 delegate 문제인줄 알았는데 wkwebview 문제였어서..ㅠㅠ
삽질한 김에 다른 분들은 wkwebview를 사용할때 삽질하지 않으셨으면 해서 작성하게 되었습니다.
(나만 몰랐던 것 같기도 하고..)


웹뷰 설정해주기

웹과 앱의 소통을 위해서 wkwebview에 message handler를 설정합니다.

let webConfiguration = WKWebViewConfiguration()
let contentController = WKUserContentController()

contentController.add(self, name: "message")
webConfiguration.userContentController = contentController
        
let webView = WKWebView(frame: self.view.frame, configuration: webConfiguration)

이렇게 등록한 뒤 웹에서 적절하게 호출해주면

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
	// code..
}

해당 함수가 불리게 되고, 가져온 메세지로 알맞게 로직을 구성하게 됩니다.

여기서 메모리 릭이 발생하는 부분은 message handler를 설정해주는 부분입니다.
contentController.add(self, name: "message")

네.. 여기서 순환참조가 발생합니다.
밑에 소개하는 게시물에서도 언급하지만 저도 self를 당연히 weak으로 넘겨주겠거니 생각해서 확인할 생각을 하지 못했습니다. ;.;


해결책

저는 처음에
wkwebview message handler memory leak(쉽게 실수하는 WKWebView 메모리 누수 수정)

해당 게시물을 참고했었습니다. 위 방법도 좋아보이긴 하는데 저는 다른 방법도 소개해드리려고 합니다.

webview.configuration.userContentController.removeScriptMessageHandler(forName: "message")

조금 더 간단해졌죠?

view controller가 disappear 되는 시점이나 webview가 필요없어지는 시점에 사용하면 되겠습니다.
(프로젝트 타겟이 iOS 14이상이면 removeAllScriptMessageHandlers()도 사용하실수 있습니다~)

profile
수많은 에러를 경험 중..😵

2개의 댓글

comment-user-thumbnail
2023년 7월 21일

감사합니다~ 덕분에 쉽게 해결하는 방법을 찾았습니다. ^^

1개의 답글