Tengo una aplicación Cocoa que usa un WebView para mostrar una interfaz HTML. ¿Cómo voy a llamar a un método Objective-C desde una función de Javascript dentro de la interfaz HTML?Cómo llamar a un método Objective-C desde Javascript en una aplicación Cocoa/WebKit?
Respuesta
Esto se documenta en developer.apple.com.
Tengo una solución usando NimbleKit. Puede invocar funciones de Objective C desde Javascript.
qué tan bueno es para usted, ¿qué le parece compartirlo? – Jonathan
Si lo que quieres hacer en aplicaciones para el iPhone, lo que tendría que hacer un truco con el método shouldStartLoadWithRequest UIWebViewDelegate:
Esta API http://code.google.com/p/jsbridge-to-cocoa/ lo hace por usted. Es muy liviano.
Siendo bastante verde, la documentación de Apple es bastante inutilizable para mí, así que hice una prueba de concepto de llamar a los métodos de Objective C desde JavaScript y viceversa en Cocoa, aunque este último era mucho más fácil.
En primer lugar asegúrese de que tiene su vista web como el setFrameLoadDelegate:
[testWinWebView setFrameLoadDelegate:self];
Usted necesita decirle a la vista web 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 tiene múltiples métodos le gustaría llamar, debe tenerlos todos excluidos en el método isSelectorExcludedFromWebScript, y necesita la llamada javascript para mapear el método ObjC en webScriptNameForSelector.
prueba de proyecto lleno de archivo concepto: https://github.com/bytestudios/JS-function-and-ObjC-method-connector
Gracias por la información útil. ¡Esta respuesta realmente me ayuda mucho! – Tommy
- 1. Cómo llamar a un método de controlador desde Javascript
- 2. enviar una notificación desde javascript en UIWebView a ObjectiveC
- 3. Cómo llamar a un método en un objeto de javascript
- 4. Llamar a un método en un modelo desde una plantilla
- 5. Llamar a una aplicación desde otra aplicación
- 6. Cómo llamar a una aplicación Android desde otra aplicación Android
- 7. Llamar a un método de fragmento desde una actividad primaria
- 8. Llamar a href desde JavaScript
- 9. ¿Cómo llamar a Objective-C desde Javascript?
- 10. Llamar a los métodos DLL desde Javascript
- 11. Llamar a un método miembro no estático desde otro método
- 12. Cómo llamar a un método principal desde la clase secundaria en javascript?
- 13. ¿Cómo llamar a JavaScript desde Android?
- 14. Cómo llamar asincrónicamente un servicio web desde una aplicación ASP.NET?
- 15. ¿Cómo llamar a una función de JavaScript desde PHP?
- 16. Llamar a un método ApplicationController desde la consola en Rails
- 17. cómo llamar a un método ASP.NET C# usando javascript
- 18. Cómo prohibir llamar a un método C#
- 19. Cómo llamar un puntero al método desde otro método
- 20. Llamar a JavaScript directamente desde TypeScript
- 21. ¿Cómo llamar a un método en Java?
- 22. Cómo llamar a código detrás método de servidor desde un lado del cliente JavaScript función?
- 23. Llamar a un método en un UIViewController desde un UIButton en una subvista
- 24. Llamar a un método desde el constructor en Coffeescript
- 25. WebKit.NET para llamar a una función de C# desde JavaScript
- 26. ¿Cómo puedo llamar a un método no estático desde un método estático en C#?
- 27. ¿Cómo puedo llamar a un método GWT RPC en un servidor desde una aplicación no GWT (pero Java)?
- 28. En javascript, ¿cómo puedo llamar a un método de clase desde otro método en la misma clase?
- 29. Llamar a un método NSTimer
- 30. Llamar a un Método Java desde Visual Basic 6
Gracias, de alguna manera se perdió en mi Google que busca :) – georgebrock
Para cualquier persona que busca ayuda para iOS, tenga en cuenta que la respuesta anterior es sólo para Mac. – zekel
Tenga en cuenta que el enlace ha cambiado, por lo que esta respuesta de solo enlace ya no es útil. –