Migrating from UIWebView to WKWebView

后端 未结 3 1437
有刺的猬
有刺的猬 2020-11-30 17:05

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

    func webViewDidStartLoad(webView: UIWebView){}
            


        
相关标签:
3条回答
  • 2020-11-30 17:28

    Here is the Objective-C methods for the migration

    1) shouldStartLoadWithRequest -> decidePolicyForNavigationAction

    Remember to call the decisionHandler

    - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
           if (navigationAction.navigationType == UIWebViewNavigationTypeLinkClicked) {
    
           }
           NSString *url = [navigationAction.request.URL query];
    
           decisionHandler(WKNavigationActionPolicyAllow);
    }
    

    2) webViewDidStartLoad -> didStartProvisionalNavigation

    - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {
    }
    

    3) webViewDidFinishLoad -> didFinishNavigation

    - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
    }
    

    4) didFailLoadWithError -> didFailNavigation

    - (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error {
    }
    
    0 讨论(0)
  • 2020-11-30 17:31

    UIWebView => WKWebView Equivalent

    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)
    }
    
    0 讨论(0)
  • 2020-11-30 17:34

    Migrating UIWebView to WKWebView, Swift 4:

    Equivalent of shouldStartLoadWithRequest:

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        var action: WKNavigationActionPolicy?
    
        defer {
            decisionHandler(action ?? .allow)
        }
    
        guard let url = navigationAction.request.url else { return }
    
        print(url)
    
        if navigationAction.navigationType == .linkActivated, url.absoluteString.hasPrefix("http://www.example.com/open-in-safari") {
            action = .cancel                  // Stop in WebView
            UIApplication.shared.openURL(url) // Open in Safari
        }
    }
    

    Equivalent of webViewDidStartLoad:

    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
        print(String(describing: webView.url))
    }
    

    Equivalent of didFailLoadWithError:

    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
        let nserror = error as NSError
        if nserror.code != NSURLErrorCancelled {
            webView.loadHTMLString("404 - Page Not Found", baseURL: URL(string: "http://www.example.com/"))
        }
    }
    

    Equivalent of webViewDidFinishLoad:

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        print(String(describing: webView.url))
    }
    
    0 讨论(0)
提交回复
热议问题