給Ionic寫一個cordova(PhoneGap)插件

    給Ionic寫一個cordova(PhoneGap)插件html

  以前由javaWeb轉html5開發,因爲面臨新技術,遂在適應的過程當中極爲掙扎,不過還好~,這個過程也極爲短暫;現現在面臨一些較爲複雜的需求還會有一絲絲頭痛,卻沒有一開始那麼強烈了。。。html5

  在正式寫下文以前,我先感謝公司大boss:王總,感謝他讓我進入了一個有挑戰性的技術公司 並在這個過程當中一直鼓勵我不斷汲取新技術,同時也指正了我在開發中的一些不太好的習慣,十分感謝!java

  再~,感謝在開發中給予我太多幫助的杜勇以及孫金~,不管是需求討論仍是具體開發階段都會給予一些十分有用的思路以及難點解答,尤爲是面臨技術瓶頸的時候~,再次感謝他們,十分感謝!android

  對於新手,建議準備好相應的IDE及環境:webstrom、google chrome、eclipse(或者 idea),android SDK ; webstrom 用於配合頁面js以及插件開發,eclipse用於app插件調試。ios

  就拿最近一個需求來講吧,需求:未防止第三方破解app,客戶找了一個安全公司作個評估,其中一個安全問題是安卓apk的包通過修改後依然能夠安裝運行(ios因爲安全機制存在不存在這個問題),項目組內部討論出一個比較好的解決方案是用戶登錄前驗證app包的hashcode值,並與後臺交互驗證當前發行版app的hashcode的有效性,以杜絕破解。git

  這個需求的難點在於須要訪問手機的內存讀取安裝包文件,若是是普通的需求就能夠一個html、一個JS(controller)外加上路由配置就 so easy~github

  首先一個規範的cordova插件是這樣子的(這裏我寫的一個插件的名字是 cordova-plugin-integrity-checking):web

 

  插件的主目錄下面有兩個文件夾(src和www)以及四個文件(LICENSE、package.json、plugin.xml、README.md),插件內部的排列是根據cordova規範來的,這裏很少解釋,請看上圖:算法

src:是放置安卓,ios,wp8等原生代目的地方,通常爲了區分各個平臺的代碼都會先建一個文件夾(以上是android),文件夾下面是代碼文件。chrome

www:這裏放置的是js調用原生代碼的api,裏面有調用方法和返回對象(可無)。

LICENSE:是一些開源說明,通常聲明的開源協議有GNU、BSD、Apache等~ 

package.json:這裏面用一個json聲明瞭當前插件的文件結構,固然這個不是給開發者用的,是爲了將此插件添加到項目中時打cordova命令用的,請不要忽略~

plugin.xml:這個文件裏面是以xml的形式定義了包的路徑以及api(js)對應原生的調用方法...,以及插件須要的權限聲明(好比相機權限、位置權限、聯繫人權限等~),打apk及ipa包後此文件會被融合~

README.md:這裏是一些使用說明、注意事項等~,通常你將開發的插件共享在github上的時候會須要這個,如涉及版權及項目安全此文件可忽略~

  好了,我們開始了~,首先按以上造型建文件和文件夾,我能說這是抄麼-_-|||  

  完畢,先寫個原生的android代碼吧(反正咱不會寫oc d=====( ̄▽ ̄*)b), 一下樣例是CordovaApkValidte.java =>

定義一個包名稱(雖然文件最終都是集中放置的,但請想一想大熱天一我的穿着褲衩在溜街多辣眼睛啊(● ̄(エ) ̄●)),命名以下,寫java的童鞋大概都知道,這裏就不解釋啦~:

package com.funnyZpC.integrityChecking.plugin;

