ios - type - ¿Cuál es la diferencia entre UIWebView y WKWebView cuando se cargan recursos locales?
wkwebview load url (2)
Quiero cargar recursos locales con webView. Construí una demostración con UIWebView y WKWebView para hacer algunas pruebas con el código a continuación.
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))
El uiWebView puede cargar el recurso pero wkWebView no puede. Pero si yo uso
uiWebView.loadRequest(URLRequest(url:fileUrl))
wkWebView.load(URLRequest(url:fileUrl))
Tanto uiWebView como wkWebView pueden funcionar bien. Estoy confundido y ¿alguien puede explicarme eso? ¿No debería usar la URL (cadena: realPath) para un recurso local? Pero ¿por qué UIWebView puede usarlo?
Esto puede ser por razones de seguridad, o simplemente cómo se implementó la API WKWebView
.
WKWebView
tiene un método de instancia específico para cargar recursos locales llamado loadFileURL(_:allowingReadAccessTo:)
. Esto fue introducido en iOS 9.
Nota
Si está apuntando a iOS 8.0 o más reciente, debe usar WKWebView
lugar de UIWebView
. Consulte: https://developer.apple.com/reference/webkit/wkwebview
Un par de puntos:
- Apple recommends que uses
WKWebview
para iOS 8 y versiones posteriores. Yo evitaría escribir código nuevo conUIWebView
.
En las aplicaciones que se ejecutan en iOS 8 y versiones posteriores, use la clase
WKWebView
lugar de usarUIWebView
. Además, considere la posibilidad de configurar la propiedad deWKPreferences
enfalse
si renderiza archivos que no deben ejecutar JavaScript.
- Apple ha intentado alejarse de la ruta y, en cambio, desea utilizar URI incluso para archivos locales. Recomiendan que NO use
/path/to/file.png
y usefile:///path/to/file.png
enfile:///path/to/file.png
lugar.
En cuanto a por qué una URL funciona y la otra no, vamos a hacer un ejemplo mínimo:
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
no proporciona el esquema (también conocido como protocolo). Solo se debe utilizar junto con otra URL para proporcionar la dirección absoluta del recurso al que intenta acceder.UIWebView
admite por razones de compatibilidad con versiones anteriores, pero Apple decidió comenzar conWKWebView
. -
fileURL
tiene un esquema (file://
) que indica que el recurso se encuentra en el sistema de archivos local. Otros esquemas comunes sonhttp
,https
,ftp
, etc. Es una dirección completa a un recurso para que ambas vistas sepan cómo resolverlo.