2012-01-31 24 views
22

Portar una aplicación web a PhoneGap en IOS, tenemos activo (y Ajax) direcciones URL que son las rutas absolutas, por ejemplo .:PhoneGap en iOS con rutas URL absolutas para activos?

<img src="/img/logo.png"> 

Tenemos el directorio img envasados ​​bajo el directorio www de PhoneGap. La imagen no se carga con la ruta absoluta, pero sólo con una ruta relativa, por ejemplo .:

<img src="img/logo.png"> 

Podría alguien explicar cómo se está prefijado o traducida en este contexto la URL? Es decir .:

<img src="/www/img/logo.png"> 

tampoco funciona. Entonces, ¿cuál es la base de URL utilizada por PhoneGap en iOS?

También hemos probado, por ejemplo .:

<img src="file://img/logo.png"> 
<img src="file:///img/logo.png"> 

pero no ir.

Nos gustaría evitar cambiar las URL a relativa para el puerto, como las URL de ruta absoluta se utilizan en todo el CSS, el código Ajax, se establecen por piñones con el backend Rails, etc. ¿Cómo podemos obtener PhoneGap/UIWebView en iOS para cargar los activos utilizando las URL de ruta absoluta tal como están escritas?

Veo que esta pregunta se hace mucho en varias formas aquí en StackOverflow, pero aún no he visto una respuesta correcta.

+4

Suponiendo que es una aplicación de una sola página (como generalmente se recomienda para PhoneGap/Cordova), ¿por qué no puedes usar En tu index.html y llamarlo por día? – Trott

Respuesta

3

Al comprobar la ruta absoluta a través de su iPhone/iPad que se vería algo como esto:

<img src="file:///var/mobile/Applications/7D6D107B-D9DC-479B-9E22-4847F0CA0C40/YourApplication.app/www/logo.png" /> 

y será diferente en Android o Windows dispositivos, así que no creo que en realidad es una buena idea activos de referencia utilizando rutas absolutas en este caso.

Como alternativa, se podría considerar el uso de los base64 cadenas en sus archivos CSS:

div#overview 
{ 
    background-image: url('data:image/jpeg;base64, <IMAGE_DATA>'); 
    background-repeat: no-repeat; 
} 
+2

gracias. ¿Hay una API PG para enviar la ruta absoluta actual a la raíz del documento?usamos urls de datos para algunas imágenes, pero no es una solución universal. – tribalvibes

+1

'PhoneGap' tiene una API expuesta para la manipulación de archivos, pero no tuve la oportunidad de utilizarla aún: http://docs.phonegap.com/en/1.0.0/phonegap_file_file.md.html#File – MonkeyCoder

+0

usando El enfoque de @ mattias veo que podríamos obtener el camino absoluto original del DOM e ir desde allí. – tribalvibes

7

hicimos algunas pruebas y tal vez un poco de JavaScript hackery puede que sea un poco más manejable. Esto cambiará todas las etiquetas <a> y <img> con URL que comienza con/en relación con el archivo actual.

poner esto en un archivo e incluirla con una etiqueta <script> o inyectarla con stringByEvaluatingJavaScriptFromString:

document.addEventListener("DOMContentLoaded", function() { 
    var dummy = document.createElement("a"); 
    dummy.setAttribute("href", "."); 
    var baseURL = dummy.href; 
    var absRE = /^\/(.*)$/; 

    var images = document.getElementsByTagName("img"); 
    for (var i = 0; i < images.length; i++) { 
    var img = images[i]; 
    var groups = absRE.exec(img.getAttribute("src")); 
    if (groups == null) { 
     continue; 
    } 

    img.src = baseURL + groups[1]; 
    } 

    var links = document.getElementsByTagName("a"); 
    for (var i = 0; i < links.length; i++) { 
    var link = links[i]; 
    var groups = absRE.exec(link.getAttribute("href")); 
    if (groups == null) { 
     continue; 
    } 

    link.href = baseURL + groups[1]; 
    } 
}); 
+0

hmm, bueno, un buen enfoque, pero no estoy seguro de que el tiempo en eso funcionará, ya que necesita modificar las rutas de todas las otras incluidas en la página principal. tal vez sea mejor piratear a PG para que simplemente elimine el '/' ... que está buscando eso. – tribalvibes

+0

Sí, eso podría ser un problema. Pero tenga en cuenta que PhoneGap en iOS es más o menos simplemente un 'UIWebView' también, por lo que terminará con los mismos problemas. Creo que debes volver a escribir el código HTML de forma dinámica (¿sistema de plantillas?) Y/o también interceptar los clics del enlace de alguna manera ... no sé cómo. Déjame saber de tu progreso. –

+2

En este momento, dado que es solo nuestro propio HTML bien formado, un simple script sed en la línea de compilación hizo el truco, p. sed -e/href = "\ // href ="/ – tribalvibes

14

Uno puede obtener la ruta de la aplicación en JavaScript por:

cordova.file.applicationDirectory 

Desde I' m en Android, dice: "file: /// android_asset /" ... por ejemplo:

var img_path = cordova.file.applicationDirectory + 'www/img/logo.png'; 

Al igual que esto, todos los recursos se encontrarían cuando se construyeran varias plataformas.

+1

Eso no funciona en iOS 8 – Mirko

+1

La capa de Cordova JS es la misma, sin importar la plataforma. Por favor, quejarse en el "Genius Bar" con respecto a sus problemas de iOS, no es exactamente mi culpa. –

+1

Es un error en Cordova, al menos en 3.7 en iOS, como explico en mi respuesta aquí http://stackoverflow.com/questions/27905969/load-assets-from-www-folder-on-ios-8- with-cordova-3-7-file Por cierto, no me quejaba, solo lo decía. – Mirko

Cuestiones relacionadas