給Ionic寫一個cordova(PhoneGap)插件
小編:管理員 430閱讀 2022.09.13
?給Ionic寫一個cordova(PhoneGap)插件
之前由javaWeb轉html5開發,由于面臨新技術,遂在適應的過程中極為掙扎,不過還好~,這個過程也極為短暫;現如今面臨一些較為復雜的需求還會有一絲絲頭痛,卻沒有一開始那么強烈了。。。
??對于新手,建議準備好相應的IDE及環境:webstrom、google chrome、eclipse(或者 idea),android SDK ; webstrom 用于配合頁面js以及插件開發,eclipse用于app插件調試。
??就拿最近一個需求來說吧,需求:未防止第三方破解app,客戶找了一個安全公司做個評估,其中一個安全問題是安卓apk的包經過修改后依然可以安裝運行(ios由于安全機制存在不存在這個問題),項目組內部討論出一個比較好的解決方案是用戶登陸前驗證app包的hashcode值,并與后臺交互驗證當前發行版app的hashcode的有效性,以杜絕破解。
??這個需求的難點在于需要訪問手機的內存讀取安裝包文件,如果是普通的需求就可以一個html、一個JS(controller)外加上路由配置就 so easy~
??首先一個規范的cordova插件是這樣子的(這里我寫的一個插件的名字是 cordova-plugin-integrity-checking):

插件的主目錄下面有兩個文件夾(src和www)以及四個文件(LICENSE、package.json、plugin.xml、README.md),插件內部的排列是根據cordova規范來的,這里不多解釋,請看上圖:
src:是放置安卓,ios,wp8等原生代目的地方,一般為了區分各個平臺的代碼都會先建一個文件夾(以上是android),文件夾下面是代碼文件。
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 2復制4 Integrity checking 5@funnyZpC 6Cordova Plugin for integrity checking 7Cordova,Integrity,Checking,Ecosystem:Cordova,Cordova-android 8MIT 9https://github.com/funnyZpC/cordova-plugin-integrity-checking 10https://github.com/funnyZpC/cordova-plugin-integrity-checking/issues 1112 1413 15 17 1816 19 2820 2521 22 23 2426 27
以上,第一行需要明確定義插件的id,這個建議與外部的插件名一致(第一張圖中的文件夾的名稱),14行中的路徑需要參照api文件所在的相對路徑填寫,20行中定義的別名與api文件中的定義的調用別名一致,21行中的value值一定是上面java文件中最上面定義的package名+類名(這是個坑,我以前經常性寫錯,心傷~~~~(>_<)~~~~),最后需要注意的是26行中的src的值是java文件的相對路徑,還有target-dir也是相對路徑(竊不要以為后面是包名,包也是文件夾((* ̄^ ̄)),這些都不要寫錯,其他隨意哈~<(* ̄▽ ̄*)/,另外,如果開發的是一個比較復雜的插件,比如中間需要調用內存卡讀寫權限,你需要再定義一個config-file(與其他的config-file同級),具體如下(name的值是官方定義的,自行google)
1復制2 3
嗯~,貌似插件已近九成了~,下面該為命令準備一個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^)/,順便放兩張圖(構建平臺后的文件),讀者自行思索,看有沒有發現什么哈(∩_∩)



相關推薦
- Cordova 什么是Cordova? Cordova是用于使用HTML,CSS和JS構建移動應用的平臺。我們可以認為Cordova是一個容器,用于將我們的網絡應用程序與本機移動功能連接。默認情況下,Web應用程序不能使用本機移動功能。這就是Cordova進來的地方。它為網絡應用和移動設備之間的連…
- Hibernate Criterion 在查詢方法設計上能夠靈活的依據Criteria的特點來方便地進行查詢條件的組裝.Hibernate設計了CriteriaSpecification作為Criteria的父接口,以下提供了Criteria和DetachedCriteria.Criteria和DetachedCriteria的主要差別在于創建的形式不一樣,Criteria是在線的,所…