누군가에게 알려주기 보다는 나 스스로 정리 하며 언젠가 다시 사용할 때를 대비하는 글을 작성할것이다.
참고 자료: WebKit 공식문서
Protocol: WKNavigationDelegate
Overview
WKNavigationDelegate 프로토콜의 메서드를 구현하여 웹 뷰의 메인 프레임 변경을 조정하는 데 사용하는 객체를 만드세요. 사용자가 웹 콘텐츠를 탐색하려고 할 때 웹 뷰는 탐색 델리게이트와 협력하여 모든 전환을 관리합니다.
예를 들어, 이러한 메서드를 사용하여 콘텐츠 내의 특정 링크에서의 탐색을 제한할 수 있습니다. 또한 요청의 진행 상황을 추적
하고 오류 및 인증 도전에 대응
하기 위해 이들을 사용할 수 있습니다.
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를 사용해 비동기로 호출 할 수 있다.
optional func webView(
_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
decisionHandler: @escaping (WKNavigationActionPolicy) -> Void
)
preferences
파라미터가 존재하지 않는다.enum WKNavigationActionPolicy : Int, @unchecked Sendable
액션으로부터 웹 페이지로의 네비게이션을 허용할지 취소할지 나타내는 상수이다.
Constants
0: cancel
1: allow
2: download
optional func webView(
_ webView: WKWebView,
decidePolicyFor navigationResponse: WKNavigationResponse,
decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void
)
웹 뷰가 새 콘텐츠로 이동하는것에 대한 허용 여부에 대한 권한을 델리게이트에게 요청한다.
decisionHandler
파라미터는 탐색 허용 여부데 대해서 결과와 함께 호출할 핸들러 블록이고 반환값이 없을 경우 다음 파라미터를 사용한다.
1. policy: 5번의 WKNavigationResponsePolicy
참조
enum WKNavigationResponsePolicy : Int, @unchecked Sendable
응답으로부터 웹 페이지로의 탐색을 허용할지 취소할지 나타내는 상수이다.
Constants
0: cancel
1: allow
2: download
optional func webView(
_ webView: WKWebView,
didStartProvisionalNavigation navigation: WKNavigation!
)
임시
승인 받은 후 해당 요청에 대한 응답을 받기 전
에 이 메서드를 호출optional func webView(
_ webView: WKWebView,
didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!
)
웹 뷰가 요청에 대한 서버 리디렉션을 받은 후 델리게이트에 알린다.
이 메서드는 리디렉션이 발생한 요청 및 후에 수신된 응답이 제공된다.
이를 사용해 리디렉션 체인을 따라 각 단계에서 추가 정보 수집이나 적절한 초치를 취할 수 있다.
Redirection(리디렉션)
HTTP 클라이언트에서 서버로 request(요청)을 보내면 서버가 받아들이지 않고 다른 URL로 이동시키는 것을 말한다.
이를 통해 클라는 원래의 요청 URL이 아닌 대상 URL로 리디렉션된 응답을 받을 수 있다.
다양한 목적으로 사용되며 예를 들어 새로운 URL로 사용자를 보내거나, 도메인 변경으로 이전 URL이 새 URL로 리디렉션되도록 설정하는 경우가 있다.
Parameters
1. webView: 콘텐츠 로드하는 웹뷰
2. navigation: 리디렉션 된 네비게이션 객체
optional func webView(
_ webView: WKWebView,
didCommit navigation: WKNavigation!
)
웹 뷰가 main frame에 대한 콘텐츠를 수신하기 시작했음을 델리게이트에 알린다.
웹 뷰가 콘텐츠를 받기 시작하면 호출된다. (HTML 코드가 로드되는 시점에 호출됨)
webView(_:decidePolicyFor:decisionHandler:)가 네이게이션 응답을 승인하면 웹 뷰는 해당 응답을 처리하기 시작한다.
변경사항에 대해서 준비되면 웹 뷰는 main Frame을 업데이트 전에 이 메서드를 호출한다.
Parameters
1. webView: 콘텐츠 로드하는 웹뷰
2. navigation: 로드 요청을 식별하는 네비게이션 객체
optional func webView(
_ webView: WKWebView,
didFinish navigation: WKNavigation!
)
이 메서드는 웹 뷰가 네이게이션 요청을 처리한 후에 호출된다.
실패한 네비게이션 요청에 대해서는 호출되지 않고 실패한 요청의 경우에는 다른 메서드가 호출 된다.
Parameters
1. webView: 콘텐츠 로드하는 웹뷰
2. navigation: 완료된 네비게이션 객체
optional func webView(
_ webView: WKWebView,
didReceive challenge: URLAuthenticationChallenge,
completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void
)
인증 발생 시
Parameters
1. webView: 콘텐츠 로드하는 웹뷰
2. challenge:
3. completionHandler:
- disposition
- credential:
optional func webView(
_ webView: WKWebView,
authenticationChallenge challenge: URLAuthenticationChallenge,
shouldAllowDeprecatedTLS decisionHandler: @escaping (Bool) -> Void
)
optional func webView(
_ webView: WKWebView,
didFail navigation: WKNavigation!,
withError error: Error
)
optional func webView(
_ webView: WKWebView,
didFailProvisionalNavigation navigation: WKNavigation!,
withError error: Error
)
optional func webViewWebContentProcessDidTerminate(_ webView: WKWebView)
optional func webView(
_ webView: WKWebView,
navigationResponse: WKNavigationResponse,
didBecome download: WKDownload
)
optional func webView(
_ webView: WKWebView,
navigationAction: WKNavigationAction,
didBecome download: WKDownload
)
Protocol: WKNavigationDelegate
당연 틀린 부분 지적은 감사하나 비난은 정중하게 사양하겠다.