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)")
}
'Swift iOS 앱 개발 > Swift' 카테고리의 다른 글
[Swift iOS] UICollectionView scroll to top / bottom (0) | 2021.10.13 |
---|---|
[Swift iOS] CLLocationManager 위치정보 GPS 주소 가져오기 (0) | 2021.10.06 |
[Swift iOS] Convert number into money format with a comma (feat. NumberFormatter 숫자 콤마 표시) (0) | 2021.09.30 |
[Swift iOS] webview 로딩 완료 감지 (feat. WKNavigationDelegate) (0) | 2021.09.27 |
[Swift iOS] 키보드가 textField를 가릴 때 해결법 (0) | 2021.09.23 |