我有一个使用 WebView 来显示 HTML 界面的 Cocoa 应用程序。我将如何从 HTML 界面中的 Javascript 函数调用 Objective-C 方法?
4 回答
这记录在developer.apple.com上。
Apple 的文档比较环保,对我来说非常不可用,所以我做了一个概念证明,即在 Cocoa 中从 javascript 调用 Objective C 方法,反之亦然,尽管后者更容易。
首先确保你有你的 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 调用映射到 webScriptNameForSelector 中的 ObjC 方法。
完整的项目概念证明文件: https ://github.com/bytestudios/JS-function-and-ObjC-method-connector
如果您想在 iPhone 应用程序中执行此操作,则需要使用 UIWebViewDelegate 方法 shouldStartLoadWithRequest 做一个技巧:
这个 api http://code.google.com/p/jsbridge-to-cocoa/为你做。它非常轻巧。
我有一个使用 NimbleKit 的解决方案。它可以从 Javascript 调用 Objective C 函数。