Migración del delegado de UIWebView al método de delegado de WKWebView

Estoy trabajando en la migration de UIWebView a WKWebView. He cambiado todos los methods de delegado. Necesito methods de delegado de WKWebView iguales a los del método de delegado de UIWebView. La aplicación funciona bien. pero la session de inicio de session no se retiene

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

Y probé el código siguiente y la session caducó.

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

Por favor, ayúdame a resolver este problema. He cometido un error al cambiar el código de UIWebView a WKWebView.

Es posible que deba implementar lo siguiente en su código, lo que significa que en lugar de utilizar el protocolo UIWebViewDelegate , intente utilizar el protocolo WKNavigationDelegate . Supongo que te estás perdiendo una de las funciones más importantes cuando manejas con sesiones .

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

Hay diferentes types de AuthChallengeDisposition , como

 public enum AuthChallengeDisposition : Int { case useCnetworkingential case performDefaultHandling case cancelAuthenticationChallenge case rejectProtectionSpace } 

Los protocolos completos de WKNavigationDelegate son

  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, URLCnetworkingential?) -> 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) } } 

Supongo que puedes usar webView(_:decidePolicyFor:decisionHandler:) y bloquear / cancelar o permitir requestes. Eso debería funcionar de la misma manera.

Descargo de responsabilidad: aún no lo he probado, lo haré tan pronto como encuentre time.

parsing su código, he encontrado una statement que nunca se alcanza debido a la "devolución" antes llamada.

La statement es:

 decisionHandler(.allow) 

Puede encontrarlo como la última línea de código para la function:

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

que tienes este método:

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