2009-08-04 12 views
10

Sto lavorando a un'applicazione nativa per iPhone. Sono in grado di caricare un locale index.html file di in un UIWebView:Invia parametri a un file locale in una UIWebView

[webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"]isDirectory:NO]]]; 

Il web carichi bene. Ora, vorrei caricare il web con alcuni parametri, allo stesso modo uno tipi nel browser: URL var1 = myValue & var2 = myValue2

Così posso ottenere quei valori all'interno del javascript del HTML? file. C'è un modo per inviare parametri ad un file html locale?

Grazie!

risposta

2

No, sfortunatamente no.

È possibile, tuttavia, ottenere intorno a questo impostando le variabili e chiamando funzioni/metodi in JavaScript utilizzando il UIWebView:stringByEvaluatingJavaScriptFromString:

+0

Ho una funzione javascript definita nel file HTML locale. Posso caricare quel file, ma, come potrei chiamare una funzione javascript all'interno di quel file? Ho bisogno di un esempio – Hectoret

+0

[webView stringByEvaluatingJavaScriptFromString: [NSString stringWithFormat: @ "myJavascriptFunction (% f);", 1.0f]]; – rpetrich

+0

Hai capito? Chiamata la funzione myJavascriptFunction? Nel mio codice non ... come posso verificare con certezza se la chiamata è in corso? – Hectoret

4

si sta caricando il codice HTML dal proprio pacchetto che implica si ha il pieno controllo su di esso. Perché non limitarti a parametrizzare l'HTML con i campi che desideri. Potresti aggiungere facilmente alcuni campi di input nascosti a cui il tuo javascript potrebbe accedere. Dire il codice HTML si presentava così:

<body> 
<form> 
Static Field 1: <input type="text" name="field1"><br> 
Static Field 2: <input type="text" name="field2"><br> 
%@ 
</form> 
</body> 

Ora basta leggere questi dati in una stringa e formattare il% @ con alcuni campi nascosti come questo:

NSString *input = @"<input type=\"hidden\" name=\"field3\"><br>"; 
NSString *formatted = [NSString stringWithFormat:html, input]; 

quindi chiamare -loadHTMLString: in WebView.

[webView loadHTMLString:formatted baseURL:nil]; 

C'è qualche ragione per cui non potresti farlo in quel modo. Ora il vostro javascript può afferrare il valore del campo di input nascosto con una chiamata a:

document.getElementsByName('field3')[0].value; 
3

È possibile inserire nel tuo html-file locale un javascript per analizzare il GET-richiesta

<script language="javascript"> 
function getget(name) { 
     var q = document.location.search; 
     var i = q.indexOf(name + '='); 

     if (i == -1) { 
      return false; 
     } 

     var r = q.substr(i + name.length + 1, q.length - i - name.length - 1); 

     i = r.indexOf('&'); 

     if (i != -1) { 
      r = r.substr(0, i); 
     } 

     return r.replace(/\+/g, ' '); 
    } 
</script> 

Usa getget ('parameter_name') per ottenere il parametro dalla stringa di richiesta.

0

Quindi chiamare -loadHTMLString: nella visualizzazione Web.

Credo che stava evitando utilizzando loadHTMLString invece di loadRequest perché rompe pulsanti avanti e indietro della UIWebView

24

La migliore risposta e davvero lavorare, solo in objc (ricordarsi di mantenere la struttura delle cartelle - copiare i file in Xcode utilizzando "Crea Riferimenti cartella per tutte le cartelle aggiunte") modo

NSString *path = [[NSBundle mainBundle] 
     pathForResource:@"YOUR-HTML-FILE" 
     ofType:@"html" 
     inDirectory:@"YOUR-FOLDER" ]; 
NSURL *url = [NSURL fileURLWithPath:path]; 



NSString *theAbsoluteURLString = [url absoluteString]; 

NSString *queryString = @"?var=1232123232"; 

NSString *absoluteURLwithQueryString = [theAbsoluteURLString stringByAppendingString: queryString]; 

NSURL *finalURL = [NSURL URLWithString: absoluteURLwithQueryString]; 

NSURLRequest *request = [NSURLRequest requestWithURL:finalURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:(NSTimeInterval)10.0 ]; 

[web loadRequest:request]; 
+0

Cosa c'è di sbagliato in Swift? Ho provato e funziona. – NikeAlive

+0

Questo anser mi aiuta molto – inix

7

di Marjan è il modo corretto di farlo funzionare.

Come ha fatto notare il mio amico Terence, il trucco è usare la stringa assoluta file uri (file: //) quando si crea correttamente l'url da stringa. Per di qua ? il carattere non viene codificato e webview può caricare correttamente il file.

[NSURL URLWithString: @"file://localhost/Users/sj/Library/Application%20Support/iPhone%20Simulator/5.0/Applications/../PrintingWebView.app/final.html?slide=2"]; 

Oppure utilizzare URLWithString: metodo relativeToURL

NSURL *relativeURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]; 
NSURL *u = [NSURL URLWithString:@"html/index.html?site=2" relativeToURL:relativeURL]; 
+1

Più semplice soluzione! – inix