• <menu id="oqooq"><table id="oqooq"></table></menu>
  • <bdo id="oqooq"><noscript id="oqooq"></noscript></bdo>

    給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
     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^)/,順便放兩張圖(構建平臺后的文件),讀者自行思索,看有沒有發現什么哈(∩_∩)

    關聯標簽:
    黄色一片
  • <menu id="oqooq"><table id="oqooq"></table></menu>
  • <bdo id="oqooq"><noscript id="oqooq"></noscript></bdo>