개발

Swift iOS WKWebView : WKNavigationDelegate 사용설정 (코드 부분)

소소ing 2020. 9. 22. 18:07
반응형

iOS WKWebView 에서 탐색 요청을 수락,로드 및 완료하는 과정에서 트리거되는 WKNavigationDelegate를 사용해 봅시다.

 

해당 글에서 코드 부분은 파란색으로 표기 됩니다.

해당 글에서 중요 부분은 붉은색으로 표기 됩니다.

 

1. WKNavigationDelegate 란?

Apple 공식 도큐먼트 보러가기

위의 주소를 통해 확인해 보면 WKNavigationDelegate 프로토콜의 메서드는 웹 뷰에서 탐색 요청을 수락,로드 및 완료하는 과정에서 트리거되는 사용자 지정 동작을 구현하는 데 도움이된다고 말하고 있습니다.

 

1-1. WKNavigationDelegate를 사용하는 이유?

WKNavigationDelegate안에 선언된 딜리게이트 함수를 이용하여 로딩 아이콘 표시 여부 및 URL, Protocal에 따른 다른 작업을 처리해 주는 용도로 주로 사용합니다.

 

2. "- iOS WKWebView : 기본 연동 (코드 부분)" 코드를 작성 한 후 붉은 부분을 추가 합니다.

[MainViewController.swift 파일 안]

// * WKWebView를 사용하기 위해서는 WebKit 모듈을 import 시켜야 합니다.

import WebKit

 

// * WKNavigationDelegate를 기입하여 해당 딜리게이트 사용을 알립니다.

class MainViewController: UIViewController, WKNavigationDelegate {

    // * WKWebView 객체 선언

    private var wkWebView: WKWebView? = nil

 

    override func viewDidLoad() {

        super.viewDidLoad()

        // * WKWebView 구성

        //    - 여기서는 self.view 화면 전체를 WKWebView로 구성하였습니다.

        self.wkWebView = WKWebView.init(frame: CGRect.init(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height))

 

        // * WKWebView WKNavigationDelegate 사용설정

        self.wkWebView?.navigationDelegate = self        

 

        // * WKWebView 화면 비율 맞춤 설정

        self.wkWebView?.autoresizingMask = UIViewAutoresizing(rawValue: UIViewAutoresizing.RawValue(UInt8(UIViewAutoresizing.flexibleWidth.rawValue) | UInt8(UIViewAutoresizing.flexibleHeight.rawValue)))

 

        // * WKWebView 여백 및 배경 부분 색 투명하게 변경

        self.wkWebView?.backgroundColor = UIColor.clear

        self.wkWebView?.isOpaque = false

        self.wkWebView?.loadHTMLString("<body style=\"background-color: transparent\">", baseURL: nil)

   

         // * WKWebView에 로딩할 URL 전달

         //    - 캐시 기본 정책 사용, 타임아웃은 10초로 지정하였습니다.

         let request: URLRequest = URLRequest.init(url: NSURL.init(string: "<URL 입력>")! as URL, cachePolicy: URLRequest.CachePolicy.useProtocolCachePolicy, timeoutInterval: 10)

         self.wkWebView?.load(request)

 

          // * WKWebView 화면에 표시 

          self.view?.addSubview(self.wkWebView!)

    }

    

    // * WKWebView URL Loading 시작 시 호출되는 딜리게이트 함수

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

    {

         // * 로딩 아이콘 표시 등등...                        

    }

    // * WKWebView URL Loading 완료 시 호출되는 딜리게이트 함수

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)

    {

         // * 로딩 아이콘 표시 숨기기 등등...

    }

    // * WKWebView URL Loading 실패 시 호출되는 딜리게이트 함수

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

    {

         // * 로딩 아이콘 표시 숨기기 + 로딩 실패 사유 확인 등등...

    }

    // * WKWebView HTTPURLResponse 정보를 확인하는 딜리게이트 함수 

    func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Swift.Void)

    {

        // * 여기서는 response.statuscode 확인 하는 예제

        if (navigationResponse.response is HTTPURLResponse) {

            let response = navigationResponse.response as? HTTPURLResponse

            print(String(format: "response.statusCode: %ld", response?.statusCode ?? 0))

        }

        // * 값에 따라 탐색 허용여부를 결정할 수 있습니다.

        decisionHandler(.allow)

    }

    // * WKWebView URL Loading 요청 시(탐색 시) 호출되는 딜리게이트 함수

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

    {

         // * 프로토콜이 http: https: 일때만 URL 탐색 허용하며, 이외의 프로토콜일 경우 외부 브라우저를 호출하도록 구성

         if (navigationAction.request.url?.absoluteString.hasPrefix("http:"))! || (navigationAction.request.url?.absoluteString.hasPrefix("https:"))! {

             decisionHandler(.allow)

        } else {

            if #available(iOS 10.0, *) {

                if let aString = URL(string: (navigationAction.request.url?.absoluteString)!) {

                    UIApplication.shared.open(aString, options: [:], completionHandler: { success in

                        if success {

                            print("Opened \(navigationAction.request.url?.absoluteString ?? "")")

                        }

                    })

                }

            } else {

                if let aString = URL(string: (navigationAction.request.url?.absoluteString)!) {

                    UIApplication.shared.openURL(aString)

                }

            }

            // * 프로토콜이 http, https가 아니므로 탐색 허용 X

            decisionHandler(.cancel)

        }

    }

}

 

반응형