web-dev-qa-db-fra.com

WKWebView intercepte les codes d'erreur HTTP avec Swift 4

cette question est identique à la suivante: WKWebView catch HTTP error codes ; malheureusement, les méthodes dans Obj-C ne sont pas applicables à Swift 4, donc le WKNavigationResponse.response cité n'est plus de type NSHTTPURLResponse donc il n'a pas le code d'état http.

Mais le problème est toujours le même: j'ai besoin d'obtenir le code d'état http de la réponse pour détecter si la page attendue est chargée ou non.

Veuillez noter que webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) délégué n'est pas appelé en cas de 404 Mais uniquement en cas de problème de réseau (c'est-à-dire serveur hors ligne); la func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) est appelée à la place.

Merci beaucoup pour vos réponses.

12

À l'aide d'un WKNavigationDelegate sur le WKWebView, vous pouvez obtenir le code d'état de la réponse à chaque réception.

func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse,
             decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {

    if let response = navigationResponse.response as? HTTPURLResponse {
        if response.statusCode == 401 {
            // ...
        }
    }
    decisionHandler(.allow)
}
15
kumar reddy

HTTPURLResponse est une sous-classe de URLResponse. La méthode Swift de "conversion descendante conditionnelle" est la conversion conditionnelle as?, cela peut être combiné avec une liaison conditionnelle if let:

func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse,
             decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {

    if let response = navigationResponse.response as? HTTPURLResponse {
        if response.statusCode == 401 {
            // ...
        }
    }
    decisionHandler(.allow)
}
0
Martin R