ios - example - wkwebview swift 4




Cargue recursos de la ruta relativa utilizando html local en uiwebview (6)

En Swift 3.01 usando WKWebView:

let localURL = URL.init(fileURLWithPath: Bundle.main.path(forResource: "index", ofType: "html", inDirectory: "CWP")!)
myWebView.load(NSURLRequest.init(url: localURL) as URLRequest)

Esto se ajusta para algunos de los cambios de sintaxis más finos en 3.01 y mantiene la estructura del directorio en su lugar para que pueda incrustar archivos HTML relacionados.

Tengo una aplicación de iOS muy simple con uiwebview cargando una página de prueba muy simple (test.html):

<html>
<body>
<img src="img/myimage.png" />
</body>
</html>

Cargué este archivo test.html en mi vista web:

NSURL *url = [[NSBundle mainBundle] URLForResource:@"test" withExtension:@"html"];
NSString *html = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSURL *baseUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];
[webView loadHTMLString:html baseURL:baseUrl];

Esto funciona bien si hago referencia a la imagen sin la ruta relativa y pongo la imagen referenciada en la ruta raíz en Objetivos -> Copiar recursos de paquete dentro de XCode, sin embargo, no puedo hacer que funcione con la ruta relativa como se muestra en mi archivo html . Debe haber una manera de hacer esto, tengo muchas imágenes, CSS, archivos javascript que quiero cargar en la vista web y me gustaría no tener que tener todo en la raíz y tener que cambiar todas las referencias en mi web aplicación


En Swift:

 func pathForResource(  name: String?, 
                        ofType ext: String?, 
                        inDirectory subpath: String?) -> String?  {

  // **name:** Name of Hmtl
  // **ofType ext:** extension for type of file. In this case "html"
  // **inDirectory subpath:** the folder where are the file. 
  //    In this case the file is in root folder

    let path = NSBundle.mainBundle().pathForResource(             "dados",
                                                     ofType:      "html", 
                                                     inDirectory: "root")
    var requestURL = NSURL(string:path!)
    var request = NSURLRequest(URL:requestURL)

    webView.loadRequest(request)
}

He metido todo en una sola línea (lo sé mal) y no tuve problemas con eso:

[webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" 
                                                                                                         ofType:@"html"]
                                                             isDirectory:NO]]];         

He vuelto y probado y vuelto a probar esto, parece que la única forma en que puedo hacer que funcione (ya que tengo algunos archivos en la carpeta img y algunos en js / css, etc.) no es para use una ruta relativa a mi imagen en el html y haga que todo se haga referencia a la carpeta del paquete. Qué lástima :(.

<img src="myimage.png" />

Simplemente hago esto:

    UIWebView *webView = [[[UIWebView alloc] init] autorelease];

    NSURL *url = [[NSBundle mainBundle] URLForResource:@"index" withExtension:@"html"];
    NSURLRequest* request = [NSURLRequest requestWithURL:url];
    [webView loadRequest:request];

Donde "index.html" hace referencia relativamente a imágenes, CSS, javascript, etc.


Swift respuesta 2.

La referencia de clase de UIWebView desaconseja el uso de webView.loadRequest (solicitud):

No use este método para cargar archivos HTML locales; en su lugar, use loadHTMLString: baseURL :.

En esta solución, el html se lee en una cadena. La URL del html se usa para calcular la ruta y la pasa como una URL base.

let url = bundle.URLForResource("index", withExtension: "html", subdirectory: "htmlFileFolder")
let html = try String(contentsOfURL: url)
let base = url.URLByDeletingLastPathComponent
webView.loadHTMLString(html, baseURL: base)




uiwebview