적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/Swift

[Swift iOS] WKNavigationDelegate 하이브리드 앱에서 webview 탐색 및 관리

hongssup_ 2021. 10. 5. 11:59
반응형

WKNavigationDelegate

: Methods for accepting or rejecting navigation changes, and for tracking the progress of navigation requests.

웹뷰에서 일어나는 변경 사항들을 감지하고 제어할 수 있는 프로토콜. 

특정 링크에서의 작동을 제한하거나 진행 상황을 추적하는 등의 기능을 수행할 수 있다. 

 

WebViewController에 WKNavigationDelegate 프로토콜을 추가해주면 다음 메서드들을 사용하여 웹뷰 페이지 탐색 및 이동을 제어할 수 있다. 

webview.navigationDelegate = self 로 대리자 위임해주는 것을 잊지말 것! 

 

1. decidePolicyFor navigationAction

새 컨텐츠 탐색 권한을 delegate에 요청하는 메서드. decisionHandler에 .allow 또는 .cancle을 넘겨주어야 메서드가 종료된다. 

다음과 같이 로드하려고 하는 페이지의 url을 가지고올 수 있어, 웹뷰에서 url 로딩을 시작하기 전에 작업을 통제할 수 있다. 

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

+

WKWebView에서 결제 서비스 등의 외부 앱을 호출해야할 경우, 여기서 다음과 같이 설정을 추가해주어 외부 앱을 열 수 있다. 

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    if let url = navigationAction.request.url, url.scheme != "http" && url.scheme != "https" {
        UIApplication.shared.openURL(url)
        decisionHandler(.cancel)
    } else {
        decisionHandler(.allow)
    }
}

 

2. didStartProvisionalNavigation

탐색이 시작되었음을 대리자에게 알리는 메서드라고 하는데 써본 적은 없음. 

func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
}

 

3. didCommit navigation

웹뷰가 컨텐츠를 수신하기 시작했을 때 불리는 메서드. 페이지가 로딩되는 시작점이라고 생각하면 될듯? 

푸시 클릭시 링크 이동이 필요한 경우, 이 메서드에서 링크로 이동되도록 하면 웹뷰 로딩 후 해당 링크로 다시 로딩시켜 웹뷰에서의 뒤로가기 버튼도 동작할 수 있다. 

func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
    let url = webView.url?.absoluteString
    print("didCommit navigation: \(url)")
}

 

4. didFinish navigation

페이지 로드가 완료되면 불리는 메서드로 안드로이드 WebClient의 onPageFinished와 동일한 기능이라고 볼 수 있다. 

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    print("didFinish navigation")
}

 

5. didFail navigation

페이지 로드하다가 문제가 생기면 불리는 메서드. 

func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
    print("didFail navigation: \(error)")
}
728x90
반응형