ios - app - Cargue recursos de la ruta relativa utilizando html local en uiwebview
wkwebview (8)
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 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.
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)
}
Esta es la forma de cargar / usar un html local con referencias relativas.
- Arrastre el recurso a su proyecto xcode (he arrastrado una carpeta llamada www desde la ventana de mi buscador), obtendrá dos opciones "crear grupos para cualquier carpeta agregada" y "crear referencias de carpetas para cualquier carpeta agregada".
- Seleccione la opción "crear carpetas de referencias ..".
Use el siguiente código dado. Debería funcionar como un encanto.
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"www"]];
[webview loadRequest:[NSURLRequest requestWithURL:url]];
Ahora todos sus 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)) )
}
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" />
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)
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)