将UIWebView委托迁移到WKWebView委托方法

问题描述:

我正在将UIWebView迁移到WKWebView。我改变了所有的委托方法。我需要WKWebView委托方法等于UIWebView委托方法。该应用程序工作正常。但登录会话不保留将UIWebView委托迁移到WKWebView委托方法

UIWebView: 

    extension WebViewController: UIWebViewDelegate { 

    func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool { 

    guard let url = request.url else { 
     return true 
    } 

    guard !url.absoluteString.contains("data:application/pdf") else { 
     navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.action, 
                  target: self, 
                  action: #selector(share(sender:))) 
     return true 
    } 

    guard url.pathExtension != "pdf" else { 
     let safariVC = SFSafariViewController(url: url) 
     safariVC.modalPresentationStyle = .popover 
     present(safariVC, animated: true, completion: nil) 
     return false 
    } 

    guard url.isLogin() == false else { 
     AppDelegate.navigationController.signOut(.sessionOnly) 
     return false 
    } 

    guard let mobileSite = url.asMobileSite() else { 
     return true 
    } 

    let mobileRedirect = URLRequest(url: mobileSite) 
    webView.loadRequest(mobileRedirect) 
    return false 

} 

func webViewDidStartLoad(_ webView: UIWebView) { 
    numberOfDidStartLoads += 1 
} 

func webViewDidFinishLoad(_ webView: UIWebView) { 
    numberOfDidStartLoads -= 1 
} 

func webView(_ webView: UIWebView, didFailLoadWithError error: Error) { 
    numberOfDidStartLoads -= 1 
} 
} 

而我试着下面的代码,并获得会话过期。

extension WebViewController: UIWebViewDelegate { 

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (_: WKNavigationActionPolicy) -> Void) { 

    guard let url = navigationAction.request.url else { 
     decisionHandler(.allow) 
     return 
    } 

    guard !url.absoluteString.contains("data:application/pdf") else { 
     navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.action, 
                  target: self, 
                  action: #selector(share(sender:))) 
     decisionHandler(.allow) 
     return 
    } 

    guard url.pathExtension != "pdf" else { 
     let safariVC = SFSafariViewController(url: url) 
     safariVC.modalPresentationStyle = .popover 
     present(safariVC, animated: true, completion: nil) 
     decisionHandler(.cancel) 
     return 
    } 

    guard url.isLogin() == false else { 
     AppDelegate.navigationController.signOut(.sessionOnly) 
     decisionHandler(.cancel) 
     return 
    } 

    guard let mobileSite = url.asMobileSite() else { 
     decisionHandler(.allow) 
     return 
    } 

    let mobileRedirect = URLRequest(url: mobileSite) 
    webView.load(mobileRedirect) 
    decisionHandler(.cancel) 
    return 

    decisionHandler(.allow) 

} 

    func webViewDidStartLoad(_ webView: UIWebView) { 
     numberOfDidStartLoads += 1 
    } 

    func webViewDidFinishLoad(_ webView: UIWebView) { 
     numberOfDidStartLoads -= 1 
    } 

    func webView(_ webView: UIWebView, didFailLoadWithError error: Error) { 
     numberOfDidStartLoads -= 1 
    } 
} 

请帮我解决这个问题。我在将UIWebView中的代码更改为WKWebView时犯了一些错误。

+0

可能的复制[从UIWebView迁移到WKWebView](https://*.com/questions/37509990/migrating-from-uiwebview-to-wkwebview) – the4kman

+0

你能提供关于崩溃的更多信息吗?你必须在这个方法中调用'decisionHandler',崩溃是否可以与此相关? –

+0

没有'App Delegate'崩溃。我已添加截图请参阅@MertBuran – Siva

我想你可以使用webView(_:decidePolicyFor:decisionHandler:)并阻止/取消或允许请求。这应该以同样的方式工作。

免责声明:我没有测试过呢,我会这样,只要我找到了一些时间做。

你可能需要实现在你的代码,这意味着不是使用UIWebViewDelegate协议尝试使用WKNavigationDelegate协议如下。我想你在处理会话时错过了最重要的功能之一。

func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { 
     print(#function) 
     completionHandler(.performDefaultHandling,nil) 
    } 

有不同类型的AuthChallengeDisposition,像

public enum AuthChallengeDisposition : Int { 


    case useCredential 

    case performDefaultHandling 

    case cancelAuthenticationChallenge 

    case rejectProtectionSpace 
} 

完全WKNavigationDelegate协议

extension ViewController: WKNavigationDelegate{ 
    func webViewWebContentProcessDidTerminate(_ webView: WKWebView) { 
     print(#function) 
    } 

    func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) { 
     print(#function) 
    } 

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { 
     print(#function) 
    } 

    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) { 
     print(#function) 
    } 

    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { 
     print(#function) 
    } 

    func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) { 
     print(#function) 
    } 

    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { 
     print(#function) 
    } 

    func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { 
     print(#function) 
     completionHandler(.performDefaultHandling,nil) 
    } 

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { 
     print(#function) 
     decisionHandler(.allow) 
    } 

    func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) { 
     print(#function) 
     decisionHandler(.allow) 
    } 
} 
+0

我猜会议不会保留。同样的事情在UIWebView中工作正常。你需要更多信息吗? – Siva

分析你的代码,我发现永远不能到达的声明以前称之为“返回”的原因。

的说法是:

decisionHandler(.allow) 

你可以找到的功能它的代码作为最后一行:

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (_: WKNavigationActionPolicy) -> Void) 

您拥有了这种方法:

func webViewDidStartLoad(_ webView: UIWebView) { 
    numberOfDidStartLoads += 1 
}