2011-04-05 5 views
6

Planeo tener una aplicación de shell iphone con un uiwebview, con la mayor parte de mi aplicación corriendo a través de javascript en el uiwebview.Sugerencias sobre cómo comunicarse desde JS ejecutándose en un UIWebView a la aplicación obj-c de alojamiento.

Ahora sé que es fácil comunicarse desde el entorno de obj-c para el medio ambiente mediante el uso de JavaScript stringByEvaluatingJavaScriptFromString, sin embargo, es que hay un buen método recomendado para que comunican el ambiente javascript para el mundo obj-c?

Gracias

Respuesta

12

siempre uso un enfoque en el que la aplicación "navega" a una URL especial:

window.location = "myapp://somemessage/someargument"; 

Y donde las capturas de la aplicación esta en la siguiente función:

-(BOOL)webView:(UIWebView *)webView 
       shouldStartLoadWithRequest:(NSURLRequest *)request 
       navigationType:(UIWebViewNavigationType)navigationType 
{ 
    NSURL *url = [request URL]; 
    if ([[url scheme] isEqualToString:@"myapp"]) 
    { 
     [self handleJSEvent:url]; 
     return NO; 
    } 
    return YES; 
} 

Por otra parte, en función de lo que necesita, puede usar algún tipo de cola de eventos que obtenga usando JSON.stringify(events), en respuesta a un mensaje enviado a la aplicación utilizando el método descrito anteriormente. Para comunicarse desde la aplicación a js JSON también es muy adecuado.

Si hay una forma estándar o estándar para hacer esto, claramente me lo perdí.

+1

Desde mi Google, creo que ha descrito el 'estándar' común, si lo desea. ¡Estupendo! – Chris

+1

De nada. Aparte de mi instinto me dijo, este enfoque es bastante confiable también. – mvds

+0

Muchas gracias. Es bueno saber que esto también es confiable, eso es importante. – Chris

1

Tal vez por cambiar el url hash?

+0

¿Te refieres a blah.com/something.html#HASH? He notado ese enfoque, ¿eso implica capturar el evento shouldStartLoadWithRequest? – Chris

2

No es un método muy bueno para llamar a javascript dentro de UIWebView:

[webView stringByEvaluatingJavaScriptFromString:@"yourJSFunction('some_data');"]; 

devoluciones de llamadas se hacen mejor como se ha mencionado por MVDS través de la URL:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
2

acabo de crear una biblioteca que facilitará esta comunicación para usted en gran medida utilizando el método descrito por mvds y Ondrej. Incluye comunicación bidireccional, estilo de evento jQuery, con cargas útiles JSON opcionales con múltiples oyentes. Échale un vistazo: https://github.com/tcoulter/jockeyjs

Cuestiones relacionadas