Cordova LOGO
編寫規(guī)則
具體規(guī)則參見官網(wǎng)文檔锣险,比較清晰措拇,有示例秒际。
詳情參考:
Plugin Development Guide
iOS Plugin Development Guide
Android Plugin Development Guide
一赫模、Cordova-Plugin的組成部分
./cordova-plugin-network-information/
|-src/ ................................. 插件原生部分代碼
| |-android/ .......................... Android 平臺
| | '-NetworkManager.java*
| |-browser/ .......................... 瀏覽器 平臺
| | '-network.js
| '-ios/ .............................. iOS 平臺
| |-CDVConnection.h
| |-CDVConnection.m
| |-CDVReachability.h
| '-CDVReachability.m
|-tests/ ............................... 測試
| |-plugin.xml
| '-tests.js
|-www/ ................................. 與原生橋接的 JS树肃,如果不同平臺代碼有差異,這個文件夾下瀑罗,也可以再分平臺
| |-android/
| |-ios/
| |-Connection.js
| '-network.js
|-package.json ......................... 描述文件(用于在代碼庫注冊關(guān)鍵字胸嘴、描述依賴等)
`-plugin.xml ........................... 配置文件(安裝插件時,會安裝到平臺的 config.xml 中)
二斩祭、插件中劣像,負(fù)責(zé)橋接部分的 JS
可以多個平臺共用,如有區(qū)別摧玫,也可以每個平臺分開編寫
cordova.define("mytestplg.ttt", function(require, exports, module) {
var exec = require('cordova/exec');
// 成功回調(diào)函數(shù)
function successCallback(oo) {
alert('ok ' + oo);
}
// 失敗回調(diào)函數(shù)
function failureCallback(ee) {
alert('err ' + ee);
}
// 這里用于編寫對外提供的調(diào)用方法
var myJSObj = {
myAdd: function(arg1, arg2) {
alert('exec');
//6取!诬像!重要屋群!exec 是調(diào)用的核心方法,這里 exec 的五個參數(shù):
var ret = exec(
successCallback, // 成功回調(diào)函數(shù)
failureCallback, // 失敗回調(diào)函數(shù)
"MyPlugin2", // config.xml 中對應(yīng) feature 的 name
"doMyAdd", // iOS 中為調(diào)用的具體方法名坏挠,通過 runtime 執(zhí)行芍躏;Android中會執(zhí)行固定方法,但是會把這個值作為參數(shù)傳入降狠,原生 Android 代碼根據(jù)參數(shù)值來做區(qū)分執(zhí)行
[arg1, arg2] // 參數(shù)數(shù)組
);
alert('rrr ' + ret);
return ret;
},
vv: 'abc'
};
module.exports = myJSObj;
});
三对竣、插件配置文件 plugin.xml
插件配置文件,安裝時榜配,根據(jù)配置否纬,做相應(yīng)平臺的設(shè)置
-
header-file
、source-file
標(biāo)簽:插件原生代碼路徑蛋褥,用于將文件復(fù)制到各個工程原生代碼中 -
config-file
標(biāo)簽:用于指定配置文件 -
feature
標(biāo)簽:重要A偃肌!!用于指定各平臺插件的配置方案谬俄,安裝時柏靶,會把相應(yīng)平臺的配置,插入各個平臺的config.xml
溃论。插件負(fù)責(zé)橋接的 JS 中屎蜓,exec
的第三個參數(shù),就是feature
的name
钥勋,feature
中炬转,會指定插件加載的具體類 -
js-module
標(biāo)簽:指定平臺橋接 JS 的文件 -
clobbers
標(biāo)簽:指定平臺橋接 JS 中輸出的對象注入的全局變量。由于這個變量由 HTML 開發(fā)人員在各平臺統(tǒng)一調(diào)用算灸,所以該值盡量要在各平臺保持一致扼劈,這部分會被插入到cordova_plugins.js
中,格式如下:
/**
cordova_plugins.js
此文件由命令行根據(jù)配置文件自動生成菲驴,不用修改荐吵。
這里只做格式展示。
*/
cordova.define('cordova/plugin_list', function(require, exports, module) {
module.exports = [{
"file": "plugins/mytestplg/www/ttt.js", //js接口文件
"id": "mytestplg.ttt", //標(biāo)識
"pluginId": "mytestplg-ttt", //標(biāo)識
"clobbers": [
"ttt" //注入到瀏覽器中的變量名
]
}];
});
<!-- plugin.xml赊瞬,此文件需要插件開發(fā)時自行編寫先煎,與插件一起提供 -->
<?xml version="1.0" encoding="UTF-8"?>
<plugin id="mocha-plugin-demo" version="0.1.0" xmlns="http://apache.org/cordova/ns/plugins/1.0">
<name>Plugin Demo</name>
<author>Mocha</author>
<description>插件演示</description>
<license>MIT</license>
<keywords>cordova, javascript</keywords>
<repo/>
<issue/>
<!-- android -->
<platform name="android">
<source-file src="src/android/WebViewBack.java" target-dir="src/com/mochasoft/cordova/plugins/webback"/>
<config-file parent="/*" target="res/xml/config.xml">
<feature name="WebViewBack">
<param name="android-package" value="com.mochasoft.cordova.plugins.webback.WebViewBack"/>
</feature>
</config-file>
<js-module name="webviewback" src="www/android/goback.js">
<clobbers target="WebViewBack"/>
</js-module>
</platform>
<!-- ios -->
<platform name="ios">
<header-file src="src/ios/WebGoBack.h"/>
<source-file src="src/ios/WebGoBack.m"/>
<config-file parent="/*" target="config.xml">
<feature name="WebViewBack">
<param name="ios-package" value="WebGoBack"/>
<param name="onload" value="true"/>
</feature>
</config-file>
<js-module name="webviewback" src="www/ios/webviewback.js">
<clobbers target="WebViewBack"/>
</js-module>
</platform>
</plugin>
四、原生插件編寫(iOS)
插件的實現(xiàn)巧涧,繼承關(guān)系薯蝎,返回值方式
插件繼承自 CDVPlugin
/**
插件原生相關(guān)代碼
*/
// ========================== MyPlugin.h ==================================
@interface MyPlugin : CDVPlugin
- (void)myInvokeMethod:(CDVInvokedUrlCommand *)command; // 具體執(zhí)行的方法
@end
// ========================== MyPlugin.m ==================================
@interface MyPlugin ()
@end
@implementation MyPlugin
// 具體執(zhí)行方法的實現(xiàn)
- (void)myInvokeMethod:(CDVInvokedUrlCommand *)command {
// 通過command變量獲取參數(shù)方式:
id argument = [command argumentAtIndex:0 withDefault:@(50)];
//初始化用于保存結(jié)果的 Dictionary
NSMutableDictionary *result_dict = [NSMutableDictionary dictionary];
CDVPluginResult *pluginResult = nil;
if (執(zhí)行成功) {
// 配置成功時的 result_dict
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK
messageAsDictionary:result_dict];
}else {
NSString *errMsg = [self getErrorMsg:self.errCode];
// 配置失敗時的 result_dict
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR
messageAsDictionary:result_dict];
}
// 執(zhí)行回調(diào)
[self.commandDelegate sendPluginResult:pluginResult
callbackId:command.callbackId];
}
@end