自定义 Cordova插件详解
一、Cordova的基础点
在混合式应用中,我们通过现有的Cordova插件,可以轻松的在 H5 上调用手机native的功能。现有的Cordova插件能满足平时大部分的开发需求,然而,有时候找不到合适的插件、或对找到的插件有不满意的地方,那就要动手去做或改写一个插件,这时候就要了解一些Cordova插件的相关知识。
那Cordova插件的基础要点是什么呢?其实就是把原生代码调用方法映射为js的统一接口,供H5使用而已.
二、观察现有应用结构
打开任意一个基于Cordova技术的hybird app的开发目录,添加过平台(android、ios等)和安装过插件的话,你会发现结构大致是这样子的:
├── platforms
|    ├── android
|    ├── ios
|    └── ...
├── plugins
|    ├── org.apache.cordova.device
|    └── ...
├── config.xml
└── www
这里的 platforms 是我们应用支持的平台目录,plugins是我们安装的插件目录,config.xml 是应用的配置信息(应用名称、描述等),www 是我们的 web 工程目录。
也就是说,如果我们创建一个新的插件并安装,也会添加到plugins目录中,同时修改其它文件信息。那下一步就来开始进行验证。
三、使用plugman开发Cordova插件
一个独立插件的目录基本结构是这样的:
MyToast
├── src
|    ├── android
|    |    └── MyToast.java
|    ├── ios
|    └── ...
├── www
|    └── MyToast.js
└── plugin.xml
src存放的是各平台的原生代码,plugin.xml为插件描述及配置文件,www是web工程目录(其实主要就是MyToast.js这个js中间件),我们可以手动创建这几个目录及文件,然而这并不是一个好的方式,因为效率不高,推荐的方式是使用plumam。
1、首先安装plumam命令行工具
npm install -g plugman
2、安装完之后,创建plugin
使用plumam创建插件的命令是:
plugman create --name
pluginName--plugin_idpluginID--plugin_versionversion[--pathpath] [--variableNAME=VALUE]
参数说明:
pluginName:插件名称,如MyToast;
pluginID:插件id, 如:org.demo.mytoast;
version:版本号, 如:0.0.1;
path:插件存放的绝对或相对路径;
variable NAME=VALUE:扩展参数,如说明或作者,如woodstream
于是命令行中敲入以下代码:
plugman create --name MyToast --plugin_id org.demo.mytoast --plugin_version 0.0.1
这样将会在当前目录创建一个MyToast插件,进入插件目录,打开plugin.xml查看,注意以下内容及说明:
plugin
- id:插件唯一标识
- version:版本号
- js-module
    src:js中间件相对文件地址(www目录下的那个js)
    name:模块名称
    clobbers/merges
        target:H5通过它调用js中间件方法(ts调用方法的前缀)
- platform
    name:对应平台android | ios
    source-file
        src:类名
        tartget-dir:插件文件复制到到原生项目位置
        feature
             name:js中间件通过它调用原生方法(包名)
        uses-permission:相关原生权限
也就是说,我们可以写这样一个插件,不写一句原生代码,只是为了设置权限和拷贝文件。
等你消化完plugin.xml文件后,敲入命令进入插件目录:
cd MyToast
添加支持平台
plugman platform add --platform_name android
plugman platform add --platform_name ios
这样,就会分别创建src/android/MyToast.java和src/ios/MyToast.m两个文件,这里只演示android的代码,所以打开MyToast.java观察:
public class MyToast extends CordovaPlugin {
  @Override
  public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
    if (action.equals("coolMethod")) {
        String message = args.getString(0);
        this.coolMethod(message, callbackContext);
        return true;
    }
    return false;
  }
  private void coolMethod(String message, CallbackContext callbackContext) {
    if (message != null && message.length() > 0) {
        callbackContext.success(message);
    } else {
        callbackContext.error("Expected one non-empty string argument.");
    }
  }
}
其中execute是必须的方法,是和www目录中的MyToast.js关联打交道用的,至于MyToast.js和MyToast.java怎么关联,是由Cordova解释plugin.xml处理的,内部细节不需要知道,只需按方法格式编写即可。CallbackContext为回调上下文,coolMethod为可选的默认生成的示例方法,一般里面就写原生的代码,我们把它改成我们想要的:showToast,然后补充基本的一些原生代码,最后文件变成这样:
public class MyToast extends CordovaPlugin {
  @Override
  public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
    if (action.equals("showToast")) {
        String message = args.getString(0);
        this.showToast(message, callbackContext);
        return true;
    }
    return false;
  }
  private void showToast(String message, CallbackContext callbackContext) {
    if (message != null && message.length() > 0) {
        Activity activity = this.cordova.getActivity();
        Toast.makeText(activity, message, Toast.LENGTH_SHORT).show();
        callbackContext.success(message);
    } else {
        callbackContext.error("Expected one non-empty string argument.");
    }
  }
}
然后再打开www/MyToast.js修改如下:
  //showToast为安装后js调用的方法名,参数可以为任意多个
  exports.showToast = function(msg, success, error) {
      //"showToast"为给MyToast.java判断的action名
      exec(success, error, "MyToast", "showToast", [msg]);
  };
