새소식

iOS/Swift

[iOS/WebKit] Completion handler passed to [webView:decidePolicyForNavigationAction:decisionHandler:] was called more than once 오류

  • -

오류

다른 ViewController에서 동시에 한 개의 webView를 사용하고 있던 중 아래 오류가 발생하였다.

Completion handler passed to [webView:decidePolicyForNavigationAction:decisionHandler:] was called more than once


원인

webView에서 decideHandler나 completionHandler의 호출은 한 번 밖에 되지 않는다.


해결

CompletionHandlerWrapper Class를 선언하여 webView에 적용

class CompletionHandlerWrapper<Element> {
  private var completionHandler: ((Element) -> Void)?
  private let defaultValue: Element

  init(completionHandler: @escaping ((Element) -> Void), defaultValue: Element) {
    self.completionHandler = completionHandler
    self.defaultValue = defaultValue
  }

  func respondHandler(_ value: Element) {
    completionHandler?(value)
    completionHandler = nil
  }

  deinit {
    respondHandler(defaultValue)
  }
}
 func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) {
    let completionHandlerWrapper = CompletionHandlerWrapper(completionHandler: completionHandler, defaultValue: false)
    let alertController = UIAlertController(title: message, message: nil, preferredStyle: .alert)
    alertController.addAction(UIAlertAction(title: "확인", style: .default) { _ in completionHandlerWrapper.respondHandler(true) })
    alertController.addAction(UIAlertAction(title: "취소", style: .cancel) { _ in completionHandlerWrapper.respondHandler(false) })
    present(alertController, animated: true, completion: nil)
  }

 

 

출처

 

WKWebView의 UIDelegate completion crash 해결하기

WKWebView에선 UIDelegate를 통해서 웹에서 일어난 alert, confirm, prompt에 대해서 custom ui를 제공할 수 있게 도와줍니다. UIDelegate에서는 CompletionHandler를 통해서 javascript와 값을 주고받는데, 핸들러를 호출

jisoo.net

 

 

[ios] Completion handler passed to -[Connect.MainViewController webView:decidePolicyForNavigationAction:decisionHandler:] was ca

# 오류 WebView 함수에서 화면 왔다갔다 하는 중에 다음과 같은 오류가 발생하면서 앱이 멈춘다. Exception: "Completion handler passed to -[Connect.MainViewController webView:decidePolicyForNavigationAction:decisionHandler:] was

jolly-sally.tistory.com

 

728x90

'iOS > Swift' 카테고리의 다른 글

[Swift] DispatchQueue (3) - DispatchGroup  (0) 2024.04.20
[iOS] HTTP Cookie  (0) 2024.03.24
[iOS] WKScriptMessageHandler  (0) 2024.03.16
[iOS] WKUIDelegate  (0) 2024.03.16
[iOS] WKNavigationDelegate  (0) 2024.03.16
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.