Миграция из UIWebView в WKWebView
в моем приложении я мигрирую из 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)
}
3 ответа:
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) }
миграция UIWebView в WKWebView,Swift 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)) }
здесь С методы миграция
1) shouldStartLoadWithRequest - > decidePolicyForNavigationAction
не забудьте позвонить
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 { }