상세 컨텐츠

본문 제목

[iOS] WKWebView WebView response:URL값 가져오기

Programming

by Crape Myrtle 2024. 10. 28. 15:45

본문

하이브리드 웹뷰 개발시 필수적으로 알아야하는 내용이다. 

Android에서는 WebView내에서 로드되는 URL값을 WebViewClient클래스의 오버라이드 함수 shouldOverrideUrlLoading이라고 부른다.

 

언어: Swift

 

iOS도 마찬가지로 웹뷰 내에서 로드된 URL을 받는 오버라이드 함수가 있다.

(Object-C만 사용하셨던 분들은 파라메터 띄어쓰기를 두려워하지 않아도 괜찮다)

import Foundation
import WebKit

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
  ...
}

 

Load된 URL확인.

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
  let url: URL? = navigationAction.request.url
  
  if url != nil {
    print("\(url)")
  }
}

 

 

URL은 Nullable하기 때문에 Null상태를 체크해주어야 한다.

그리고 앱을 실행하면 문제의 메시지가 발생한다.

Completion handler webView:decidePolicyForNavigationAction:decisionHandler wat not called

 

함수 내부에 있는 decisionHandler를 사용하지 않아서 발생한 문제이다.

또 다른 오버라이드 함수를 사용하지 않아서 발생한 문제가 아니니 걱정하지 않아도 된다.

 

decisionHandler는 해당 URL을 WebView인스턴스에 넘겨도 괜찮은지 여부를 결정한다.

.cancel을 보내면 웹뷰가 해당 URL을 로드하지 않고,

.allow를 보내면 웹뷰가 해당 URL을 로드하게 된다.

 

코드는 다음과 같이 내용을 추가하면 된다.

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
  let url: URL? = navigationAction.request.url
  
  if url != nil {
    print("\(url)")
  }
  
  decisionHandler(.allow)  // decisionHandler(.cancel)
}

 

 

웹뷰 실행시 내부에서 로드되는 URL을 콘솔창으로 확인이 가능해진다🌞

관련글 더보기