3、创建package.json文件
本来执行完上述步骤,一个插件就完成了的,但后来的Cordova版本要求添加一个package.json来管理插件,而plumam没有给我们创建这样一个文件,于是我们手动创建,借助npm init命令创建package.json。里面的参数从plugin.xml拿过来便是:
{
 "name": "MyToast",
  "version": "0.0.1",
  "description": "demo",
  "cordova": {
    "id": "com.demo.mytoast",
    "platforms": [
      "android"
    ]
  },
  "keywords": [],
  "author": "demo",
  "license": "MIT"
}
这样一个插件就开发完成了。
四、安装已开发完成的插件
如果没有现成的项目,可以创建一个新的Cordova项目来测试:
cordova create hello com.example.hello HelloWorld
注:
hello:项目文件夹名
com.example.hello:项目包名
HelloWorld:项目名
然后进入到该Cordova项目目录,像平常添加插件一样,运行如下命令:(add 后面为插件所在本地或网络路径):
cordova plugin add /Users/cordova/MyToast
如果已有项目,且是ionic项目,则命令前追加上ionic:
ionic cordova plugin add /Users/cordova/MyToast
在ionic2或以上使用时,打开任意一个ts文件,在头部声明如下:
declare let cordova: any;
然后调用即可(如果是普通js调用,则可以省掉上面那步):
cordova.plugins.MyToast.showToast("hello"); //后两个success, error参数省略不写
五、其他命令
删除插件:
ionic cordova plugin remove XXXXX(你的plugin_id)
查看已安装插件
ionic cordova plugin list
自定义 Cordova插件详解的更多相关文章
- 自定义Cordova插件详解
		
一.Cordova的基础点 在混合式应用中,我们通过现有的Cordova插件,可以轻松的在 H5 上调用手机native的功能.现有的Cordova插件能满足平时大部分的开发需求,然而,有时候找不到合 ...
 - Maven系列第6篇:生命周期和插件详解,此篇看过之后在maven的理解上可以超越同级别90%的人!
		
maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能. 这是maven系列第6篇. 整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部 ...
 - ThreeJS系列1_CinematicCameraJS插件详解
		
ThreeJS系列1_CinematicCameraJS插件详解 接着上篇 ThreeJS系列1_CinematicCameraJS插件介绍 看属性的来龙去脉 看方法作用 通过调整属性查看效果 总结 ...
 - Uploadify 上传文件插件详解
		
Uploadify 上传文件插件详解 Uploadify是JQuery的一个上传插件,实现的效果非常不错,带进度显示.不过官方提供的实例时php版本的,本文将详细介绍Uploadify在Aspnet中 ...
 - BaseAdapter自定义适配器——思路详解
		
BaseAdapter自定义适配器——思路详解 引言: Adapter用来把数据绑定到扩展了AdapterView类的视图组.系统自带了几个原生的Adapter. 由于原生的Adapter视图功能太少 ...
 - 自定义 Cordova插件(基础篇)
		
cordova自定义插件 注意:存放自定义cordova插件目录不能有空格可能会报错 cordova的安装 下载node.js,安装完成后你可以在命令行中使用node和npm. 安装cordova使用 ...
 - 自定义Cordova插件(基础篇)
		
cordova自定义插件 注意:存放自定义cordova插件目录不能有空格可能会报错 cordova的安装 下载node.js,安装完成后你可以在命令行中使用node和npm. 安装cordova使用 ...
 - Google自写插件详解
		
谷歌插件详解,跳转至个人主页查看. GoogleExtension
 - Android H5混合开发(2):自定义Cordova插件
		
前言 Cordova虽然定义了很多基础的插件,供H5端使用原生设备的功能. 但是,如果业务相关的功能,需要提供给H5端使用,那么,就需要我们自定义插件了. 这个"自定义"不是指由A ...
 
随机推荐
- MySQL SQL Explain输出学习
			
MySQL的explain命令语句提供了如何执行SQL语句的信息,解析SQL语句的执行计划并展示,explain支持select.delete.insert.replace和update等语句,也支持 ...
 - git 小轿车  开车了
			
1.2什么是版本库? 什么是版本库?版本库又名仓库,英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何时 ...
 - 集合 set
			
集合 集合属于可变数据类型,但它的内容必须是不可变数据类型. 特点:无序 , 不重复 有两种创建方式: set({1,2,3})和 {1,2,3} set1 = set({1,2,3,4}) s ...
 - 论文阅读(XiangBai——【CVPR2017】Detecting Oriented Text in Natural Images by Linking Segments)
			
XiangBai——[CVPR2017]Detecting Oriented Text in Natural Images by link Segments 目录 作者和相关链接 方法概括 方法细节 ...
 - 软件工程实践助教每周小结 < 福州大学 | 傅明建 >
			
第一周助教小结 1. 助教博客链接: http://www.cnblogs.com/sinceway/ 2. 本周点评的作业数量:约22份,有多次交互 3. 本周点评有困难的作业链接: https:/ ...
 - 【SparkStreaming学习之三】 SparkStreaming和kafka整合
			
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...
 - 关于 DotNetCore 的自定义权限管理
			
1.自定义权限需要扩展 Microsoft.AspNetCore.Authentication 实现一套接口 IAuthenticationHandler, IAuthenticationSignIn ...
 - vue.js国际化vue-i18n插件的使用问题,在模版文本、组件方法、jsf方法里的使用
			
vue.js国际化vue-i18n插件的使用问题,在模版文本.组件方法.jsf方法里的使用 1.在文本里使用{{$t("xxx")}} <span>{{$t(" ...
 - Rsync使用方法
			
Rsync是一款开源.快速.多功能.可实现全量及增量的本地或者远程数据同步的优秀工具.并且支持多系统平台运行.Rsync具有本地与远程两台主机之间的数据快速复制同步镜像.远程备份等功能,该功能类似sc ...
 - First Python script
			
learn what is api Jailbreak pycharm install requests on pycharm write first request: get, post MFA l ...