給Ionic寫一個cordova(PhoneGap)插件

                小編:管理員 136閱讀 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 <?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>
                復制

                嗯~,貌似插件已近九成了~,下面該為命令準備一個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^)/,順便放兩張圖(構建平臺后的文件),讀者自行思索,看有沒有發現什么哈(∩_∩)

                關聯標簽:
                喵视频,国偷自产一区二视频观看,国产三级视频在线观看,国产精品免费久久久久电影,老师你下面太紧了拔不出来,国产成人亚洲欧美综合无码,亚洲日本VA中文字幕久久