以前一直是通過攔截Url的方式來進(jìn)行OC與JS的交互,也一直知道蘋果在iOS7的時(shí)候出了一個(gè)JavaScriptCore框架,但一直沒有使用。今天打算學(xué)習(xí)一下,并記錄供以后翻閱。
1.要引入頭文件
#import <JavaScriptCore/JavaScriptCore.h>
2.自定義協(xié)議JSDelegate,必須要遵守JSExport這個(gè)協(xié)議
@protocol JSDelegate <JSExport>
- (void)result:(NSString *)msg;
@end
3.在UIWebview的回調(diào)方法- (void)webViewDidFinishLoad:(UIWebView *)webView 中獲取JSContext上下文,然后再注入橋梁對(duì)象名為Custom,承載的對(duì)象為self即為此控制器,控制器遵守此自定義協(xié)議實(shí)現(xiàn)協(xié)議中對(duì)應(yīng)的方法
#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來交互了,注意自定義協(xié)議的方法名稱要與web前端定義的一致,因?yàn)樵趙eb前端是通過橋梁對(duì)象名Custom.result(msg)來調(diào)用的,OC向JS傳值是通過JSValue的callWithArguments方法來進(jìn)行的,具體請(qǐng)查看完整Demo。