OC與JS間相互調(diào)用有兩種方式#####
第一種:使用JavaScriptCore,iOS7之后系統(tǒng)的原生方法系草,能夠?qū)崿F(xiàn)一些比較復雜的參數(shù)互傳及參數(shù)返回。使用也比較簡單,有以下幾篇文章有比較詳細的介紹栖榨。基本看完就能夠熟練的使用了明刷。
iOS js oc相互調(diào)用(JavaScriptCore)
Objective-C與JavaScript交互的那些事
關(guān)于iOS7里的JavaScriptCore framework
第二種就是使用攔截跳轉(zhuǎn)的方式婴栽。根據(jù)以下webview的代理函數(shù)可以攔截到跳轉(zhuǎn)鏈接,然后根據(jù)鏈接來解析使用一些本地的方法辈末。返回NO不跳轉(zhuǎn)即可愚争。但是一些互相之間的傳參就比較麻煩了。github上一個項目WebViewJavascriptBridge可以根據(jù)攔截跳轉(zhuǎn)來實現(xiàn)OC與JS之間的互相傳參挤聘。
- (BOOL)webView:(UIWebView)webView shouldStartLoadWithRequest:(NSURLRequest)request navigationType:(UIWebViewNavigationType)navigationType;
第三種就是使用WKWebview轰枝,這個是iOS8之后才能用的,它也有原生的方法能夠?qū)崿F(xiàn)JS和OC的交互檬洞。下面這幾篇文章有介紹如何使用狸膏。
使用WKWebView替換UIWebView:
(iOS7下用UIWebView,iOS8后用WKWebView)
Using JavaScript with WKWebView in iOS 8
UIWebView和WKWebView的使用及js交互
WKWebView與Js實戰(zhàn)(OC版)
自己動手打造基于 WKWebView 的混合開發(fā)框架(二)——js 向 Native 一句話傳值并反射出 Swift 對象執(zhí)行指定函數(shù)
個人比較推薦第一種添怔,第一種比較方便湾戳,而且適用于比較復雜的情況。我用第一種和第三種方式寫了一個例子來實現(xiàn)互相之間的調(diào)用傳參广料,有興趣的可以看看:DSOCConnectWithJS砾脑。
還有如果要在iOS7下使用UIWebView,iOS8后使用WKWebView艾杏,同時實現(xiàn)統(tǒng)一的JS和OC之間的交互韧衣。一種就是使用跳轉(zhuǎn)攔截的方式,一種就是給h5傳系統(tǒng)版本號购桑,讓h5在iOS7的時候使用第一種的JS調(diào)用方式:xxxx.callbackHandler(''參數(shù)')畅铭。在iOS8之后使用第三種JS調(diào)用方式:
webkit.messageHandlers.callbackHandler.postMessage({"av":"jd"});
如果想讓使用者使用同一個api調(diào)用勃蜘,就自己再寫一個js層轉(zhuǎn)接硕噩。
最后這里還有一個safari調(diào)試技巧,能夠在電腦safari中直接調(diào)試真機或模擬器的webview頁面的樣式缭贡。還能夠直接在safari的控制臺里直接輸入js方法進行調(diào)試炉擅。具體怎么使用看這篇文章使用safari對webview進行調(diào)試辉懒。我這里由于是工程里的css,js文件谍失,所以它監(jiān)測不到眶俩,加載url的時候應該都沒問題的。