? ? ? ?公司員工端項(xiàng)目還剩最后一塊js交互剩著轧邪,由于項(xiàng)目是仿安卓端做的刽脖,之前做安卓的那個(gè)走了好久,問現(xiàn)在的安卓他也是一頭霧水忌愚,自己搞了一個(gè)星期曲管,也是云里霧里。
? ? ? 對(duì)于交互這一塊硕糊,安卓實(shí)現(xiàn)起來非常的方便院水,一句addJavascriptInterface就能解決,而iOS則比較麻煩特別是對(duì)于我這種.............
..........简十,網(wǎng)上查了一大堆大都是粘貼復(fù)制差不多的文章檬某,都沒能解決我的問題,無意間看到了一篇有關(guān)于JSContext的介紹,終于還是解決了問題.
?Show The Code :
ios js 交互分為兩塊:
1.oc調(diào)用js?
這一塊實(shí)現(xiàn)起來比較簡單螟蝙,
我的項(xiàng)目中加載的是本地的html恢恼,js,css,需要注意的是當(dāng)你向工程中拖入這些文件時(shí)胰默,選擇如下操作场斑,(拖入的文件夾是藍(lán)色的,相對(duì)路徑)牵署,不然css,js 的路徑會(huì)存在問題
加載本地html:
oc調(diào)用js:一句代碼搞定
2.js 調(diào)用oc
? js調(diào)用oc又分為兩種:
?1.js端是直接調(diào)用方法
?
這里就要說到ios7才推出的一個(gè)新的api? ? JavaScriptCore漏隐,首先我們引入這個(gè)類,并初始化一個(gè)JSContext對(duì)象
在webViewDidFinishLoad方法里
此處通過當(dāng)前webView的鍵獲取到j(luò)scontext
將我們的context對(duì)象與js方法建立橋接聯(lián)系碟刺,
其中test1表示我們js里面的方法名锁保,這個(gè)名字要你和后臺(tái)約定好一樣才行,ok,完事
2.js端通過對(duì)象調(diào)用方法
說到對(duì)象調(diào)方法我們首先肯定得有個(gè)對(duì)象半沽,所以我們首先需要?jiǎng)?chuàng)建一個(gè)js交互類,并聲明和實(shí)現(xiàn)相應(yīng)的交互方法吴菠,在這里需要注意的是我們需要在這個(gè)自定義交互類里面導(dǎo)入JavaScriptCore框架者填,聲明一個(gè)遵從于JSExport協(xié)議的協(xié)議(有點(diǎn)繞,看圖),在這個(gè)協(xié)議里聲明我們的交互方法做葵,最后讓我們的交互類遵從與我們自定義的協(xié)議
在交互類的.m中實(shí)現(xiàn)相應(yīng)的js交互方法占哟,并實(shí)現(xiàn)我們想要的操作
注意到圖上的 JSExportAs(showconfirm, - (void)showconfirm:(NSString*)str Scripts:(NSString*)scripts); 這個(gè)方法沒有,這個(gè)方法的作用是當(dāng)js端的方法有兩個(gè)或兩個(gè)以上參數(shù)時(shí),我們需要讓- (void)showconfirm:(NSString*)str Scripts:(NSString*)scripts這個(gè)方法代替 showconfirm 這個(gè)方法榨乎,因?yàn)閛c端的方法名必須和js端的保持一致怎燥,不然就不會(huì)調(diào)用
最后在我們的webViewDidFinishLoad方法里初始化我們的交互對(duì)象,并讓 context 與之建立聯(lián)系蜜暑,ok铐姚,完事