上一篇文章介紹了Cordova創(chuàng)建了第一個(gè)項(xiàng)目挣郭,分析了工程目錄結(jié)構(gòu),這一篇寫寫插件
何為插件男杈,就是完成獨(dú)立工程的單元丈屹,在cordova項(xiàng)目中,插件就是封裝原生功能供給vue等等的js調(diào)用伶棒。比如開發(fā)一個(gè)調(diào)用相機(jī)拍照功能,js是不能獨(dú)立調(diào)用相機(jī)拿到返回值的彩库,我們需要提供給js調(diào)用相機(jī)的方法肤无,插件的監(jiān)聽方法,拿到照片之后骇钦,將照片打成二進(jìn)制返回給前端處理一系列的流程宛渐。將這些功能封裝在一個(gè)工具類里,然后暴漏給js一個(gè)接口,這就是插件窥翩。
就以打電話為例開發(fā)一個(gè)插件
上一篇?jiǎng)?chuàng)建的工程中 www文件夾下 index.html文件中增加如下代碼
1.(刪除系統(tǒng)給的index 或者修改也行业岁,寫個(gè)按鈕出來)??
2.實(shí)現(xiàn)打電話方法
3.運(yùn)行一下大概是下面的樣子,點(diǎn)擊有個(gè)彈窗
到這為止寇蚊,cordova加載index笔时,包括修改前端的工作已經(jīng)完成,下面實(shí)現(xiàn)交互仗岸。
下面在www目錄下創(chuàng)建實(shí)體文件夾 plugins一定要是實(shí)體文件夾(創(chuàng)建出來是藍(lán)色的)
在plugins文件夾中 創(chuàng)建 cordova.plugins.MCallACall 文件夾同時(shí)這個(gè)文件夾也是插件id允耿,文件夾最后部分最好對(duì)應(yīng)OC類名,不容易出錯(cuò)
在 cordova.plugins.MCallACall中創(chuàng)建一個(gè)www文件夾
在www里創(chuàng)建 js文件 ?MCallACall.js
目錄結(jié)構(gòu)如下:
在js文件中 實(shí)現(xiàn)如下代碼:
第一句是定義了插件id扒怖,一般都是和文件夾名加方法名
第二句類似 OC中 import 引入cordovajs中exec方法
第三句定義一個(gè)js函數(shù)塊较锡,供外部調(diào)用,名稱就是上面id定義的
第四句是定義調(diào)用方法名盗痒,call 傳入兩個(gè)監(jiān)聽(回掉)方法 一個(gè)是成功一個(gè)是失敗蚂蕴,第三個(gè)參數(shù)是電話號(hào)碼
第五句是exec中定義的返回值格式,前兩個(gè)成功和失敗函數(shù)俯邓,第三個(gè)參數(shù)OC類名骡楼,第四個(gè)參數(shù)OC方法名,第五個(gè)參數(shù)是數(shù)組看成,將所有入?yún)⒍继砑拥綌?shù)組中傳入
最后返回的還是 插件名
在插件銜接js中實(shí)現(xiàn)如下代碼:
都是一樣的格式君编,exports中按著 plugin_list格式給出插件調(diào)用信息
第一行 id 就是之前在插件js中定義好的
第二行 文件路徑
第三行 是插件id
第五行 供給外部調(diào)用的方法名
下面是metadata 插件版本信息
隨便寫個(gè) 1.0.0
在config.xml 中實(shí)現(xiàn)如下代碼 :
這里配置加載插件信息,必須配置
在工程plugin文件夾中 創(chuàng)建OC類繼承自CDVPlugin
類名方法名在插件js中都定義好了川慌,必須要同名
所以類名叫MCallACall 方法名叫?call 方法還要增加個(gè)參數(shù)吃嘿,參數(shù)類型是CDVInvokedUrlCommand
這個(gè)框架里都有提供,可以仔細(xì)看一看
大概代碼如下
頭文件:
實(shí)現(xiàn):
如果正常的話梦重,運(yùn)行一下兑燥,就可以實(shí)現(xiàn)撥打電話功能,功能圖就不放了直接撥打出去琴拧,有個(gè)確認(rèn)降瞳。
代碼都很簡單,應(yīng)該看的懂蚓胸,自己打印一下 command中都有什么 callbackid是什么挣饥,還有argument里都有什么。這些都是開發(fā)項(xiàng)目必備的功能沛膳,后續(xù)我也會(huì)講扔枫。
這只是一個(gè)js調(diào)原生的簡單插件實(shí)現(xiàn)原理,后續(xù)復(fù)雜的都可以通過這個(gè)擴(kuò)展锹安,可能有些插件還要回調(diào)給前端信息短荐,比如撥打電話是否成功倚舀,拿回來了什么信息,是否失敗忍宋,失敗的原因痕貌。等等
尤其注意的是,插件代碼原則上都必須運(yùn)行在子線程糠排,cordova已經(jīng)給出了默認(rèn)后臺(tái)線程self.commandDelegaterunInBackground
但是有很多OC方法必須在主線程實(shí)現(xiàn)舵稠,比如打電話,比如更新UI操作乳讥,比如數(shù)據(jù)持久化等等柱查,我建議就像上面實(shí)現(xiàn)那樣寫,將需要在主線程運(yùn)行的代碼通過gcd返回主線程執(zhí)行云石。如果插件運(yùn)行過于耗時(shí)唉工,spa內(nèi)容就會(huì)卡頓,嚴(yán)重影響用戶體驗(yàn)汹忠。