關(guān)于webview的與JS交互這里比較全疗疟,感謝作者的整理赘娄。
https://github.com/Haley-Wong/JS_OC
最近也在做JS這一塊恬吕,用到的是WebViewJavascriptBridge框架铃在,但是我們的需求是網(wǎng)頁(yè)加載結(jié)束之后馬上就從app這邊獲取數(shù)據(jù)傳給h5,這個(gè)時(shí)候就碰到了一個(gè)概率性的問(wèn)題拢驾,因?yàn)閖sb是第一次執(zhí)行的時(shí)候要先建立bridge奖磁,要先往h5里面注入他自己的一段js代碼,通過(guò)stringByEvaluatingJavaScriptFromString來(lái)注入繁疤,這個(gè)方法是同步執(zhí)行的咖为,可能這段代碼還沒(méi)執(zhí)行完成,h5那邊就調(diào)用WebViewJavascriptBridge.callHandler嵌洼,找不到callHandler方法案疲,拋異常,界面卡主無(wú)法操作麻养。
后面git上看到Haley-Wong的JS交互總結(jié)褐啡,發(fā)現(xiàn)WKWebview就有系統(tǒng)原生的JS交互,WKUserContentController
,他是管理JS交互操作執(zhí)行鳖昌。具體例子可以去看Haley-Wong同學(xué)寫(xiě)的备畦。
js->oc:window.webkit.messageHandlers.Location.postMessage(null);
Location是OC這邊定義的MessageHandler,postMessage里面是參數(shù)许昨,
這里一個(gè)問(wèn)題懂盐,如果是沒(méi)有傳參數(shù)給oc的話,這里面要寫(xiě)null糕档,不然oc不會(huì)有回調(diào)莉恼。
oc->js:
NSString *jsStr = [NSString stringWithFormat:@"getDataReturn('%@')",@"新不行啊"];
[self.webView evaluateJavaScript:jsStr completionHandler:^(id _Nullable result, NSError * _Nullable error) {
NSLog(@"%@----%@",result, error)
}];
jsStr 里面是h5那邊定義的方法+參數(shù),
js->oc獲取數(shù)據(jù):
就是先js->oc告訴app他要獲取數(shù)據(jù)再oc->js,就是上面兩個(gè)步驟結(jié)合,他不像jsp那樣子俐银,js執(zhí)行調(diào)用oc之后之后直接有回調(diào)回去尿背。
這邊有一個(gè)問(wèn)題:
我在調(diào)用WKWebview的evaluateJavaScript的時(shí)候老是報(bào)錯(cuò):Error Domain=WKErrorDomain Code=4 "A JavaScript exception occurred" UserInfo={WKJavaScriptExceptionLineNumber=79, WKJavaScriptExceptionMessage=ReferenceError: Can't find variable: $, WKJavaScriptExceptionSourceURL=****, NSLocalizedDescription=A JavaScript exception occurred, WKJavaScriptExceptionColumnNumber=18},
這里面的問(wèn)題原因是:evaluateJavaScript去調(diào)用h5中的方法之后捶惜,這個(gè)function要執(zhí)行完成之后才會(huì)回調(diào)的app這邊田藐,如果這個(gè)function中報(bào)錯(cuò)了,回調(diào)到app這邊就會(huì)一直報(bào)錯(cuò)吱七。所以建議function中的東西可以先延遲執(zhí)行汽久。還有function需要寫(xiě)在最外層,不然也會(huì)報(bào)錯(cuò)踊餐。限制太多景醇。