Будучи довольно зеленой, документация Apple довольно непригодна для меня, поэтому я сделал доказательство концепции вызова методов Objective C из javascript и наоборот в Какао, хотя последний был намного проще.
Сначала убедитесь, что у вас есть веб-просмотр в качестве setFrameLoadDelegate:
[testWinWebView setFrameLoadDelegate:self];
Вы должны указать веб-представлению, чтобы оно отслеживало определенный объект сразу после его загрузки:
- (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