Cargue resources de la ruta relativa usando html local en uiwebview

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

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

Cargo este file 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 reference a la image sin la ruta relativa y pongo la image a la que se hace reference en la ruta raíz en Destinos -> Copiar packages de packages dentro de XCode, pero no puedo hacer que funcione con la ruta relativa como se muestra en mi file html . Debe haber una manera de hacer esto, tengo muchas imágenes, css, files 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 references en mi web aplicación

Así es como cargar / usar un html local con references relativas.

  1. Arrastre el recurso a su proyecto xcode (arrastré una carpeta llamada www desde la window de mi buscador), obtendrá dos opciones "crear grupos para cualquier carpeta agregada" y "crear references de carpetas para cualquier carpeta agregada".
  2. Seleccione la opción "crear references de carpeta …".
  3. Use el siguiente código dado. Debería funcionar como un hechizo.

    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"www"]];
    [webview loadRequest:[NSURLRequest requestWithURL:url]];

Ahora todos los enlaces relativos (como img / .gif, js / .js) en el html deberían resolverse.

Swift 3

  if let path = Bundle.main.path(forResource: "dados", ofType: "html", inDirectory: "root") { webView.load( URLRequest(url: URL(fileURLWithPath: path)) ) } 

En Swift:

func pathForResource (nombre: String? ofType ext: String? inDirectory subpath: String?) -> String?
nombre: nombre de Hmtl;
ofType ext: extensión para el tipo de file. En este caso "html";
Subpath inDirectory: la carpeta donde se encuentra el file. En este caso, el file está en la carpeta raíz;

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

Lo abarroté todo en una línea (malo, lo sé) y no tuve problemas con eso:

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

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 reference relativamente a imágenes, CSS, javascript, etc.

Swift respuesta 2.

La reference de la class UIWebView aconseja no utilizar webView.loadRequest (request):

No utilice este método para cargar files 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) 

He vuelto, probado y vuelto a probar esto, parece que la única manera de hacerlo funcionar (ya que tengo algunos files en la carpeta img y algunos en js / css, etc …) no es use una ruta relativa a mi image en el html y haga que todo se haga reference a la carpeta del package. Qué lástima :(.

 <img src="myimage.png" /> 

@ la respuesta de sdbrain en Swift 3:

  let url = URL.init(fileURLWithPath: Bundle.main.path(forResource: "index", ofType: "html", inDirectory: "www")!) webView.loadRequest(NSURLRequest.init(url: url) as URLRequest) 

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 a algunos de los mejores cambios de syntax en 3.01 y mantiene la estructura del directory en su lugar para que pueda incrustar files HTML relacionados.