2012-03-27 13 views
9

Quiero integrar un marco HTML completo (es decir, HTML/CSS/JavaScript) dentro de una aplicación de iOS y hacer que UIWebView se encargue de ejecutar el contenido HTML para poder comunicarse con el resto del código fuente original de Objective-C.¿Cómo enviar eventos desde el HTML que se ejecuta dentro de un UIWebView al código nativo Objective-C?

Dirección 1: de Objective-C a HTML dentro de un UIWebView

La manera de hacer que el resto de la fuente de enviar mensajes al contenido HTML es bastante sencillo: sólo puedo llamar stringByEvaluatingJavaScriptFromString: en el Objetivo- C e implementar métodos de JavaScript de la manera correcta.

Dirección 2: de HTML dentro de un UIWebView a Objective-C

Esta es la forma en que realmente no puedo entender. Mi única idea hasta ahora es convertir mi aplicación en un servidor web local y hacer que el HTML le solicite algo. Pero no tengo idea de cómo hacerlo, aunque supongo que puede ser difícil, ya que creo que aplicaciones como Things, VLC o 1Password podrían usar este tipo de características.

Cualquier idea para hacer esto dirección 2 trabajo o cualquier nueva perspectiva para hacer que los eventos dentro del contenido HTML sean enviados al código Objective-C es bienvenido.

Respuesta

19

he hecho esto usando jQuery y UIWebViewDelegate:

Javascript (jQuery móvil):

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

Por lo tanto, la URL resultante se parece a: donordialog:bloodTypeChanged(typeAB-)

En mi 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; 
} 

Este código fue copiado textualmente de un proyecto que estoy trabajando actualmente, y puedo comprobar que esto funciona.

+0

El código no es seguro si el argumento contiene otro "(" o ")" o "bloodTypeChanged" debido a la sustitución de cadena global. Funciona solo para mensajes simples. – sompylasar

3

La forma en que suele hablar de vuelta de JavaScript está abriendo una URL de ficción (por window.location), y luego implementar UIWebViewDelegate 's -webView:shouldStartLoadWithRequest:navigationType: ignorar la navegación y manejar lo que hay que hacer en su lugar.

(En Mac OS X WebKit, usted puede proporcionar objetos Objective-C que tienen funciones de JavaScript en el sitio web, pero esto no está disponible en iOS.)

+0

Y a continuación, obtener datos o mensajes de la NSURLRequest? Interesante. –

+0

¿Cuál es un ejemplo de una solicitud de Ajax que causaría un salto a shouldStartLoadWithRequest? – Gruntcakes

+0

@ Mr.Peckington: por ejemplo, cargando 'foobar: // xyz'. No estoy seguro de si el esquema de URL 'foobar:' necesita ser registrado por su Info.plist para que la solicitud no falle inmediatamente. – Jesper

5

Acabo de crear una biblioteca que haga esto por usted. Admite la comunicación bidireccional entre su aplicación web y iOS a través de JSON, confiando en gran medida en este método. Compruébelo usted mismo: https://github.com/tcoulter/jockeyjs

-5

PhoneGap fue construido exactamente para este

+1

Esta no es una respuesta constructiva. Me recuerda los tiempos en que SO no existía y las respuestas del foro técnico eran 99% de "búsqueda en google". –

+1

Si dice que PhoneGap debería resolver el problema, creo que sería agradable mostrar un ejemplo. –

Cuestiones relacionadas