UIWebView से WKWebView में माइग्रेट करना


106

अपने ऐप में मैं UIWebView से WKWebView पर माइग्रेट कर रहा हूं, मैं WKWebView के लिए इन फ़ंक्शन को कैसे लिख सकता हूं?

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

तथा

    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)
    }

आप की तरह लगता है पर एक नज़र रखना चाहिए navigationDelegateकी WKWebView
luk2302

इसी तरह का मुद्दा - आपकी मदद कर सकता है - stackoverflow.com/questions/46793618/ios-wkwebview-vs-uiwebview
क्रुनाल

जवाबों:


205

UIWebView => WKWebView समतुल्य

didFailLoadWithError => didFailNavigation
webViewDidFinishLoad => didFinishNavigation
webViewDidStartLoad => didStartProvisionalNavigation
shouldStartLoadWithRequest => decidePolicyForNavigationAction

के बारे में shouldStartLoadWithRequestआप लिख सकते हैं:

func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: ((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 where !url.absoluteString.hasPrefix("http://www.myWebSite.com/example") {
            UIApplication.sharedApplication().openURL(url)
            print(url.absoluteString)
            decisionHandler(.Cancel)
        return
        }
        default:
            break
    }

    if let url = navigationAction.request.URL {
        print(url.absoluteString)
    }
    decisionHandler(.Allow)
}

और इसके लिए didFailLoadWithError:

func webView(webView: WKWebView, didFailNavigation navigation: WKNavigation, withError error: NSError) {
    print("webView:\(webView) didFailNavigation:\(navigation) withError:\(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)
}

1
webViewDidFinishLoad और didFinishNavigation बिल्कुल समान नहीं हैं। पृष्ठ को पूरी तरह से लोड करने से पहले didFinishNavigation विधि कहा जाता है।
मीकल किचन

प्रलेखन का कहना है कि यह विधि केवल ओएक्सएक्स के लिए है। यह सवाल iOS
Gargo

1
@Gargo दोनों विवरणों पर एक नज़र डालें: webViewDidFinishLoad , didFinishNavigation , जैसा कि आप देखते हैं कि यह iOS 8.0+ के लिए भी उपलब्ध है
Alessandro Ornano

stackoverflow.com/questions/46171410/... - किसी मदद मुझे इस मुद्दे @AlessandroOrnano
शिव

4
बस संक्षिप्त रूप से ध्यान दें कि ये विधियाँ घोषित की गई हैं WKNavigationDelegate(नहीं WKUIDelegate)।
माइक केस्किनोव

30

यहाँ माइग्रेशन के लिए ऑब्जेक्टिव-सी विधियाँ दी गई हैं

1) shouldStartLoadWithRequest -> decisionPolicyForNavigationAction

कॉल करना याद रखें 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 {
}

3
इसके WKNavigationTypeLinkActivatedबजाय होना चाहिए UIWebViewNavigationTypeLinkClicked?
क्यूपॉन्टे

12

UIWebView को WKWebView में स्थानांतरित करना, स्विफ्ट 4 :

के बराबर 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
    }
}

के बराबर webViewDidStartLoad:

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

के बराबर 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/"))
    }
}

के बराबर webViewDidFinishLoad:

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    print(String(describing: webView.url))
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.