У меня есть приложение Какао, которое использует WebView для отображения интерфейса HTML. Как мне вызвать метод Objective-C из функции Javascript в интерфейсе HTML?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это задокументировано в developer.apple.com.
Тем, кто ищет справку по iOS, обратите внимание, что приведенный выше ответ предназначен только для Mac.
Обратите внимание, что ссылка изменилась, поэтому этот ответ, содержащий только ссылку, больше бесполезен.
Ссылка указывает на «Использование JavaScript из Objective-C», вопрос не в этом. На этой странице показано, как вызывать методы obj-C из JavaScript: developer.apple.com/library/mac/#documentation/…
хороший пример, включающий большинство сценариев использования: CallJS - developer.apple.com/library/mac/samplecode/CallJS/Introducti on /…
У меня есть решение, использующее NimbleKit. Он может вызывать функции Objective C из Javascript.
как очень приятно для вас, как насчет того, чтобы поделиться этим?
Если вы хотите сделать это в приложениях для iPhone, вам нужно будет проделать трюк с методом UIWebViewDelegate shouldStartLoadWithRequest:
Этот API http://code.google.com/p/jsbridge-to-cocoa/ сделает это за вас. Он очень легкий.
Документация 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
Спасибо за полезную информацию. Этот ответ мне очень помогает !!
Спасибо, как-то пропустил это в поисках Google :)