生活随笔
收集整理的這篇文章主要介紹了
JS与OC交互
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
UIWebView攔截URL
原理:
js通過加載url方式被webView攔截,這時候看如果是自己定義的scheme請求就不讓webView繼續加載請求,否則就繼續加載請求。webView看加載的請求的host是哪種host進行分別處理。處理oc代碼。之后調用stringByEvaluatingJavaScriptFromString調用js代碼。 注意:
js調用oc屬于異步方式oc調用js屬于同步方式,且必須在主線程加載,如果js代碼比較耗時那么可能會卡頓主線程 代碼地址
UIWebview利用jsc庫
原理:
html調用方法: function locationClick() { getLocation('A','B','C'); }oc中delegate回調:- (void)webViewDidFinishLoad:(UIWebView *)webView{
JSContext *context = [self valueForKeyPath:@
"documentView.webView.mainFrame.javaScriptContext"];
}
復制代碼通過分析context[@"getLocation"]來判斷方法名。通過NSArray *arrArgs = [JSContext currentArguments];獲取參數 注意:
js執行時候會進入context的回調,該回調block是在子線程中的。如果更細ui要在主線程。 代碼地址
WKWebView攔截URL
原理:
js通過加載url方式被webView攔截,這時候看如果是自己定義的scheme請求就不讓webView繼續加載請求,否則就繼續加載請求。webView看加載的請求的host是哪種host進行分別處理。處理oc代碼。之后調用evaluateJavaScript調用js代碼。 注意:
js調用oc屬于異步方式oc調用js屬于同步方式,且必須在主線程加載,如果js代碼比較耗時那么可能會卡頓主線程WKWebView有個處理js彈窗的代理方法,這個方法必須要實現,如果不實現js的彈窗將會無效。 WKWebView和UIWebView的比較
wk更節省內存wk加載速度剛快wk解決了內存泄露問題wk剛好適配了ios8+ 代碼地址
WKWebView messageHandle方式
原理: js通過調用方法window.webkit.messageHandlers.getLocation.postMessage({A:'a',B:'b'});其中getLocation為name,{A:'a',B:'b'}相當于參數oc通過 [self.webView.configuration.userContentController addScriptMessageHandler:self name:obj];相當于注冊監聽oc會進入回調userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message。通過分析message.name來判斷是js調用的那個方法,通過分析message.body來獲取參數。代碼地址
可以利用三方框架實現交互
WebViewJavascriptBridge支持UIWebView,WKWebView利用這個框架可以實現oc與js互調可以利用前端框架
RN可以實現Cordova可以實現webView實現全包裹
ios要想做到內容全包裹,必須借助js,不像android...js獲取內容高度方法為:CGFloat height = [[webView stringByEvaluatingJavaScriptFromString:@
"document.body.scrollHeight"]
floatValue];
復制代碼
轉載于:https://juejin.im/post/5cf8b41ce51d45775b419b9a
總結
以上是生活随笔為你收集整理的JS与OC交互的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。