給Ionic寫一個cordova(PhoneGap)插件

小編:管理員 403閱讀 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
 6     Cordova Plugin for integrity checking
 7     Cordova,Integrity,Checking,Ecosystem:Cordova,Cordova-android
 8     MIT
 9     https://github.com/funnyZpC/cordova-plugin-integrity-checking
10     https://github.com/funnyZpC/cordova-plugin-integrity-checking/issues
11     
12         
13     
14     
15         
16     
17     
18     
19         
20             
21                 
22                 
23             
24         
25         
26         
27     
28 
復制

以上,第一行需要明確定義插件的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^)/,順便放兩張圖(構建平臺后的文件),讀者自行思索,看有沒有發現什么哈(∩_∩)

關聯標簽:
亚洲国产欧美图片,亚洲aⅴ在线av,日韩亚洲综合图片视频,日本av精品在线中文