[WebKit] WKNavigationDelegate 프로토콜 살펴보기 (작성중)

Sean·2023년 5월 9일
0

WebKit

목록 보기
2/4

누군가에게 알려주기 보다는 나 스스로 정리 하며 언젠가 다시 사용할 때를 대비하는 글을 작성할것이다.

참고 자료: WebKit 공식문서

시작

Protocol: WKNavigationDelegate

개요

  • 네비게이션의 변경을 확인하고 요청에 대한 진행 상황을 추적한다.

버전

  • iOS 8.0+
  • macOs 10.10 +

번역

Overview
WKNavigationDelegate 프로토콜의 메서드를 구현하여 웹 뷰의 메인 프레임 변경을 조정하는 데 사용하는 객체를 만드세요. 사용자가 웹 콘텐츠를 탐색하려고 할 때 웹 뷰는 탐색 델리게이트와 협력하여 모든 전환을 관리합니다.
예를 들어, 이러한 메서드를 사용하여 콘텐츠 내의 특정 링크에서의 탐색을 제한할 수 있습니다. 또한 요청의 진행 상황을 추적하고 오류 및 인증 도전에 대응하기 위해 이들을 사용할 수 있습니다.


  • 웹뷰의 전환 관련을 관리하는 프로토콜이다.

분석

네비게이션 요청을 허용 또는 거부

 1. webView(_:decidePolicyFor:preferences:decisionHandler:)

  • 선언
optional func webView(
    _ webView: WKWebView,
    decidePolicyFor navigationAction: WKNavigationAction,
    preferences: WKWebpagePreferences,
    decisionHandler: @escaping (WKNavigationActionPolicy, WKWebpagePreferences) -> Void
)
  • 해당 메서드는 웹 뷰가 새 컨텐츠 탐색시 해당 탐색을 허용할 지 거부할 지 결정하는데 사용한다.
    navigationAction 파라미터로 탐색을 시작하는데 사용하는 정보를 전달한다.
    preferences 파라미터는 새로운 웹 페이지를 표시할 때 사용하는 환경설정이다. 웹 뷰 생성시 사용해 페이지에 대한 기본 환경 설정을 지정한다.
    dicisionHandler 파라미터는 탐색을 허용하거나 취소해야 하는지 나타내는 핸들러를 제공한다. 반환값이 없을 경우 다음의 파라미터를 사용한다.
      1. policy: 탐색을 허용할지 취소할지 나타내는 상수이다.
       가능한 항목은 3번의 WKNavigationActionPolicy 참조
      2. preferences: 탐색 허용되는 경우 적용할 기본 설정이다.
      파라미터에서 개체를 전달하거나 새로운 설정 개체를 구성하고 전달 할 수 있다.

  • 따라서 이 메서드를 사용해 웹 뷰 내의 새 컨텐츠 탐색에 대한 사용자 정의 규칙 구현 가능하다

  • 중요: 비동기 관련

optional func webView(
	_ webView: WKWebView,
	decidePolicyFor navigationAction: WKNavigationAction,
	preferences: WKWebpagePreferences
) async -> (WKNavigationActionPolicy, WKWebpagePreferences)

 이 메서드의 completion handler를 사용해 비동기로 호출 할 수 있다.


  2. webView(_:decidePolicyFor:decisionHandler:)

  • 선언
optional func webView(
    _ webView: WKWebView,
    decidePolicyFor navigationAction: WKNavigationAction,
    decisionHandler: @escaping (WKNavigationActionPolicy) -> Void
)
  • 1과 동일한 동작을 하나 preferences 파라미터가 존재하지 않는다.

  3. WKNavigationActionPolicy

  • 선언
enum WKNavigationActionPolicy : Int, @unchecked Sendable
  • 액션으로부터 웹 페이지로의 네비게이션을 허용할지 취소할지 나타내는 상수이다.

  • Constants
     0: cancel
     1: allow
     2: download


  4. webView(_:decidePolicyFor:decisionHandler:)

  • 선언
optional func webView(
    _ webView: WKWebView,
    decidePolicyFor navigationResponse: WKNavigationResponse,
    decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void
)
  • 웹 뷰가 새 콘텐츠로 이동하는것에 대한 허용 여부에 대한 권한을 델리게이트에게 요청한다.

  • decisionHandler 파라미터는 탐색 허용 여부데 대해서 결과와 함께 호출할 핸들러 블록이고 반환값이 없을 경우 다음 파라미터를 사용한다.
      1. policy: 5번의 WKNavigationResponsePolicy 참조


  5. WKNavigationResponsePolicy

enum WKNavigationResponsePolicy : Int, @unchecked Sendable
  • 응답으로부터 웹 페이지로의 탐색을 허용할지 취소할지 나타내는 상수이다.

  • Constants
     0: cancel
     1: allow
     2: download


요청에 따른 로드 진행 상황 추적

 1. webView(_:didStartProvisionalNavigation:)

  • 선언
