本文主要轉自:https://www.jianshu.com/p/cdaf9bc3d65djavascript
http://blog.csdn.net/u011993697/article/details/51577295html
oc與JS的交互實現方式有不少,在ios7以前用的比較多的是WebViewJavaScriptBridge,在ios7以後蘋果將JavaScriptCore框架開放,這樣就增長一種選擇。前端
一、準備工做java
首先要導入JavaScriptCore的頭文件ios
#import <JavaScriptCore/JavaScriptCore.h>
二、用webview加載HTML文件,這裏用的是本地htmlgit
- (void)viewDidLoad { [super viewDidLoad]; NSString *path = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"JSCallOC.html"]; NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL fileURLWithPath:path]]; [self.webView loadRequest:request]; }
三、在進行JS交互以前,須要經過JSContent建立一個使用JS的環境github
- (void)webViewDidFinishLoad:(UIWebView *)webView { // Undocumented access to UIWebView's JSContext self.context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; // 打印異常 self.context.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) { context.exception = exceptionValue; NSLog(@"%@", exceptionValue); }; }
四、JS調用OC代碼web
4.一、經過block調用框架
<input type="button" value="測試log" onclick="log('測試');" />
self.context[@"log"] = ^(NSString *str) { NSLog(@"%@", str); };
4.二、實現JSExport協議函數
定義須要暴露給JS的內容
<input type="button" value="計算階乘" onclick="native.calculateForJS(input.value);" />
@protocol TestJSExport <JSExport> JSExportAs (calculateForJS , - (void)handleFactorialCalculateWithNumber:(NSNumber *)number ); @end
// 以 JSExport 協議關聯 native 的方法 self.content[@"native"] = self;
五、OC調用JS代碼
在OC中,全部表示JS中對象,都用JSValue來建立,經過objectForKeyedSubscript方法或者直接使用下標的方法獲取JS對象,而後使用callWithArguments方法來執行函數。
// 方法一. JSValue *function = [self.context objectForKeyedSubscript:@"factorial"]; // 方法二. JSValue * function = self.context[@"factorial"]; JSValue *result = [function callWithArguments:@[inputNumber]]; self.showLable.text = [NSString stringWithFormat:@"%@", [result toNumber]];
一個demon鏈接:https://github.com/shaojiankui/JavaScriptCore-Demo
六、封裝
將javascriptcore進行封裝,更方便ios 和 前端進行數據的交互和方法的調用,使用方式和webviewjavascriptbridge同樣,先在plist文件配置,對外暴露的oc接口須要實現指定的協議。
demo:https://github.com/HZQuan/WebViewJavaScriptCoreBridge