2008-09-18 1 views

ответ

12

Это задокументировано в developer.apple.com.

+0

Спасибо, как-то пропустил, что в моем Google ищет :) – georgebrock 2008-09-18 13:25:10

+2

Для всех, кто ищет IOS помощь, обратите внимание, что выше ответ Mac-только. – zekel 2012-03-23 17:46:18

+1

Обратите внимание, что ссылка изменилась, поэтому этот ответ только для ссылок больше не нужен. – 2012-08-10 21:06:24

1

У меня есть решение, использующее NimbleKit. Он может вызывать функции Objective C из Javascript.

3

Если вы хотите сделать это в iPhone приложений, вы должны были бы сделать трюк с помощью метода shouldStartLoadWithRequest UIWebViewDelegate:

Это апи http://code.google.com/p/jsbridge-to-cocoa/ делает это для вас. Это очень легкий вес.

3

Будучи довольно зеленым, документация Apple довольно непригодна для меня, поэтому я сделал доказательство концепции вызова методов Objective C из javascript и наоборот в Cocoa, хотя последнее было намного проще.

Сначала убедитесь, что у вас есть WebView как setFrameLoadDelegate:

[testWinWebView setFrameLoadDelegate:self]; 

Вы должны сказать WebView, чтобы наблюдать за определенным объектом, как только он будет загружен:

- (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"]; 
} 

Тогда бизнес сообщения:

// 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; 
} 

Ключ в том, что если у вас есть несколько методов вы должны позвонить, вам нужно, чтобы все они были исключены в методе isSelectorExcludedFromWebScript, и вам нужен вызов javascript для отображения метода ObjC в webScriptNameForSelector.

Полный проект доказательство концепции файла: https://github.com/bytestudios/JS-function-and-ObjC-method-connector

Смежные вопросы