2012-03-27 12 views
9

Desidero integrare un framework HTML completo (ad esempio HTML/CSS/JavaScript) all'interno di un'app iOS e rendere UIWebView responsabile dell'esecuzione del contenuto HTML in grado di comunicare con il resto del codice sorgente nativo Objective-C.Come inviare eventi da HTML in esecuzione all'interno di un UIWebView al codice Objective-C nativo?

Direzione 1: da Objective-C in HTML all'interno di un UIWebView

Il modo per rendere il resto della sorgente di inviare messaggi al contenuto HTML è piuttosto semplice: posso solo chiamare stringByEvaluatingJavaScriptFromString: sul Objective- Lato C e implementa i metodi JavaScript nel modo giusto.

Direzione 2: da HTML all'interno di un UIWebView per Objective-C

questo è il modo non riesco davvero a capire. La mia unica idea è quella di rendere la mia app un server web locale e fare in modo che le richieste HTML vengano caricate su di essa. Ma non ho idea di come farlo, anche se suppongo che possa essere schifo perché credo che app come Things, VLC o 1Password possano utilizzare questo tipo di funzionalità.

Qualsiasi idea per rendere questo direzione 2 lavoro o qualsiasi nuova prospettiva per rendere gli eventi all'interno del contenuto HTML inviato al codice Objective-C è il benvenuto.

risposta

19

Ho fatto questo utilizzando jQuery e UIWebViewDelegate:

JavaScript (jQuery mobile):

$("#bloodType").change(function() { 
    url = $("#bloodType option:selected").text(); 
    url = "donordialog:bloodTypeChanged(" + url + ")"; 
    window.location = url; 
}); 

Così, l'URL risultante assomiglia: donordialog:bloodTypeChanged(typeAB-)

Nel mio objc co de:

-(BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    NSURL *URL = [request URL]; 
    if ([[URL scheme] isEqualToString:@"donordialog"]) 
    { 
     // now we need to figure out the function part 
     NSString *functionString = [URL resourceSpecifier]; 

     if ([functionString hasPrefix:@"bloodTypeChanged"]) 
     { 
      // the blood type has changed, now do something about it. 
      NSString *parameter = [functionString stringByReplacingOccurrencesOfString:@"bloodTypeChanged" withString:@""]; 

      // remove the '(' and then the ')' 
      parameter = [parameter stringByReplacingOccurrencesOfString:@"(" withString:@""]; 
      parameter = [parameter stringByReplacingOccurrencesOfString:@")" withString:@""]; 

      // log the paramter, as I don't know what to do with it right now 
      NSLog(@"%@", parameter); 
     } 

     return NO; 
    } 

    return YES; 
} 

Questo codice è stato copiato letteralmente da un progetto al momento sto lavorando e può verificare che funzioni.

+0

Il codice non è sicuro se l'argomento contiene un altro "(" o ")" o "bloodTypeChanged" a causa della sostituzione della stringa globale. Funziona solo per messaggi semplici. – sompylasar

3

Il modo in cui di solito si parla di ritorno da JavaScript è con l'apertura di un URL fittizio (da window.location), e quindi attuare UIWebViewDelegate s' -webView:shouldStartLoadWithRequest:navigationType: di ignorare la navigazione e gestire ciò che deve essere fatto, invece.

(In Mac OS X WebKit, è possibile fornire gli oggetti Objective-C che hanno funzioni JavaScript del sito web, ma questo non è disponibile in iOS.)

+0

E quindi ottenere dati o messaggi dal NSURLRequest? Interessante. –

+0

Che cos'è un esempio di una richiesta Ajax che causerebbe un salto in shouldStartLoadWithRequest? – Gruntcakes

+0

@ Mr.Peckington: ad esempio, caricamento di 'foobar: // xyz'. Non sono sicuro se lo schema URL 'foobar:' debba essere registrato dal tuo Info.plist in modo che la richiesta non fallisca immediatamente. – Jesper

5

Ho appena creato una libreria che farà questo per voi. Supporta la comunicazione bidirezionale tra la tua app Web e iOS attraverso JSON, basandosi molto su questo metodo. Check it out: https://github.com/tcoulter/jockeyjs

-5

PhoneGap è stato costruito proprio per questo

+1

Questa non è una risposta costruttiva. Mi ricorda i tempi in cui SO non c'era e le risposte tecniche del forum erano al 99% "search on google". –

+1

Se dici che PhoneGap dovrebbe risolvere il problema, penso che mostrare un esempio sarebbe bello. –

Problemi correlati