¿Es posible utilizar stringByEvaluatingJavaScriptFromString con Javascript que hace referencia a los archivos locales?
-
19-09-2019 - |
Pregunta
Quiero usar stringByEvaluatingJavaScriptFromString para ejecutar un JavaScript que hace referencia a los archivos locales (en este caso los archivos CSS, pero los archivos potencialmente js también) que están en el dispositivo (en la carpeta Documentos supongo?) ...
NSString *theJS = [[NSString alloc]
initWithString:@"javascript:(function()
{the_css.rel='stylesheet';
the_css.href='the_css.css';
the_css.type='text/css';
the_css.media='screen';}
)();"];
[webView stringByEvaluatingJavaScriptFromString:theJS];
¿Cómo puedo conseguir que esto funcione? Funciona bien si uso un archivo CSS externo, como
the_css.href='http://www.website.com/the_css.css';
Solución
Lo que he hecho en el pasado se utiliza este código al cargar el código HTML
NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:bundlePath];
[webView loadData:data MIMEType:@"text/html" textEncodingName:@"utf-8 " baseURL:baseURL];
Esto pasará la ubicación haz que la URL base que debería hacer que los URL relativos a trabajar correctamente. Por supuesto que no tiene que utilizar este método loadData
exacta, hay varias sobrecargas. Acaba de obtener el baseUrl
allí y usted debe ser bueno para ir.
Si todo lo demás falla, puede usar algo como:
NSString *path = [[NSBundle mainBundle] pathForResource:@"file.css" ofType:nil]]
e inyectar eso en la página con algunos reemplazos de cadenas o lo que sea. Poco hacky sin embargo.
Otros consejos
Debe hacerlo de esta manera.
NSString *cssPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"the_css.css"];
NSURL *baseURL = [NSURL fileURLWithPath:cssPath];
NSString *theJS = [[NSString alloc]
initWithFormat:@"javascript:(function()
{the_css.rel='stylesheet';
the_css.href='%@';
the_css.type='text/css';
the_css.media='screen';}
)();",baseURL];
[cssPath release];
[webView stringByEvaluatingJavaScriptFromString:theJS];
Espero que esto va a resolver el problema.