Search code examples
iosswiftuiwebviewwkwebview

Migrating from UIWebView to WKWebView


I'm migrating from UIWebView to WKWebView, how can I rewrite these function for WKWebView?

func webViewDidStartLoad(webView: UIWebView){}
func webViewDidFinishLoad(webView: UIWebView){}

and

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    print("webview asking for permission to start loading")
    if navigationType == .LinkActivated && !(request.URL?.absoluteString.hasPrefix("http://www.myWebSite.com/exemlpe"))!{
        UIApplication.sharedApplication().openURL(request.URL!)
        print(request.URL?.absoluteString)
        return false
    }
    print(request.URL?.absoluteString)
    lastUrl = (request.URL?.absoluteString)!

    return true
}


func webView(webView: UIWebView, didFailLoadWithError error: NSError?) {
    print("webview did fail load with error: \(error)")
    let testHTML = NSBundle.mainBundle().pathForResource("back-error-bottom", ofType: "jpg")
    let baseUrl = NSURL(fileURLWithPath: testHTML!)
        
    let htmlString:String! = "myErrorinHTML"
    self.webView.loadHTMLString(htmlString, baseURL: baseUrl)
}

Solution

  • UIWebView => WKWebView Equivalent

    UIWebViewDelegate => WKNavigationDelegate
    
    delegate => navigationDelegate
    didFailLoadWithError => didFailNavigation
    webViewDidFinishLoad => didFinishNavigation
    webViewDidStartLoad => didStartProvisionalNavigation
    shouldStartLoadWithRequest => decidePolicyForNavigationAction
    

    About shouldStartLoadWithRequest you can write:

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        print("webView:\(webView) decidePolicyForNavigationAction:\(navigationAction) decisionHandler:\(decisionHandler)")
        
        switch navigationAction.navigationType {
            case .linkActivated:
            if navigationAction.targetFrame == nil {
                self.webView?.loadRequest(navigationAction.request)
            }
            if let url = navigationAction.request.url, !url.absoluteString.hasPrefix("http://www.myWebSite.com/example") {
                UIApplication.shared.open(url)
                print(url.absoluteString)
                decisionHandler(.cancel)
            return
            }
            default:
                break
        }
        
        if let url = navigationAction.request.url {
            print(url.absoluteString)
        }
        decisionHandler(.allow)
    }
    

    And for the didFailLoadWithError:

    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
        print("webView:\(webView) didFailNavigation:\(navigation) withError:\(error)")
        let testHTML = Bundle.main.path(forResource: "back-error-bottom", ofType: "jpg")
        let baseUrl = URL(fileURLWithPath: testHTML!)
    
        let htmlString = "myErrorInHTML"
        self.webView.loadHTMLString(htmlString, baseURL: baseUrl)
    }