mac linea instalar for ios swift swift3 xcode8

ios - instalar - xcode en linea



Migración del delegado UIWebView al método del delegado WKWebView (3)

Al analizar su código, encontré una declaración a la que nunca se llegó a causa de "devolución" llamada antes.

La declaración es:

decisionHandler(.allow)

Lo puedes encontrar como última línea de código para la función:

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

que tienes este método:

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

Estoy trabajando en la migración de UIWebView a WKWebView. He cambiado todos los métodos de delegado. Necesito métodos de delegado de WKWebView iguales a los del método de delegado de UIWebView. La aplicación está funcionando bien. pero la sesión de inicio de sesión no se mantiene

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é debajo del código y la sesión 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 usar el protocolo UIWebViewDelegate , intente usar el protocolo WKNavigationDelegate . Supongo que te estás perdiendo una de las funciones más importantes cuando estás manejando sesiones .

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

Hay diferentes tipos de AuthChallengeDisposition , como

public enum AuthChallengeDisposition : Int { case useCredential 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, 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) } }


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

Descargo de responsabilidad: no he probado eso todavía, lo haré tan pronto como encuentre algo de tiempo.