以前一直是通过拦截Url的方式来进行OC与JS的交互,也一直知道苹果在iOS7的时候出了一个JavaScriptCore框架,但一直没有使用。今天打算学习一下,并记录供以后翻阅。
1.要引入头文件
#import <JavaScriptCore/JavaScriptCore.h>
2.自定义协议JSDelegate,必须要遵守JSExport这个协议
@protocol JSDelegate <JSExport>
- (void)result:(NSString *)msg;
@end
3.在UIWebview的回调方法- (void)webViewDidFinishLoad:(UIWebView *)webView 中获取JSContext上下文,然后再注入桥梁对象名为Custom,承载的对象为self即为此控制器,控制器遵守此自定义协议实现协议中对应的方法
#pragma mark - UIWebViewDelegate
- (void)webViewDidFinishLoad:(UIWebView *)webView {
NSLog(@"webViewDidFinishLoad");
self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
self.jsContext[@"Custom"] = self;
[self.jsContext setExceptionHandler:^(JSContext *context, JSValue *value) {
context.exception = value;
NSLog(@"异常信息: %@", value);
}];
}
#pragma mark - JSDelegate
- (void)result:(NSString *)msg {
NSLog(@"%@", msg);
JSValue *callback = self.jsContext[@"callback"];
[callback callWithArguments:nil];
}
这样基本上OC就可以跟JS来交互了,注意自定义协议的方法名称要与web前端定义的一致,因为在web前端是通过桥梁对象名Custom.result(msg)来调用的,OC向JS传值是通过JSValue的callWithArguments方法来进行的,具体请查看完整Demo。