2008-09-18 12 views

Respuesta

12

Esto se documenta en developer.apple.com.

+0

Gracias, de alguna manera se perdió en mi Google que busca :) – georgebrock

+2

Para cualquier persona que busca ayuda para iOS, tenga en cuenta que la respuesta anterior es sólo para Mac. – zekel

+1

Tenga en cuenta que el enlace ha cambiado, por lo que esta respuesta de solo enlace ya no es útil. –

1

Tengo una solución usando NimbleKit. Puede invocar funciones de Objective C desde Javascript.

+4

qué tan bueno es para usted, ¿qué le parece compartirlo? – Jonathan

3

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.

3

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

+0

Gracias por la información útil. ¡Esta respuesta realmente me ayuda mucho! – Tommy

Cuestiones relacionadas