web-dev-qa-db-fra.com

Obtenez l'URL complète actuelle de WKWebView

Existe-t-il un moyen d'obtenir l'URL COMPLÈTE chargée par un WKWebView pour chaque demande?

webView:didFinishNavigation:

Fonctionne uniquement pour les navigations mainFrame et ne fournit pas de paramètre de demande d'URL.

Comment puis-je obtenir l'URL complète comme dans UIWebViewDelegate

webViewDidFinishLoad:webView

... qui est invoqué une fois le chargement terminé et vous pouvez obtenir l'URL de demande complète à partir du paramètre webView.

C'est bien que la propriété WKWebView de URL enregistre le travail qui doit être fait pour extraire une URL de base compatible avec l'interface utilisateur, mais c'est une perte énorme que nous ne pouvons pas obtenir la pleine!

J'ai essayé d'utiliser

webView:decidePolicyForNavigationAction:decisionHandler:

... mais elle produit des résultats différents pour les URL par rapport à ce qu'une propriété UIWebViewrequest contient après avoir terminé le chargement d'une page.

19
i-konov

Tout d'abord, je pense que vous confondez NSURL et NSURLRequest. Le premier est facilement accessible via webView.URL et il vous donne en fait RL complète de tout ce qui a été chargé. En supposant que là où vous dites URL vous voulez dire NSURL.

Si ce n'est pas ce que vous vouliez dire, par exemple si vous vouliez voir la chaîne de redirection ou les en-têtes de réponse, alors je crains que la réponse soit que vous ne pouvez pas accéder aux informations spécifiques via le WKWebView.

Vous devrez vous replier sur UIWebView où vous pourrez intercepter les demandes relativement facilement et voir la demande/réponse complète.

12
Stefan Arentz

Vous pouvez obtenir l'URL d'une page Web nouvellement demandée par "navigationAction.request.URL" dans la méthode déléguée decidePolicyForNavigationAction.

func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) {
   if let urlStr = navigationAction.request.URL?.absoluteString{
      //urlStr is what you want, I guess.
   }
   decisionHandler(.Allow)
}
16
Yuichi Kato

C'est réponse de Yuichi Kato pour Swift 4. Il récupère l'URL complète de la propriété request de l'action de navigation dans le webView(_:decidePolicyFor:decisionHandler:) méthode de WKNavigationDelegate.

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    if let urlStr = navigationAction.request.url?.absoluteString {
        //urlStr is what you want
    }

    decisionHandler(.allow)
}

N'oubliez pas de conformer votre classe à WKNavigationDelegate et définissez le délégué de votre vue Web en conséquence:

class WebViewController: UIViewController, WKNavigationDelegate

[...]

webView.navigationDelegate = self
6
Tamás Sengel