cordova 自定义插件

cordova是一套跨平台的移动端框架,基于H5的同时又允许调用原生代码的特性使得开发和运行都能高效地运作。

官方:

A plugin is a package of injected code that allows the Cordova webview within which the app renders to communicate with the native platform on which it runs. Plugins provide access to device and platform functionality that is ordinarily unavailable to web-based apps.

简单地说插件是提供了webview访问原生平台的入口,cordova提供了一系列最常用的插件用于获取设备信息,访问通讯录、文件系统等。你也可以在插件搜索平台上找到你需要的插件 @插件库

有时候无论是官方提供还是插件库都没有满足你需要的插件,那么你可以尝试以下面的方式自定义个性化插件


Android

我通常使用Android Studio来开发插件,那么开发的前提就是把cordova集成到IDE中,可以参考《将cordova集成到Android studio的最佳方法》

或者可以尝试下面的方式让IDE具备最基本的自动补全功能

  • github上下载开发源码并解压
  • Android Studio下新建一个空的工程,将解压目录下的framework/src/org全部拷贝到工程目录下app/src/main目录下
  • 将cordova-js-src拷贝到WebIDE下(我用的是PhpStorm)

1.创建目录结构

在WebIDE根目录下我创建了一个目录cordoin,那么目录结构应该如下:(Cordoin是我自定义的名称)

cordoin
    ├── src     # 插件原生实现的源码目录
    |    ├── android
    |    |    └── Cordoin.java  # Android平台下实现类
    |    ├── ios
    |    └── ...
    ├── www
    |    └── Cordoin.js #   Javascript 调用接口
    └── plugin.xml      #   插件的清单文件

2.创建清单文件

以下面的plugin.xml为例

<?xml version="1.0" encoding="utf-8"?>
<plugin id="win.wshore.cordo.plugin" version="0.0.1" xmlns="http://apache.org/cordova/ns/plugins/1.0"
        xmlns:android="http://schemas.android.com/apk/res/android">
    <name>Cordoin</name>
    <author>Linzh</author>
    <description>This is a demo plugin for cordova</description>
    <js-module name="Cordoin" src="www/Cordoin.js">
        <clobbers target="Cordoin"/>
    </js-module>
    <platform name="android">
        <config-file parent="/*" target="res/xml/config.xml">
            <feature name="Cordoin">
                <param name="android-package" value="win.wshore.cordo.plugin.Cordoin"/>
            </feature>
        </config-file>
        <source-file src="src/android/Cordoin.java" target-dir="src/win/wshore/cordo/plugin"/>
    </platform>
</plugin>

plugin标签的id属性定义了插件的唯一标识符,那么以后就可以通过命令cordova plugin rm win.wshore.cordo.plugin删除这个插件,version定义了这个插件的版本号用于更新插件

plugin标签下的name,author和description分别定义了插件的名称,作者和插件描述

js-module标签定义了js接口的存放位置,name属性指的是这个功能模块的名称,src只想这个js接口的源码文件位置,clobbers属性表示访问对象的名称,这个对象可以直接通过窗口对象window调用

platform定义了对应平台的配置,如android下config-file表示将feature元素放到res/xml/config.xml文件中,source-file表示就爱嗯源码从src/android/Cordoin.java拷贝到src/win/wshore/cordo/plugin目录下

3.创建 JavaScript 接口

js接口决定了该插件的功能需求和调用方式,编辑Cordoin.js如下:

var exec = require('cordova/exec');
var CORDOIN_SERVICE = "Cordoin";
var CORDOIN_ACTION = "test";
/**
 * Cordoin.test方法
 * @param params {[]} 参数列表
 * @param success {function} 成功时回调
 * @param error {function}  错误时候回调
 */
exports.test = function (params, success, error) {
    exec(success, error, CORDOIN_SERVICE, CORDOIN_ACTION, params || []);
};

上面的代码表示为window.Cordoin对象创建test方法,CORDOIN_SERVICE表示之前加到res/xml/config.xml中的feature的名称,CORDOIN_ACTION表示操作名称

4.原生实现

先上示例代码如下:

package win.wshore.cordo.plugin;

import android.app.Activity;
import android.content.Intent;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;

public class Cordoin extends CordovaPlugin {
    @Override
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        if (action.equals("test")) {
            if (args.length() > 0) {
                String params = args.toString();
                callbackContext.success(params);
            } else {
                callbackContext.error("no params");
            }
            return true;
        }
        return false;
    }
}

参数说明:

  • action 表示这个操作的名称,对应于js接口中CORDOIN_ACTION变量
  • args 表示这个操作的参数列表,也就是js接口中的param参数
  • callbackContext 变量设置js接口的success和error的回调,通过原生的调用结果可以通过它返回给webview

原生实现的功能很简单,就是如果操作名称是"test"的时候,有参数时返回参数的json字符串,否则返回“no params”错误提示

到次为止Android平台的插件算是完毕了,但是还不能直接用,还需要创建package.json文件

进入到插件目录下执行命令

plugman createpackagejson ./

一路回车之后这个插件便可以使用了
因为插件的位置是在本地,所以可以通过绝对路径(或者相对路径)添加到cordova项目中

cd cordova_project && cordova plugin add /path-to-you-plugin-parent-dir/cordoin

看到下面的输出时可以说是安装成功了

Installing "win.wshore.cordo.plugin" for android
ANDROID_HOME=/home/mint/soft/sdk
JAVA_HOME=/home/mint/soft/jdk
Subproject Path: CordovaLib
The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.
        at build_dg1xzarrrmkc1xymj1x40eddf.run(/home/mint/workspace/wshore/cordo/platforms/android/build.gradle:138)
Incremental java compilation is an incubating feature.
:clean
:CordovaLib:clean

BUILD SUCCESSFUL

Total time: 1.507 secs
Adding win.wshore.cordo.plugin to package.json
Saved plugin info for "win.wshore.cordo.plugin" to config.xml

如果你修改了插件,那么可以通过删除+安装来使修改生效

页面调用demo:

<!DOCTYPE html>
<html>
<head>
    <meta name="format-detection" content="telephone=no">
    <meta name="msapplication-tap-highlight" content="no">
    <meta name="viewport"content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width">
</head>
<body>
<script src="cordova.js"></script>
<script>
    document.addEventListener('deviceready', function () {
        // 获取Cordoin对象
        var Cordoin = cordova.require('win.wshore.cordo.plugin.Cordoin');
        // 传递参数时弹出调用成功
        Cordoin.test(["hello world"], function (message) {
            alert("success:" + message);
        }, function (message) {});
        // 传递空参数时弹出调用失败
        Cordoin.test([], function (message) {[]}, function (message) {
            alert("failure:" + message);
        });
    });
</script>
</body>
</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,547评论 4 374
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,787评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,175评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,752评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,169评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,056评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,195评论 2 321
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,980评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,724评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,872评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,344评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,667评论 3 264
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,379评论 3 245
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,202评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,992评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,189评论 2 286
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,987评论 2 279

推荐阅读更多精彩内容