種簡(jiǎn)單的方式。那就是利用WKWebView的新特性MessageHandler來實(shí)現(xiàn)JS調(diào)用原生方法。
MessageHandler 是什么?
WKWebView 初始化時(shí),有一個(gè)參數(shù)叫configuration,它是WKWebViewConfiguration類型的參數(shù),而WKWebViewConfiguration有一個(gè)屬性叫userContentController,它又是WKUserContentController類型的參數(shù)。WKUserContentController對(duì)象有一個(gè)方法- addScriptMessageHandler:name:,我把這個(gè)功能簡(jiǎn)稱為MessageHandler。
- addScriptMessageHandler:name:有兩個(gè)參數(shù),第一個(gè)參數(shù)是userContentController的代理對(duì)象,第二個(gè)參數(shù)是JS里發(fā)送postMessage的對(duì)象。
所以要使用MessageHandler功能,就必須要實(shí)現(xiàn)WKScriptMessageHandler協(xié)議。
我們?cè)谠揂PI的描述里可以看到在JS中的使用方法
怎么使用MessageHandler?
1.創(chuàng)建WKWebViewConfiguration對(duì)象,配置各個(gè)API對(duì)應(yīng)的MessageHandler。
WKUserContentController對(duì)象可以添加多個(gè)scriptMessageHandler。
需要注意的是addScriptMessageHandler很容易引起循環(huán)引用,導(dǎo)致控制器無法被釋放,所以需要加入以下這段:
2.創(chuàng)建WKWebView。
3.實(shí)現(xiàn)協(xié)議方法。
我這里實(shí)現(xiàn)了兩個(gè)協(xié)議,WKUIDelegate是因?yàn)槲以贘S中彈出了alert 。WKScriptMessageHandler是因?yàn)槲覀円幚鞪S調(diào)用OC方法的請(qǐng)求。
WKScriptMessage有兩個(gè)關(guān)鍵屬性name和body。
因?yàn)槲覀兘o每一個(gè)OC 方法取了一個(gè)name,那么我們就可以根據(jù)name 來區(qū)分執(zhí)行不同的方法。body 中存著JS 要給OC 傳的參數(shù)。解析JS 調(diào)用OC 的參數(shù):
message.boby 就是JS 里傳過來的參數(shù)。我們不同的方法先做一下容錯(cuò)性判斷。然后正常取值就可以了。
4.處理HTML中JS調(diào)用。
HMTL的源碼跟之前的HTML內(nèi)容差不多,只有JS的調(diào)用部分改變了。
5.OC調(diào)用JS
這里使用WKWebView 實(shí)現(xiàn)OC 調(diào)用JS方法,還是利用
- evaluateJavaScript:completionHandler:。像下面這樣使用:
參考:http://www.lxweimin.com/p/433e59c5a9eb