2009-12-18 9 views
19

¡Saludos! ¿Puede alguien por favor amablemente me ayude a encontrar una forma de evitar lo siguiente:iPhone Dev: UIWebView baseUrl a recursos en la carpeta Documentos no paquete de aplicaciones

  • carga un archivo HTML en un UIWebView usando loadHTMLString e incluyen (usando baseurl) los recursos tales como el CSS, archivos de imágenes de carpetas dentro del directorio de documentos del usuario - y no desde MainBundle de la aplicación.

He visto tutoriales sobre cómo usar baseURL para cargar dentro del paquete de aplicaciones/MainBundle que es sencillo pero no con recursos de los directorios de Documentos del iPhone.

La estructura de la carpeta Mis documentos es el siguiente:

dirX 
|---> file.xml 
|---> dirCSS 
     |---> style.css 

puedo recuperar la ruta completa al directorio X (Usuarios /......./ dir X). Sin embargo, al pasar ese camino a URLbase del UIWebView tal que

[webView loadHTMLString:fileXMLString baseURL:pathToDirX] 

... web View no reconoce los recursos (por ejemplo, dentro de style.css dirCSS) como href'ed dentro del fileXMLString

<link href="dirCSS/style.css" rel="stylesheet" /> 

Por lo tanto, actualmente mi aplicación puede cargar correctamente la cadena html pero no carga la hoja de estilo, ya que el enlace al CSS dentro de la cadena html es relativo - por ejemplo. css/style.css

Cualquier ayuda es muy apreciada :)

Respuesta

25

Después de buscar en Google finalmente encontré una solución adecuada para la pregunta que planteé. Esperemos que esto ayude a aquellos que enfrentan el mismo problema.

El truco está en el formateo de la ruta de cadena al crear un objeto NSURL para baseURL de una UIWebView. Aunque usualmente utilizo el típico "Users /...../ dir/file" en la mayoría de los casos, cargar usando loadHTMLString: baseURL de UIWebView necesita un enfoque diferente.

Como se describe en http://dblog.com.au/iphone-development/loading-local-files-into-uiwebview/, donde me dieron la solución, string path a los recursos sólo necesita tener barras que ser sustituido por dobles barras y espacios por% 20:

NSString *imagePath = [[NSBundle mainBundle] resourcePath]; 
imagePath = [imagePath stringByReplacingOccurrencesOfString:@"/" withString:@"//"]; 
imagePath = [imagePath stringByReplacingOccurrencesOfString:@" " withString:@"%20"]; 

NSString *HTMLData = @" 
<h1>Hello this is a test</h1> 
<img src="sample.jpg" alt="" width="100" height="100" />"; 
[webView loadHTMLString:HTMLData baseURL: 
      [NSURL URLWithString: 
      [NSString stringWithFormat:@"file:/%@//",imagePath] 
      ]]; 

Do tomar nota de la sustitución de las cadenas y también el:

[NSString stringWithFormat:@"file:/%@//",imagePath] 

Aunque el código ejemplo anterior es la recuperación de la ruta a la mainBundle de la aplicación, también puede trabajar en otras carpetas, es decir, documentos (y sus subcarpetas) como lo hice en mía.

Saludos cordiales, oonoo

PS Gracias de nuevo Nic por la respuesta :)

+1

Puede agregar escapes de porcentaje usando stringByAddingPercentEscapesUsingEncoding: método de NSString. – ddnv

+0

Esta publicación me ayudó mucho. ¡Gracias por esto! ;-) – andi1984

+0

Esto se carga desde el paquete de la aplicación, no desde el directorio de Documentos. La página a la que vinculó también habla de cargar desde el paquete. –

12

para obtener la ruta al directorio documento:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask ,YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"index.xml"]; 
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:path]]] 

La forma más fácil de tener todo funcionando, es cargar simplemente su index.html del directorio del documento en lugar de cargar una cadena. De lo contrario, establezca la baseUrl en el directorio del documento.

+0

Gracias Nicolas de pronta respuesta! Ya traté de usar esa ruta del directorio de documentos, pero el URL base de UIWebView no parece estar bien y no carga las CSS/imágenes del directorio de documentos. En realidad tengo dos cosas – oonoo

+0

Sí, de hecho, no tengo problemas para cargar el html directamente con loadRequest porque coloca las imágenes fácilmente y tiene un buen sentido pero tiene problemas con su velocidad. Dado que estoy cargando desde la carpeta de documentos de iPhone, loadHTMLString parece ideal y, en realidad, cargué la cadena html fácilmente, excepto que ... sí, no puedo cargar el css y las imágenes. – oonoo

+0

He editado mi respuesta, intente con loadRequest. –

1
// call this method and set the directory , Currently it is cache directory . If you want document directory then change NSCacheDirectory to NSDocumentDirectory 

-(NSString*)getBasePath 
{ 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, 
                NSUserDomainMask, YES); 
NSMutableString *cacheDirectory = [NSMutableString stringWithString:[paths objectAtIndex:0]]; 

[cacheDirectory appendString:@"/"]; 
NSRange renge= NSMakeRange(0, cacheDirectory.length); 
[cacheDirectory replaceOccurrencesOfString:@"/" withString:@"//" options:NSCaseInsensitiveSearch range:renge]; 
renge= NSMakeRange(0, cacheDirectory.length); 
[cacheDirectory replaceOccurrencesOfString:@" " withString:@"%20" options:NSCaseInsensitiveSearch range:renge]; 
[cacheDirectory insertString:@"file://" atIndex:0]; 
//file:////Users//hb//Library//Application%20Support//iPhone%20Simulator//6.0//Applications//3A141D33-390A-4DD2-8825-7DDC07D29894//Library//Caches// 
return cacheDirectory; 

}

Cuestiones relacionadas