HTML 파일을 읽어들일 때 사용. 쉽게 말해 웹페이지를 로드한다고 생각을 하시면 될 거 같습니다.
비동기 메서드라 동시에 다른 로직을 처리할 수 있어 앱이 자연스럽게 진행이 되어가는 장점이 있습니다.
func load(_ request: URLRequest) -> WKNavigation?
말 그대로 HTMLString을 읽어오는 메서드로 직접 웹페이지를 로드해서 웹페이지로 이동을 하거나 개발자가 만든 URL로 이동하게 함
- 첫 번째불러올 웹페이지 url을 읽어오는 것입니다.
- 두 번째relative URL을 해결할 때 사용되는 기본 URL
func loadHTMLString(_ string: String,
baseURL: URL?) -> WKNavigation?
웹페이지의 로딩진행여부를 확인하는 프로퍼티
var isLoading: Bool
웹페이지가 로딩 중일 때 중단을 하고자 사용을 하는 메서드입니다.
만약 load 메서드가 실행 중이다가 이 메서드가 호출이 되면 load메서드는 실행이 중단돼버립니다.
func stopLoading()
이 메서드는 현재 웹페이지를 리로딩하게 해주는 동작 메서드로 멈춘 로딩을 다시 시작하게 해주는 메서드입니다.
func reload() -> WKNavigation?
현재 웹페이지에서 뒤로 가기 버튼의 기능을 하는 메서드로 현재 웹페이지에서 뒤로 보내주게 됩니다.
만약 현재 웹페이지에서 뒤로가기 아이템이 없다면 nil을 반환하게 되어 아무 동작도 하지를 않습니다.
이 메서드는 현재 웹페이지에서 앞으로 가기 버튼의 기능과 같은 메서드입니다.
위 goBack()과 같이 만약 이 페이지가 끝에 있는 마지막 페이지여서 앞으로 갈 아이템이 없다면 nil을 반환하게 돼 아무 동작을 하지 않습니다.
var backForwardList: WKBackForwardList
backForwardList 타입은 WKBackForwardList클래스 타입으로 이 클래스 타입은 웹뷰에서 방문했던 웹페이지의 리스트를 관리하는 객체입니다.
따라서 방문했던 웹페이지를 가기 위해서 해당 프로퍼티를 사용하면 될 것 같습니다.
https://developer.apple.com/documentation/webkit/wknavigationdelegate
해당 프로토콜에서 웹페이지 로딩이 호출될 때 사용되는 메서드
- webView(_:decidePolicyFor:descisionHandler:) 웹페이지를 읽어올지 탐색여부를 결정하는 메서드
- webView(_:didStartProvisionNavigation:)웹뷰가 콘텐츠 탐색을 시작할 때 호출
- webView(:didCommit:) 웹뷰가 콘텐츠를 받기 시작할때 호출
- webView(_:didFinish:)웹뷰가 콘텐츠 받기를 완료했을 때 호출
- webView(_:didFail:withError:)웹 뷰가 콘텐츠를 받기 실패했을 때 호출
이 메서드는 load메서드를 통해 웹페이지를 로딩했을 때 호출이 되고 만약 웹페이지 안에서 다른 페이지로 넘어갔을 때도 호출이 됩니다.
그런데 만약에 웹 전체를 교체하는 게 아니라 AJAX방식인 부분적인 웹 부분만 교체하는 방식의 웹뷰라면 델리게이트 메서드 호출 순서가 다를 수가 있어 조심하게 다뤄야 합니다
optional func webView(_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
preferences: WKWebpagePreferences,
decisionHandler: @escaping (WKNavigationActionPolicy, WKWebpagePreferences
웹뷰가 웹페이지를 읽어올지 탐색여부를 결정하는 메서드
- Parameter
- webView: 해당 웹뷰
- navigationAction:
- 탐색 요청을 트리거한 작업에 대한 세부 정보를 포함하고 있는 객체
- URLRequest로부터 URL을 호출할 때 해당 매개변수로 접근
- preferences
- 새로운 웹페이지를 보여줄 때 사용하는 기본 환경설정 정보
- decisionHandler
- 함수 타입으로 특정 인자 값을 넣어 호출을 함으로써 웹페이지의 로딩 여부를 결정. 이 매개변수를 사용하면 특정 url을 들어가는 웹페이지를 차단을 할 수 있는데 그 방법은 해당 함수의 인자 값을. cancel로 바꿔서 호출하면 됩니다.
- 차단을 하고 싶으면decisionHandler(. cancel)
- 허용을 하고 싶으면decisionHandler(. allow)
만약 특정 urldmf 차단을 하고 싶으면 아래와 같이 코드를 작성하며 됩니다.
optional func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, preferences: WKWebpagePreferences,
decisionHandler: @escaping (WKNavigationActionPolicy )-> Void) {
guard let url = navigationAction.request.url?.absoluteString else { return }
if url.start(with: “http”) {
decisionHandler(.cancel)
}
}
- navigationAction의 매개변수를 통해서 request 했던 url을 읽어와 해당 URL이 http이 시작을 하면 decisionHandler(. cancel)을 통해 차단을 하는 방식입니다.
optional func webView(_ webView: WKWebView,
didStartProvisionalNavigation navigation: WKNavigation!)
웹뷰가 콘텐츠를 로드하기 시작할 때 호출되는 메서드
optional func webView(_ webView: WKWebView,
didCommit navigation: WKNavigation!)
- 웹뷰가 메인 프레임을 위한 콘텐츠를 받기 시작할 때 호출되는 메서드로 콘텐츠를 받기 시작할때 처리해줄 것이 있을 때 사용을 하면 됩니다.
- 로딩 상태를 표시해주는 액티비티 인디케이터 뷰를 사용할 때에도 사용이 되는 메서드 → 액티비티 인디케이터 뷰를 사용하는 목적은 웹페이지를 로딩할 때 시간이 꽤 걸리는 경우가 있어 사용자에게 앱이 죽은 게 아니라 로딩이 되어있다는 것을 보여주기 위해 액티비티 인디케이터 뷰를 사용하게 됩니다.
optional func webView(_ webView: WKWebView,
didFinish navigation: WKNavigation!)
- 웹뷰가 콘텐츠 데이터를 받아오는 것을 모두 마쳤을 때 호출되는 메서드입니다. 즉 웹페이지가 웹뷰에 완전히 보여주고 나면 호출이 된다고 생각을 하시면 됩니다.
- 또 이때 didCommit때 보여줬던 액티비티 인디케이터 뷰를 보여줬는데요, 만약 웹뷰에 모두 로딩이 되었는데도 로딩이 계속되면 사용자가 당황 하겠죠? 그러므로 인디케이터뷰를 숨겨주는 코드를 여기에 작성을 해주면 됩니다.
optional func webView(_ webView: WKWebView,
didFail navigation: WKNavigation!,
withError error: Error)
- 이 메서드는 콘텐츠 로딩이 실패를 했을 때 호출이 되는 메서드로 웹페이지를 불러오는 도중에 실패했을 때 호출이 되는 메서드입니다.
- 세 번째 매개변수인 withError를 통해 에러를 확인할 수 있어 에러가 발생했을 때 해당 메서드를 통해서 에러를 확인할수 있습니다.
optional func webView(_ webView: WKWebView,
didFailProvisionalNavigation navigation: WKNavigation!,
withError error: Error)
- 위의 didFail메서드와 같이 에러가 발생했을때 호출되는 메서드
- 웹페이지 로딩되었을 때 호출되는 것이 아니라 URL이 잘못되었거나 네트워크 오류가 발생해 웹페이지 자체를 아예 불러오지 못했을 때 호출되는 메서드입니다.
- 마찬가지로 error 매개변수를 통해 무슨 에러인지 확인 가능
https://developer.apple.com/documentation/webkit/wkuidelegate
사용자의 유저 인터페이스를 보여주는 유저 인터페이스의 요소들을 보여주기 위한 메서드로 말 그대로 UIDelegate라고 생각을 하시면 될 거 같습니다.
- webView(_:createWebViewWith:for:windowFeatures:)새로운 웹뷰를 만들어주는 메서드
- webViewDidClose(_:)webView창이 성공적으로 닫혔음을 알려줍니다.
- webView(_:runJavaScriptAlertPanelWithMessage:initiatedBtFrame:completionHandler:)자바스크립트 알람 패널을 보여줍니다.
- webView(_:runOpenPanelWith:initiatedByFrame:completionHandler:)패널에 파일을 업로드하는 것을 보여줍니다.
optional func webView(_ webView: WKWebView,
createWebViewWith configuration: WKWebViewConfiguration,
for navigationAction: WKNavigationAction,
windowFeatures: WKWindowFeatures) -> WKWebView?
새로운 웹뷰를 만들어주는 메서드
Parameters
- webView
- 델리게이트 메서드를 호출할 웹뷰
- configuration
- 새로운 웹뷰를 만들 때 사용할 구성
- navigationAction
- 새로운 웹뷰를 만들어서 호출할 때 야기할 행동
- windowFeatures
- 웹페이지의 요구 특징
optional func webViewDidClose(_ webView: WKWebView)
창이 성공적으로 닫혔음을 앱에 알려주는 메서드
optional func webView(_ webView: WKWebView,
runJavaScriptAlertPanelWithMessage message: String,
initiatedByFrame frame: WKFrameInfo,
completionHandler: @escaping () -> Void)
자바스크립트의 알람 패널을 보여주는 메서드.
Parameters
- webView
- 델리게이트 메서드를 호출할 웹뷰
- message
- 보여줄 메시지
- frame
- 자바스크립트 프로세스가 호출을 시작한 프레임에 대한 정보
- completionHandler
- 알림 창 패널이 사라지고 난 후에 호출될 클로저 함수
optional func webView(_ webView: WKWebView,
runOpenPanelWith parameters: WKOpenPanelParameters,
initiatedByFrame frame: WKFrameInfo,
completionHandler: @escaping ([URL]?) -> Void)
파일 업로드 패널을 보여주는 메서드입니다
Parameters
- webView
- 델리게이트 메서드를 호출할 웹뷰
- parameters
- 파일 업로드 control을 보여주는 파라미터
- frame
- 파일 업로드 호출을 시작하면 불려지는 파라미터
- completionHandler
- 열려있던 패널이 사라지고 불려지는 후행 클로저로 만약에 사용자가 OK를 선택하면 통과하게 됩니다.