JS與原生OC/Swift相互調(diào)用總結(jié)

JS和OC/Swift相互調(diào)用,主要總結(jié)了JS和OC交互的三種方式
1.使用UIWebView,利用JavaScriptCore實現(xiàn)
2.使用WKWebView坤邪,利用WKScriptMessageHandler實現(xiàn)
3.使用第三方框架WebViewJavascriptBridge實現(xiàn)

JavaScriptCore

在Swift中獲取JS的context

context = webView.value(forKeyPath: "documentView.webView.mainFrame.javaScriptContext") as? JSContext

注入JS需要的對象仗岖,對象命名與html中使用的保持一致.self是遵守了JSExport協(xié)議,也可是其他遵守協(xié)議的對象朽们。

context?.setObject(self, forKeyedSubscript:  "OC" as NSCopying & NSObjectProtocol)

JS調(diào)用Swift的方法合住,在Swift中實現(xiàn)協(xié)議

@objc protocol JSDelegate :JSExport {
    //包含參數(shù)的func,需要注意參數(shù)名對函數(shù)名稱的影響
    func showMessageToYou(_ message:String)
    
    /*
     對應(yīng)html中“showAAndB”,此方法包含兩個參數(shù)绸栅,需要在參數(shù)前加“_”
     func showA(_ aString: String, andB: String)
     func showAAndB(_ aString:String,_ bStr:String)
     以上兩個方法等同
     */
    func showAAndB(_ aString:String,_ bStr:String)
    
    func doActionCallBack()
}

Swift調(diào)用JS的方法

let jsStr = String(format:"callback('%@')",(textField?.text)!)
self.context?.evaluateScript(jsStr)

OC中可使用block和實現(xiàn)JSExport協(xié)議兩種方式實現(xiàn)项钮,代碼實現(xiàn):

JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
self.context = context;
//注入JS需要的“OC”對象,該對象與html中的保持一致即可
self.context[@"OC"] = self;

WKScriptMessageHandler

初始化WKWebView后,添加供js調(diào)用oc/Swift的橋梁华望,這里的name對應(yīng)WKScriptMessage中的name

webView.configuration.userContentController.add(_ scriptMessageHandler: WKScriptMessageHandler, name: String)

遵守協(xié)議WKScriptMessageHandler哟玷,實現(xiàn)以下方法狮辽,可實現(xiàn)JS把消息發(fā)送給OC/Swift。

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)

OC/Swift調(diào)用JS

let jsStr = String(format:"callback('%@')",(textField?.text)!)
self.webView.evaluateJavaScript(jsStr as String, completionHandler: { (result:Any?, error:Error?) in
       print("error:",error as Any)
 })

WebViewJavascriptBridge

初始化WKWebViewJavascriptBridge

self.webViewBridge = [WKWebViewJavascriptBridge bridgeForWebView:self.webView];
[self.webViewBridge setWebViewDelegate:self];

JS調(diào)用OC需要注冊事件

[self.webViewBridge registerHandler:@"handlerName" handler:^(id data, WVJBResponseCallback responseCallback) {
   //code
}];

OC調(diào)用JS

[self.webViewBridge callHandler:@"handlerName" data:@[textField.text] responseCallback:^(id responseData) {
        NSLog(@"%@",responseData);
 }];

html中需要放置以下代碼

/*這段代碼是固定的巢寡,必須要放到j(luò)s中*/
function setupWebViewJavascriptBridge(callback) {
    if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
    if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
    window.WVJBCallbacks = [callback];
    var WVJBIframe = document.createElement('iframe');
    WVJBIframe.style.display = 'none';
    WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
    document.documentElement.appendChild(WVJBIframe);
    setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
}
/*與OC交互的所有JS方法都要放在此處注冊喉脖,才能調(diào)用通過JS調(diào)用OC或者讓OC調(diào)用這里的JS*/
setupWebViewJavascriptBridge(function(bridge) {
     bridge.registerHandler('callback', function(data, responseCallback) {
        callback(data);
        responseCallback('js執(zhí)行過了'+data);
    })
})
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市抑月,隨后出現(xiàn)的幾起案子树叽,更是在濱河造成了極大的恐慌,老刑警劉巖谦絮,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件题诵,死亡現(xiàn)場離奇詭異洁仗,居然都是意外死亡,警方通過查閱死者的電腦和手機性锭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門赠潦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人草冈,你說我怎么就攤上這事祭椰。” “怎么了疲陕?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵方淤,是天一觀的道長。 經(jīng)常有香客問我蹄殃,道長携茂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任诅岩,我火速辦了婚禮讳苦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吩谦。我一直安慰自己鸳谜,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布式廷。 她就那樣靜靜地躺著咐扭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪滑废。 梳的紋絲不亂的頭發(fā)上蝗肪,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音蠕趁,去河邊找鬼薛闪。 笑死,一個胖子當著我的面吹牛俺陋,可吹牛的內(nèi)容都是我干的豁延。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼腊状,長吁一口氣:“原來是場噩夢啊……” “哼诱咏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起寿酌,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤胰苏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硕并,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡法焰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了倔毙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片埃仪。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖陕赃,靈堂內(nèi)的尸體忽然破棺而出卵蛉,到底是詐尸還是另有隱情,我是刑警寧澤么库,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布傻丝,位于F島的核電站,受9級特大地震影響诉儒,放射性物質(zhì)發(fā)生泄漏葡缰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一忱反、第九天 我趴在偏房一處隱蔽的房頂上張望泛释。 院中可真熱鬧,春花似錦温算、人聲如沸怜校。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茄茁。三九已至,卻和暖如春蔓搞,著一層夾襖步出監(jiān)牢的瞬間胰丁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工喂分, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人机蔗。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓蒲祈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親萝嘁。 傳聞我的和親對象是個殘疾皇子梆掸,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 最近整理了一下原生與H5之間的交互方式,簡單的做個總結(jié)牙言。OC端與JS的交互酸钦,大致有這幾種:攔截協(xié)議、JavaScr...
    談Xx閱讀 31,102評論 41 75
  • 隨著H5技術(shù)的興起咱枉,在iOS開發(fā)過程中卑硫,難免會遇到原生應(yīng)用需要和H5頁面交互的問題徒恋。其中會涉及方法調(diào)用及參數(shù)傳值等...
    Chris_js閱讀 3,060評論 1 8
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件欢伏、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,024評論 4 62
  • 一入挣、利用WebViewJavascriptBridge實現(xiàn)Native和Web的交互 參考鏈接1參考鏈接2 四個必...
    CoderZb閱讀 2,175評論 0 5
  • 前言 Web 頁面中的 JS 與 iOS Native 如何交互是每個 iOS 猿必須掌握的技能。而說到 Nati...
    幽城88閱讀 2,194評論 1 8