Pregunta

Tengo un Cacao de la aplicación que utiliza un WebView para mostrar una interfaz HTML.¿Cómo puedo llamar a un Objetivo-C método a partir de una función de Javascript dentro de la interfaz HTML?

¿Fue útil?

Solución

Esto está documentado en developer.apple.com.

Otros consejos

Si quieres hacerlo en iPhone apps, usted tendría que hacer un truco con el UIWebViewDelegate método shouldStartLoadWithRequest:

Esta api http://code.google.com/p/jsbridge-to-cocoa/ lo hace por usted.Es muy ligero.

Es más bien verde, la documentación de Apple es bastante inútil para mí, así que he hecho una prueba de concepto de llamadas de Objective C métodos de javascript y viceversa en el Cacao, a pesar de que éste era mucho más fácil.

Primero asegúrate de tener tu webview como el setFrameLoadDelegate:

[testWinWebView setFrameLoadDelegate:self];

Usted necesita saber el webview para observar un objeto específico tan pronto como se carga:

- (void)webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)windowScriptObject forFrame:(WebFrame *)frame {
    //add the controller to the script environment
    //the "ObjCConnector" object will now be available to JavaScript
    [windowScriptObject setValue:self forKey:@"ObjCConnector"];
}

Entonces el negocio de la comunicación:

// a few methods to log activity
- (void)acceptJavaScriptFunctionOne:(NSString*) logText {
    NSLog(@"acceptJavaScriptFunctionOne: %@",logText);
}
- (void)acceptJavaScriptFunctionTwo:(NSString*) logText {
    NSLog(@"acceptJavaScriptFunctionTwo: %@",logText);
}

//this returns a nice name for the method in the JavaScript environment
+(NSString*)webScriptNameForSelector:(SEL)sel {
    NSLog(@"%@ received %@ with sel='%@'", self, NSStringFromSelector(_cmd), NSStringFromSelector(sel));
    if(sel == @selector(acceptJavaScriptFunctionOne:))
        return @"functionOne"; // this is what you're sending in from JS to map to above line
    if(sel == @selector(acceptJavaScriptFunctionTwo:))
        return @"functionTwo"; // this is what you're sending in from JS to map to above line
    return nil;
}

//this allows JavaScript to call the -logJavaScriptString: method
+ (BOOL)isSelectorExcludedFromWebScript:(SEL)sel {
    NSLog(@"isSelectorExcludedFromWebScript: %@", NSStringFromSelector(sel));
    if(sel == @selector(acceptJavaScriptFunctionOne:) ||
       sel == @selector(acceptJavaScriptFunctionTwo:))
        return NO;
    return YES;
}

La clave es que si tienes varios métodos quieras llamar, debes tener todos los excluidos en la isSelectorExcludedFromWebScript método, y lo que necesita la llamada de javascript para asignar a los ObjC método en webScriptNameForSelector.

Completo de los proyectos de prueba de concepto de archivo:https://github.com/bytestudios/JS-function-and-ObjC-method-connector

Yo tengo una solución utilizando NimbleKit.Puede llamar al Objetivo C funciones de Javascript.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top