¿Cuál es la diferencia entre UIWebView y WKWebView al cargar resources locales?

Quiero cargar resources locales con webView. Construí una demostración con UIWebView y WKWebView para hacer algunas testings 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)) 

La uiWebView puede cargar el recurso, pero wkWebView no puede cargarlo. Pero si uso

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

Tanto uiWebView como wkWebView pueden funcionar bien. Estoy confundido y alguien puede explicármelo: ¿No debería usar la URL (cadena: realPath) para un recurso local? ¿Pero por qué UIWebView puede usarlo?

Un par de puntos:

  1. UIWebView está en desuso. No escriba un nuevo código con él.
  2. Apple ha estado tratando de alejarse de la ruta y usar URI incluso para files locales. Recomiendan que NO use /path/to/file.png y use el file:///path/to/file.png en file:///path/to/file.png lugar.

En cuanto a por qué una URL funciona y la otra no, hagamos 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 debe usarse junto con otra URL para proporcionar la dirección absoluta del recurso al que intenta llegar. UIWebView admite por razones de compatibilidad hacia atrás, pero Apple decidió comenzar a limpiar con WKWebView .
  • fileURL tiene un esquema ( file:// ) que indica que el recurso se encuentra en el sistema de files local. Otros esquemas comunes son http , https , ftp , etc. Es una dirección completa de un recurso para que ambas vistas sepan cómo resolverlo.

Esto podría ser por razones de security, o simplemente cómo se implementó la API de WKWebView .

WKWebView tiene un método de instancia específico para cargar resources locales llamado loadFileURL(_:allowingReadAccessTo:) . Esto se introdujo en iOS 9.

Nota

Si está orientado a iOS 8.0 o posterior, debería usar WKWebView lugar de UIWebView . Ver: https://developer.apple.com/reference/webkit/wkwebview