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?
Quelques points:
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 deUIWebView
. En outre, envisagez de définir la propriétéWKPreferences
javaScriptEnabled
surfalse
si vous restituez des fichiers qui ne sont pas supposés exécuter JavaScript.
/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.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.
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