[TroubleShooting] iOS WKWebView NSURLErrorDomain error -999 에러 해결

정한별·2024년 5월 31일

TroubleShooting

목록 보기
1/1

상황

회사 프로젝트로 Nice 본인인증 구현을 위해 WKWebView를 사용하고 있었는데

    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error)

Delegate 메서드에서 NSURLErrorDomain error -999 에러가 발생했다.
하필 이 메서드에서 Alert을 노출하고 있었고.
이 메서드에서 해당 Error Alert이 뜨고 난뒤 바로

func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Swift.Void)

runJavaScriptAlertPanelWithMessage 에서도 Alert이 뜨는 상황이 발생했고
runJavaScriptAlertPanelWithMessage 에서 뜨는 Alert이 무시되면서 completionHandler를 호출하지못해서 크래시가 발생해버렸다.
또한 해당 문제는 iOS 버전 14버전에서만 발생했다.

원인

NSURLErrorDomain error -999 같은 경우 URLSession 통신중
어떤 통신이 완료되기도 전에 호출을 취소하면서 발생하는 에러다.

본인인증 기능을 구현할때 로직은 다음과 같다.

  • 우리 서버 웹페이지1 을 먼저 웹뷰로 호출
  • 웹페이지1 에서 팝업창 이벤트를 받아서 새로운 웹뷰를 화면에 올림
  • 새로운 웹뷰에서 웹페이지2 를 호출
  • 본인인증 완료시 웹페이지2 에서 Redirect를 받아서 처리
  • 처리 후 웹페이지2 에서 웹페이지1로 데이터를 전달
  • 바로 웹페이지2 close

이 과정에서 웹페이지2 에서 웹페이지1 로 데이터를 전달하자마자 웹페이지2 를 close 해버리니. iOS 에서는 데이터 전송이 완료 되기도 전에 취소한것으로 인식해버린 것

이 과정을 취소라고 인식하기 까지 기다리는 시간은 iOS 버전별로 다른것 같다.
iOS 14(회사 앱 최소지원버전) 에서만 이러한 증상이 일어났고 그 이상 디바이스에서는 이러한 증상이 없었다.

해결

현재 로직상 본인인증 성공 및 실패시 그냥 ViewController 자체를 닫아버리기 때문에 웹페이지2 를 close 하지않아도 이상이 없는 로직이였다.
웹 개발자 분한테 웹페이지 2를 굳이 close 하지 말아 달라고 부탁드려
새로운 배포를 하지 않더라도 Crash를 해결할수 있었다.
하지만 잠재적인 타이밍 이슈로 Crash가 또 발생할수 있었기 때문에
다음 버전에 WKWebView 에러 발생시 Alert으로 대응하는것이 아니라.
Toast 메시지로 변경 했다.

profile
iOS Developer

0개의 댓글