2017-09-12 170 views
20

我正在將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://stackoverflow.com/questions/37509990/migrating-from-uiwebview-to-wkwebview) – the4kman

+0

你能提供關於崩潰的更多信息嗎?你必須在這個方法中調用'decisionHandler',崩潰是否可以與此相關? –

+0

沒有'App Delegate'崩潰。我已添加截圖請參閱@MertBuran – Siva

回答

1

我想你可以使用webView(_:decidePolicyFor:decisionHandler:)並阻止/取消或允許請求。這應該以同樣的方式工作。

免責聲明:我沒有測試過呢,我會這樣,只要我找到了一些時間做。

2

你可能需要實現在你的代碼,這意味着不是使用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

1

分析你的代碼,我發現永遠不能到達的聲明以前稱之爲「返回」的原因。

的說法是:

decisionHandler(.allow) 

你可以找到的功能它的代碼作爲最後一行:

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

您擁有了這種方法:

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