optional func webView(
    _ webView: WKWebView,
    didStartProvisionalNavigation navigation: WKNavigation!
)
  • main frame에서 네비게이션이 시작되었음을 델리게이트에게 알린다.
  • 웹 뷰가 네비게이션 요청 처리를 위한 임시 승인 받은 후 해당 요청에 대한 응답을 받기 에 이 메서드를 호출
  • Parameters
     1. webView: 콘텐츠 로드하는 웹뷰
     2. navigation: 로드 요청과 관련된 네비게이션 객체

 2. webView(_:didReceiveServerRedirectForProvisionalNavigation:)

  • 선언
optional func webView(
    _ webView: WKWebView,
    didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!
)
  • 웹 뷰가 요청에 대한 서버 리디렉션을 받은 후 델리게이트에 알린다.

  • 이 메서드는 리디렉션이 발생한 요청 및 후에 수신된 응답이 제공된다.
    이를 사용해 리디렉션 체인을 따라 각 단계에서 추가 정보 수집이나 적절한 초치를 취할 수 있다.

    Redirection(리디렉션)
    HTTP 클라이언트에서 서버로 request(요청)을 보내면 서버가 받아들이지 않고 다른 URL로 이동시키는 것을 말한다.
    이를 통해 클라는 원래의 요청 URL이 아닌 대상 URL로 리디렉션된 응답을 받을 수 있다.


    다양한 목적으로 사용되며 예를 들어 새로운 URL로 사용자를 보내거나, 도메인 변경으로 이전 URL이 새 URL로 리디렉션되도록 설정하는 경우가 있다.

  • Parameters
     1. webView: 콘텐츠 로드하는 웹뷰
     2. navigation: 리디렉션 된 네비게이션 객체


 3. webView(_:didCommit:)

  • 선언
optional func webView(
    _ webView: WKWebView,
    didCommit navigation: WKNavigation!
)
  • 웹 뷰가 main frame에 대한 콘텐츠를 수신하기 시작했음을 델리게이트에 알린다.

  • 웹 뷰가 콘텐츠를 받기 시작하면 호출된다. (HTML 코드가 로드되는 시점에 호출됨)

  • webView(_:decidePolicyFor:decisionHandler:)가 네이게이션 응답을 승인하면 웹 뷰는 해당 응답을 처리하기 시작한다.
    변경사항에 대해서 준비되면 웹 뷰는 main Frame을 업데이트 전에 이 메서드를 호출한다.

  • Parameters
     1. webView: 콘텐츠 로드하는 웹뷰
     2. navigation: 로드 요청을 식별하는 네비게이션 객체


 4. webView(_:didFinish:)

  • 선언
optional func webView(
    _ webView: WKWebView,
    didFinish navigation: WKNavigation!
)
  • 이 메서드는 웹 뷰가 네이게이션 요청을 처리한 후에 호출된다.

  • 실패한 네비게이션 요청에 대해서는 호출되지 않고 실패한 요청의 경우에는 다른 메서드가 호출 된다.

  • Parameters
     1. webView: 콘텐츠 로드하는 웹뷰
     2. navigation: 완료된 네비게이션 객체


인증에 대한 응답

 1. webView(_:didReceive:completionHandler:)

  • 선언
optional func webView(
    _ webView: WKWebView,
    didReceive challenge: URLAuthenticationChallenge,
    completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void
)
  • 인증 발생 시

  • Parameters
     1. webView: 콘텐츠 로드하는 웹뷰
     2. challenge:
     3. completionHandler:
      - disposition
      - credential:


 2. webView(_:authenticationChallenge:shouldAllowDeprecatedTLS:)

  • 선언
optional func webView(
    _ webView: WKWebView,
    authenticationChallenge challenge: URLAuthenticationChallenge,
    shouldAllowDeprecatedTLS decisionHandler: @escaping (Bool) -> Void
)

네비게이션 에러에 대한 응답

 1. webView(_:didFail:withError:)

  • 선언
optional func webView(
    _ webView: WKWebView,
    didFail navigation: WKNavigation!,
    withError error: Error
)

 2. webView(_:didFailProvisionalNavigation:withError:)

  • 선언
optional func webView(
    _ webView: WKWebView,
    didFailProvisionalNavigation navigation: WKNavigation!,
    withError error: Error
)

 3. webViewWebContentProcessDidTerminate(_:)

  • 선언
optional func webViewWebContentProcessDidTerminate(_ webView: WKWebView)

다운로드 진행 상황 처리

 1. webView(_:navigationResponse:didBecome:)

  • 선언
optional func webView(
    _ webView: WKWebView,
    navigationResponse: WKNavigationResponse,
    didBecome download: WKDownload
)

 2. webView(_:navigationAction:didBecome:)

  • 선언
optional func webView(
    _ webView: WKWebView,
    navigationAction: WKNavigationAction,
    didBecome download: WKDownload
)

참고자료

Protocol: WKNavigationDelegate

기타

당연 틀린 부분 지적은 감사하나 비난은 정중하게 사양하겠다.

  • 아직 제대로 작성이 안된 부분은 하다가 지쳐서 다음으로 미뤘기 때문이다.
profile
"잘 할 수 있을까?"를 고민하기보단 재밌어 보이는건 일단 하고, 잘하기 위해 그냥 계속합니다.

0개의 댓글