Как вызвать метод Objective-C из Javascript в приложении Cocoa / WebKit? - PullRequest
12 голосов
/ 18 сентября 2008

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

Ответы [ 4 ]

12 голосов
/ 18 сентября 2008

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

3 голосов
/ 26 мая 2015

Будучи довольно зеленой, документация 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

3 голосов
/ 13 сентября 2010

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

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

1 голос
/ 18 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...