web-dev-qa-db-fra.com

Quelle est la différence entre UIWebView et WKWebView lors du chargement de ressources locales

Je souhaite charger des ressources locales avec webView. J'ai construit une démo à la fois avec UIWebView et WKWebView pour faire des tests avec le code ci-dessous.

    let uiWebView = UIWebView(frame: self.view.bounds)
    self.view.addSubview(uiWebView)

    let wkWebView = WKWebView(frame:CGRect(x: 0, y: 400, width: 500, height: 500))
    self.view.addSubview(wkWebView)

    let path = Bundle.main.path(forResource:"1", ofType: "png")

    guard let realPath = path else {
        return
    }

    let url = URL(string: realPath)
    let fileUrl = URL(fileURLWithPath: realPath)

    if let realUrl = url {
        uiWebView.loadRequest(URLRequest(url:realUrl))
        wkWebView.load(URLRequest(url:realUrl))
    }


  // uiWebView.loadRequest(URLRequest(url:fileUrl))
  // wkWebView.load(URLRequest(url:fileUrl))

UiWebView peut charger la ressource, mais wkWebView ne le peut pas. Mais si j'utilise

  uiWebView.loadRequest(URLRequest(url:fileUrl))
  wkWebView.load(URLRequest(url:fileUrl))

uiWebView et wkWebView peuvent tous deux bien fonctionner. Je suis confus et quelqu'un peut-il expliquer cela pour moi: ne devrais-je pas utiliser l'URL (string: realPath) pour une ressource locale? Mais pourquoi UIWebView peut-il l'utiliser?

30
Rufus

Quelques points:

  1. Apple recommande que vous utilisiez WKWebview pour iOS 8 et versions ultérieures. J'éviterais d'écrire du nouveau code avec UIWebView.

Dans les applications qui s'exécutent dans iOS 8 et versions ultérieures, utilisez la classe WKWebView au lieu de UIWebView. En outre, envisagez de définir la propriété WKPreferencesjavaScriptEnabled sur false si vous restituez des fichiers qui ne sont pas supposés exécuter JavaScript.

  1. Apple tente de s'éloigner du chemin et souhaite utiliser [~ # ~] uri [~ # ~] même pour les fichiers locaux. Ils recommandent de ne pas utiliser /path/to/file.png et utilise file:///path/to/file.png au lieu.

Pour savoir pourquoi une URL fonctionne et pas l’autre, faisons un exemple minimal:

let realPath = "/path/to/file.png"
let url = URL(string: realPath)               // /path/to/file.png
let fileUrl = URL(fileURLWithPath: realPath)  // file:///path/to/file.png
  • url ne fournit pas le schéma (protocole a.k.a). Il ne doit être utilisé qu'avec une autre URL pour donner l'adresse absolue de la ressource que vous essayez d'atteindre. UIWebView le prend en charge pour des raisons de compatibilité ascendante mais Apple a décidé de démarrer en mode minimal avec WKWebView.
  • fileURL a un schéma (file://) qui indique que la ressource est située sur le système de fichiers local. Les autres schémas courants sont http, https, ftp, etc. C'est l'adresse complète d'une ressource afin que les deux vues sachent la résoudre.
35
Code Different

Cela peut être dû à des raisons de sécurité ou à la manière dont l'API WKWebView a été implémentée.

WKWebView dispose d'une méthode d'instance spécifique pour le chargement des ressources locales appelée loadFileURL(_:allowingReadAccessTo:). Cela a été introduit dans iOS 9.

Remarque

Si vous ciblez iOS 8.0 ou une version plus récente, vous devriez utiliser WKWebView au lieu de UIWebView. Voir: https://developer.Apple.com/reference/webkit/wkwebview

3
Ryan H.