2012-01-31 12 views
22

porting una web app per PhoneGap su iOS, abbiamo attività (e ajax) URL che sono percorsi assoluti, ad es .:PhoneGap su iOS con URL di percorso assoluti per le risorse?

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

Abbiamo la directory img confezionato nella directory www di PhoneGap. L'immagine non verrà caricato con il percorso assoluto, ma solo con un percorso relativo, ad es .:

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

Qualcuno potrebbe spiegare come l'URL viene prefisso o tradotta in questo contesto? I.e .:

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

non funziona. Quindi qual è la base di URL utilizzata da PhoneGap su iOS?

Abbiamo anche provato, ad es .:

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

ma non andare.

Vorremmo evitare di cambiare gli URL in relativi per la porta, poiché gli URL di percorso assoluti sono utilizzati in tutto il CSS, il codice Ajax, sono impostati da Sprockets con il back-end Rails, ecc. Come possiamo semplicemente ottenere PhoneGap/UIWebView su iOS per caricare le risorse utilizzando gli URL del percorso assoluto come scritti?

Vedo che questa domanda viene posta molto in varie forme qui su StackOverflow, ma devo ancora vedere una risposta corretta.

+4

Supponendo che si tratti di un'applicazione a pagina singola (come generalmente consigliato per PhoneGap/Cordova), qualsiasi motivo per cui non è possibile utilizzare Nel proprio index.html e chiamarlo un giorno? – Trott

risposta

3

Quando si controlla il percorso assoluto attraverso il vostro iPhone/iPad si vedrebbe qualcosa di simile:

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

e sarà diverso su Android o Windows dispositivi in ​​modo non credo che in realtà è una buona idea le risorse di riferimento utilizzano percorsi assoluti in questo caso.

In alternativa si potrebbe prendere in considerazione utilizzando i base64 stringhe nei file CSS:

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

grazie. c'è un'API PG per sottrarre il percorso assoluto corrente alla radice del documento?usiamo gli URL di dati per alcune immagini ma non è una soluzione universale. – tribalvibes

+1

'PhoneGap' ha un'API esposta per manipolazioni di file, ma non ho ancora avuto la possibilità di usarlo: http://docs.phonegap.com/en/1.0.0/phonegap_file_file.md.html#File – MonkeyCoder

+0

usando L'approccio di @ mattias vedo che potremmo ottenere il percorso assoluto originale dal DOM e andare da lì. – tribalvibes

7

fatto qualche test e forse un po 'di aggiustamenti JavaScript può rendere un po' più gestibile. Questo cambierà tutti i tag <a> e <img> con URL che iniziano con/per essere relativi al file corrente.

mettere questo in un file e includerlo con un tag <script> o iniettare 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, beh un buon approccio ma non sono sicuro che i tempi su quello funzioneranno dal momento che ha bisogno di modificare i percorsi di tutti gli altri include nella pagina principale. forse è meglio hackerare PG per eliminare semplicemente il "/" principale ... esaminandolo. – tribalvibes

+0

Sì, potrebbe essere un problema. Ma ricorda che PhoneGap su iOS è più o meno solo un 'UIWebView', quindi ti ritroverai con gli stessi problemi. Penso che tu debba riscrivere dinamicamente il codice HTML (template system?) E anche intercettare il link in qualche modo ... non ho capito come. Fammi sapere dei tuoi progressi. –

+2

In questa fase poiché è solo il nostro HTML ben formato, un semplice script sed nella pipeline di build ha fatto il trucco, ad es. sed -e/href = "\ // href ="/ – tribalvibes

14

si può ottenere il percorso dell'applicazione in JavaScript da:

cordova.file.applicationDirectory 

Dal momento che ho' su Android, si dice: "file: /// android_asset /" ... per esempio:

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

In questo modo si troverebbero tutte le risorse quando si creano cross-building per varie piattaforme.

+1

Non funziona su iOS 8 – Mirko

+1

Il livello Cordova JS è lo stesso, indipendentemente dalla piattaforma. Si prega di lamentarsi al "Genius Bar" in merito ai problemi relativi a iOS, non esattamente per colpa mia. –

+1

È un bug in Cordova, almeno su 3.7 su iOS, come spiegherò nella mia risposta qui http://stackoverflow.com/questions/27905969/load-assets-from-www-folder-on-ios-8- with-cordova-3-7-file Btw Non mi stavo lamentando, semplicemente affermando. – Mirko

Problemi correlati