主要的目的就在這了王暗,我要學(xué)習(xí)一下怎么寫cordova插件,如何調(diào)試庄敛,如何寫config plugin.xml文件瘫筐。
基礎(chǔ)知識儲備:寫過java的helloworld,運(yùn)行過eclipse上的android模擬器铐姚,js還行。
-
創(chuàng)建一個應(yīng)用肛捍,用來調(diào)用寫好的插件
- 進(jìn)入工程目錄:
cordova create hello com.example.hello HelloWorld
- 進(jìn)入工程目錄:
第一個參數(shù)hello
表示在工程目錄中創(chuàng)建一個 hello 的文件夾
第二個參數(shù)com.example.hello
表示包名(反向域名)隐绵,用于標(biāo)志不同的 app
第三個參數(shù)HelloWorld
表示項(xiàng)目的名稱,可以在 config.xml 文件中修改
添加平臺
進(jìn)入創(chuàng)建的項(xiàng)目中:
cd hello
添加平臺
cordova platform add android
查看已經(jīng)安裝的平臺和支持的平臺:
cordova platforms list
移除不想要的平臺
cordova platform remove android
編譯項(xiàng)目
cordova build android
或
cordova prepare android cordova compile android
編譯完成后可以看到 platforms/android/bin/ 下已經(jīng)生成了 apk 文件測試拙毫、運(yùn)行項(xiàng)目
查看adb識別的設(shè)備
cordova run --list
指定設(shè)備運(yùn)行當(dāng)前程序( 若不指定默認(rèn)列表第一個設(shè)備)
cordova run android --target=deviceName
-
一個簡單的非native插件(只用到j(luò)s)(有個軟件plugman會更方便依许,比如會生成plugin.xml)
- 創(chuàng)建插件目錄
仿照官方明確插件結(jié)構(gòu)
pluginFolder
|--src
|.....|--android
|...............|--xxx.java
|.....|--otherPlatform
|--www
|.......|--xxx.js
|--plugin.xml
這里的 src 對應(yīng)不同的平臺,www 放我們的 javascript 文件缀蹄,plugin.xml是插件的配置文件峭跳。 - plugin.xml – 配置清單
- 創(chuàng)建插件目錄
<?xml version="1.0" encoding="UTF-8"?>
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
xmlns:rim="http://www.blackberry.com/ns/widgets"
xmlns:android="http://schemas.android.com/apk/res/android"
id="cordova-plugin-test"http://插件的標(biāo)識膘婶,即發(fā)布到 plugins.cordova.io的ID,
//(cordova plugin remove id)(在wex5中使用前要把工程文件夾名改為這個id)
version="1.0.0">
<engines>
<engine name="cordova-android" version="=1.8.0" />
//該插件基于cordova的版本蛀醉,
//也可模糊匹配<engine name="cordova-android" version=">=1.8.0" />
// <engine name="cordova" version=">=1.7.0" />
// <engine name="cordova-android" version=">=1.8.0" />
///<engine name="cordova-ios" version=">=1.7.1" />
</engines>
<name>test</name>//插件的名稱
<description>Cordova Plugin For A Test</description>//描述信息
<author>Foo plugin author</author>
<license>Apache 2.0</license>
<keywords>cordova,test</keywords>
<js-module src="www/test.js" name="test">//對應(yīng)我們的 javascript 文件
<clobbers target="cordova.plugin.test" />//target:H5通過它作為前綴調(diào)用js中間件方法悬襟。用于指定module.exports被插入在window對象的命名空間。你可以有很多的clobbers只要你喜歡拯刁。創(chuàng)建window上的任何對象不可用
</js-module>
<dependency id="cordova-plugin-someplugin" url="https://github.com/myuser/someplugin" commit="428931ada3891801" subdir="some/path/here" />
<dependency id="cordova-plugin-someplugin" version="1.0.1">
//在dependency標(biāo)簽允許你指定在其當(dāng)前插件依賴其他插件
<!-- android -->
<platform name="android">//支持的平臺脊岳,這里僅僅用到了 android
//config-file標(biāo)識一個基于XML的配置文件進(jìn)行修改,其中在該文件中所述修改應(yīng)該發(fā)生垛玻,什么應(yīng)該進(jìn)行修改割捅。
<config-file target="res/xml/config.xml" parent="/*">//插件的配置信息,最后會添加到 res/xml/config.xml文件
<feature name="test" >//這個name設(shè)置必須要和下面這個插件類名相同帚桩,哎亿驾,這個導(dǎo)致的class not found把工程刪了建建了刪的搞了好幾次才發(fā)現(xiàn)
<param name="android-package" value="cordova.plugin.test.test"/>//package.繼承cordovaplugin的類名
</feature>
</config-file>
<config-file target="AndroidManifest.xml" parent="/manifest/application">
<activity android:name="com.foo.Foo" android:label="@string/app_name">
<intent-filter>
</intent-filter>
</activity>
</config-file>
<edit-config file="AndroidManifest.xml" target="/manifest/application" mode="merge">
//config-file 是插入,edit-config在mode="merge"狀態(tài)下是合并
<application android:theme="@android:style/Theme.NoTitleBar.Fullscreen"></application>
</edit-config>
<hook type="after_plugin_install" src="scripts/afterPluginInstall.js" />
//hook表示將由cordova當(dāng)某些行為發(fā)生時被調(diào)用自定義腳本(例如账嚎,插件添加或平臺準(zhǔn)備邏輯后調(diào)用)莫瞬。當(dāng)你需要擴(kuò)展默認(rèn)cordvoa的功能,這非常有用醉锄。
<source-file src="src/android/test.java" target-dir="src/cordova/plugin/test/dtest" />
//并且將我們的 src/android/test.java乏悄,復(fù)制到 android 的 package 包中。對應(yīng)定義的包名恳不,也可用拷貝其他文件
///相對于plugin.xml到文件的位置
</platform>
</plugin>
- xxx.js – 中間件
exports.forTest = function(success,error){//exports用來暴露接口
var a=123;
success(a);
};
到這里檩小,一個簡單的測試插件就完成了。
若是使用plugman這些步驟就是一句話:
plugman create --name test --plugin_id cordova.plugin.test --plugin_vers ion 1.0.0 --path D:/cordova/
--name 插件名烟勋,也是--path下的插件所在文件夾名
--plugin_id 插件id
--plugin_version 版本號
--path 相對路徑或絕對路徑
-
一個簡單的測試
- 添加插件到應(yīng)用
切到應(yīng)用目錄
cordova plugin add path/PluginName
查看應(yīng)用的plugins目錄规求,添加成功就會有PluginID對應(yīng)的文件夾。 - 在應(yīng)用的js中調(diào)用插件
- 添加插件到應(yīng)用
var suc=function(result){alert(result);};
cordova.plugin.test.forTest(suc);//對應(yīng)js-module 中的clobbers.暴露接口
- 運(yùn)行一下
cordova run android --target=deviceName
-
添加native部分
- xxx.js卵惦,中間件部分
var exec = require('cordova/exec');//法克阻肿,昨天寫的代碼那這句搞沒了,找了一天才發(fā)現(xiàn)沮尿。
//所以還是建議這么用 var cordova=require('cordova');
//下面調(diào)用時用cordova.exec(success,error,"test","testFun",[]);
var myFunc = function(){};
// arg1:成功回調(diào)
// arg2:失敗回調(diào)
// arg3:將要調(diào)用的java類
// arg4:調(diào)用的原生方法名
// arg5:參數(shù)丛塌,json格式
myFunc.prototype.javaShow=function() {
exec(success, error, "test", "testFun", [test]);
//根據(jù)plugin.xml的配置,傳給 java 類的 action 參數(shù)來調(diào)用 java 方法
//exec就是js與java交互的傳送門
};
var forOut = new myFunc();
module.exports = forOut;
- xxx.java,nativa部分
package cordova.plugin.test;
//
import org.apache.cordova.CordovaInterface;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CordovaWebView;
import android.content.Context;
import org.json.JSONArray;
import org.json.JSONException;
//繼承 CordovaPlugin 接口
//class name要對應(yīng)上js
public class test extends CordovaPlugin {
//按需復(fù)寫 execute 方法
//action:js傳來的 action 參數(shù)畜疾,通過匹配執(zhí)行相應(yīng)方法
//args:js傳來的參數(shù)赴邻,以 JSONArray 格式,通過 get 方法獲取值
//callbackContext:對應(yīng)js的succee啡捶、error姥敛,給其返回結(jié)果
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
try {
if (action.equals("testFun")) {//執(zhí)行對應(yīng)action方法
callbackContext.success("testFun_OK");//返回成功回調(diào)參數(shù)
return true;
}
callbackContext.error("Invalid Action");
return false;
} catch (Exception e) {
System.err.println("Exception: " + e.getMessage());
callbackContext.error(e.getMessage());
return false;
}
}
}
all done
暫時還不知道怎么調(diào)試,只能改源碼一下下再編譯了瞎暑。
每改一次都要
cordova plugin rm pluginName --save
一下彤敛,然后再添加回來
////////////////////////
今天看了下好像可以用cordova server portNum這樣調(diào)試与帆,還沒嘗試。坑
如果擴(kuò)展了插件墨榄,在用命令行工具編譯時要使用 cordova compile 而不要用 cordova build 命令玄糟,因?yàn)?cordova build 命令其實(shí)是 cordova prepare + cordova compile,而 cordova prepare 命令做的就是根據(jù)插件中的 config.xml 將插件文件復(fù)制到項(xiàng)目中渠概,這樣就會把你修改了的插件文件替換掉茶凳,所以如果只是想編譯項(xiàng)目,就只使用 cordova compile 命令吧播揪。