而後就是cordova規範固定的寫法,繼承CordovaPlugin重寫execute方法,你能夠改,結果固然是不能用<( ̄ˇ ̄)/,exceute方法的形參圖上已經說明,這兒就沒必要綴訴啦~

    /** * Apk integrity checking * @author funnyZpC */
    public class CordovaApkValidate extends CordovaPlugin { /** * action:方法的動做,根據動做走相應的處理邏輯 * args:js調用方法時傳的參數,均以json的形式讀入(這裏未使用) * callbackContext:方法返回的對象,對象裏面包好兩個變量success和error,js的回調函數會用到 * */ @Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {

如下是代碼的主體部分,這只是一個很簡單的插件,邏輯說明已經寫進去了,自行閱讀哈~

            /** * 思路:根據cordova對象獲取包的路徑 * 然實例化MessageDigest對象的SHA-1算法 * 再講當前包加載到輸入流 * 再按字節數組讀取輸入流獲取大integer的值 * 後將大integer轉換成16進制的hashcode的表示 * 後再將16進制扔給callbackContext對象返回 */ String apkPath=cordova.getActivity().getApplicationContext().getPackageCodePath(); MessageDigest msgDigest = null; if (action.equals("getSHA1")) { try { msgDigest = MessageDigest.getInstance("SHA-1"); byte[] bytes = new byte[1024]; int byteCount; FileInputStream fis = new FileInputStream(new File(apkPath)); while ((byteCount = fis.read(bytes)) > 0){ msgDigest.update(bytes, 0, byteCount); } BigInteger bi = new BigInteger(1, msgDigest.digest()); callbackContext.success(bi.toString(16)); fis.close(); } catch (Exception e) { callbackContext.error("ERROR MESSAGE:"+e); return false; } } return true;

在webstrom裏面盲寫沒有引入包沒有代碼提示,bug率高,建議你們引入android SDK和cordova包在eclipse或idea裏面寫較nice~

雄關漫道真如鐵,而今我們只邁出了一步~,再接再礪哈(*^__^*)

下是js所調用的api:

 1 cordova.define("cordova-plugin-integrity-checking.apkValidatePlugin", function(require, exports, module) {  2 /*
 3 var exec = require('cordova/exec');  4 
 5 exports.isDeviceRooted = function(success, error) {  6  exec(success, error, "RootDetection", "isDeviceRooted", []);  7 };  8 */
 9 var exec = function (command, success, fail) { 10   cordova.exec(success, fail, "ApkValidatePlugin", command, []);//參數(回調成功,回調錯誤,別名,action名稱,參數)
11 }; 12 var apkValidate={}; 13 apkValidate.getSHA1 = function (success, fail) { 14          return exec('getSHA1', success, fail); 15 }; 16 
17 module.exports = apkValidate; 18 
19 });

 一個完整的api包含api的id,以及一個回調,如第一行,這個api內部有一個核心(代碼第10行),裏面包含了一些調用的參數,須要說明的是第三個參數是一個別名(可隨意寫),這個名字須要對應到以後要說的plugin.xml裏面的包的別名,第四個參數是action的名稱,也就是剛剛在java文件裏面寫的action的名稱(必定要對應啊~),最後一個是傳入的參數,別忘了這也是與CordovaApkValidate.java裏面對應的,最後17行共享出來的是一個變量,方便打點調用,彷彿快成了~o( ̄▽ ̄)d,別激動,這個會在最後的使用會詳細講解,如今安卓原生的邏輯已經寫好了,api也已經寫好,如何將二者結合起來,that is a trouble,but ,It's not trouble.不懂不懂(O_O)? ,下面就是嘿~

 1 <?xml version='1.0' encoding='utf-8'?>
 2 <plugin id="cordova-plugin-integrity-checking" version="1.0.0" xmlns="http://apache.org/cordova/ns/plugins/1.0"
 3  xmlns:android="http://schemas.android.com/apk/res/android">
 4     <name>Integrity checking</name>
 5     <author>@funnyZpC</author>
 6     <description>Cordova Plugin for integrity checking</description>
 7     <keywords>Cordova,Integrity,Checking,Ecosystem:Cordova,Cordova-android</keywords>
 8     <license>MIT</license>
 9     <repo>https://github.com/funnyZpC/cordova-plugin-integrity-checking</repo>
10     <issue>https://github.com/funnyZpC/cordova-plugin-integrity-checking/issues</issue>
11     <engines>
12         <engine name="cordova" version=">=3.0.0"/>
13     </engines>
14     <js-module src="www/apkValidatePlugin.js">
15         <clobbers target="Cordova"/>
16     </js-module>
17     <!-- android -->
18     <platform name="android">
19         <config-file parent="/*" target="res/xml/config.xml">
20             <feature name="ApkValidatePlugin">
21                 <param name="android-package" value="com.funnyZpC.integrityChecking.plugin.CordovaApkValidate"/>
22                 <param name="onload" value="true"/>
23             </feature>
24         </config-file>
25         <config-file parent="/*" target="AndroidManifest.xml"></config-file>
26         <source-file src="src/android/CordovaApkValidate.java" target-dir="src/com/funnyZpC/integrityChecking/plugin"/>
27     </platform>
28 </plugin>

以上,第一行須要明肯定義插件的id,這個建議與外部的插件名一致(第一張圖中的文件夾的名稱),14行中的路徑須要參照api文件所在的相對路徑填寫,20行中定義的別名與api文件中的定義的調用別名一致,21行中的value值必定是上面java文件中最上面定義的package名+類名(這是個坑,我之前常常性寫錯,心傷~~~~(>_<)~~~~),最後須要注意的是26行中的src的值是java文件的相對路徑,還有target-dir也是相對路徑(竊不要覺得後面是包名,包也是文件夾((* ̄^ ̄)),這些都不要寫錯,其餘隨意哈~<(* ̄▽ ̄*)/,另外,若是開發的是一個比較複雜的插件,好比中間須要調用內存卡讀寫權限,你須要再定義一個config-file(與其餘的config-file同級),具體以下(name的值是官方定義的,自行google)

1        <config-file target="AndroidManifest.xml" parent="/*">
2             <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
3         </config-file>
View Code

嗯~,貌似插件已近九成了~,下面該爲命令準備一個package.json文件方便將插件添加到項目中:

 

請注意上圖5~10行,其餘地方隨意哈~

 

 

                

以上兩張圖中,第一張圖是在項目目錄下打 "cordova plugin list"命令列出當前項目所用的全部的cordova插件,第二張圖是在當前項目下將插件添加到項目中,只要不出現fail字樣即插件添加成功,若是插件中須要添加變量,請在 命令後面 添加 「--veriable」(後面的英文單詞是變量名)。。。。。。,添加成功,webstrom會自動刷新,這時候請看這裏,看這裏:

 

當前插件調用的方式是: 

Cordova.apkValidate.getSHA1(function (successCallback) {

  //success logic~~~
},function (errorCallback) {

  //error logic~~~
}
)

 

 

你的項目有一個專門放置plugin的plugins的目錄,目錄下面有兩個文件android.json和fetch.json,這兩個文件裏面都有插件的申明,以上三張圖中第二和第三張,如沒有請檢查!,好了寫了仨小時多該結束了\(^o^)/,順便放兩張圖(構建平臺後的文件),讀者自行思索,看有沒有發現什麼哈(∩_∩)

 

 

 

 

 

個人博客即將搬運同步至騰訊雲+社區,邀請你們一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=y2lervmuyy9z

相關文章
相關標籤/搜索