文档章节

PhoneGap插件开发流程

crazymus
 crazymus
发布于 2015/02/12 15:23
字数 936
阅读 1411
收藏 12

首先需要创建一个plugin.xml,可以参考下面的模板,我做了详细的注释:

<?xml version="1.0" encoding="UTF-8"?>
    <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
    id="org.apache.cordova.device" version="0.2.3">
    <name>Device</name>
    <description>Cordova Device Plugin</description>
    <license>Apache 2.0</license>
    <keywords>cordova,device</keywords>
    <!--需要引入的JS文件-->
    <js-module src="www/device.js" name="device">
    <!--模块名称,requireJS使用-->
        <clobbers target="device" />
    </js-module>

    <!-- android -->
    <platform name="android">
        <!--需要引入到config.xml的内容-->
        <config-file target="res/xml/config.xml" parent="/*">
            <!--name表示Service名称,JS接口中将调用-->
            <feature name="JToast">
                <!--上面的Service名称对应的Java Class-->
                <param name="android-package" value="com.jiusem.plugins.window.JToast"/>
                <!--App启动时加载插件-->
                <param name="onload" value="true" />
            </feature>
        </config-file>
        <!--需要引入到AndroidManifest.xml中的内容,一般是开启一些权限-->
        <config-file target="AndroidManifest.xml" parent="/*">

        </config-file>
        <!--java文件路径-->
        <source-file src="src/android/JToast.java" />
    </platform>

    <!--iOS-->
    <platform name="ios">
        <!--需要插入到config.xml中的内容-->
        <config-file target="config.xml" parent="/*">
            <!--Sevice名称-->
            <feature name="Device">
                <!--Service名称对应的Objective-C Class-->
                <param name="ios-package" value="CDVDevice"/>
            </feature>
        </config-file>

        <!--iOS中需要引入的源文件-->
        <header-file src="src/ios/CDVDevice.h" />
        <source-file src="src/ios/CDVDevice.m" />
    </platform>
</plugin>
接下来可以编写JS接口了:
<script>
//JS文件写法示例

var JToast = {
    show: function(txt, success, error) {
        //该方法将调用JToast Service下的show action,并传递txt参数
        cordova.exec(success, error, "JToast", "show", [txt]);
    }
}
module.exports = JToast;

</script>


//cordova.exec方法详解
cordova.exec(function(winParam) {
    //调用成功的回调
},
function(error){
    //调用失败的回调
},
"service", //服务名
"action", //方法名
["firstArgument", "secondArgument", 42, false]);//以数组形式传递的参数

下面可以开始编写原生代码了,首先介绍Android部分
一个Android插件至少需要编写一个Java类继承CordovaPlugin类,并重写execute方法
插件是在第一次被调用时初始化,当然也可以配置在App启动时初始化,请参考上面的plugin.xml内容

package com.jiusem.plugins.window.JToast;

public class JToast extends CordovaPlugin{

    @Override
    public void initialize(CordovaInterface cordova, CordovaWebView webView) {
       super.initialize(cordova, webView);
        //初始化的业务逻辑,如果有的话,比如可以完成一些服务的注册
    }

    @Override
    //所有的JS调用都会由该方法进行处理
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        if ("beep".equals(action)) { 
            this.beep(args.getLong(0));
            callbackContext.success();//执行成功回调,该方法是用户在JS调用时传入
            return true; //记得返回值
        }
        return false;  // Returning false results in a "MethodNotFound" error.
    }

}
//在插件内获取当前Activity
Activity main = this.cordova.getActivity();
//文档内说该方法和上面的功能相同
Activity main = this.cordova.getContext();
插件并不会运行在webview的线程内,当然也可以实现让插件运行在webview的线程内
现阶段应该涉及不到这么深的内容,可以参考文档。

下面介绍iOS下原生代码的实现
一般来说,至少需要编写一个类继承自CDVPlugin并重写
同样在第一次调用时被初始化,也可以通过配置实现App启动时初始化
需要注意的是iOS下的WebView,标准名称为UIWebView
请看下面的代码示例
值得注意的是,iOS中没有类似于Android插件中的execute方法,方法是直接被调用的
如果需要在插件初始化时执行一些代码,可以重写pluginInitialize方法,
具体可以参见CDVPlugin.h与CDVPlugin.m的源代码

/********* Echo.h Cordova Plugin Header *******/

#import <Cordova/CDV.h>

@interface Echo : CDVPlugin

- (void)echo:(CDVInvokedUrlCommand*)command;

@end

/********* Echo.m Cordova Plugin Implementation *******/

#import "Echo.h"
#import <Cordova/CDV.h>

@implementation Echo

- (void)echo:(CDVInvokedUrlCommand*)command
{
CDVPluginResult* pluginResult = nil;
NSString* echo = [command.arguments objectAtIndex:0];

if (echo != nil && [echo length] > 0) {
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:echo];
} else {
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
}

[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}

@end



是不是瞬间凌乱,上面是Objective-C神一样的代码,它包含了两个文件Echo.h和Echo.m,前者是类的定义文件,

后者是实现文件。
好了,就介绍到这里,了解了这些内容,再去找一个现成的插件(越简单越好~),模仿着就可以编写自己的插件了。

© 著作权归作者所有

crazymus

crazymus

粉丝 71
博文 80
码字总数 111033
作品 8
武汉
后端工程师
私信 提问
使用The PhoneGap Developer App实现快速调试项目

如今,基于 PhoneGap 的混合 APP 开发技术更加成熟,优势更加凸显。移动互联网的迅猛发展,Android 和 iOS 的版本快速迭代,使 HTML5 的性能问题逐步解决。仅仅在 PhoneGap 官网上,已经有来...

crazymus
2015/04/26
1K
0
PhoneGap 1.0 发布,移动开发者的瑞士军刀

PhoneGap是由Nitobi推出的一个开源的HTML 5开发平台,可帮助开发者通过HTML、CSS和JavaScript开发本地移动应用。一次开发,然后部署到六大平台:iOS、Android、BlackBerry、webOS、bada和Sym...

红薯
2011/08/01
2.1K
5
PhoneGap 插件提交指南

过去的几个月里,Phonegap增加的新特性之一就是允许用户提交自己在使用Phonegap项目时的 Phonegap插件。一旦一个插件被提交并且被审核通过,它将可以被所有使用Phonegap项目的人使用。出于安...

oschina
2013/11/05
2.2K
7
PhoneGap 在 Android 上的插件开发方法介绍

简介: 移动应用开发已经成为软件开发的一个重要方向,但是移动开发面临的一个重要问题就是跨平台的问题。 PhoneGap 作为一个多平台的软件开发框架,提供了一次编写多个平台的运行。目前已经...

IBMdW
2012/04/27
2.9K
0
PhoneGap 插件简介

一、PhoneGap平台 前不久PhoneGap发布了1.0版本,这为移动开发大家族提供了又一个跨平台的解决方案。开发者只要有JavaScript、CSS3、Html5的基础就可以快速开发移动应用,并且一次开发支持i...

无鸯
2011/09/06
6.8K
2

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
4
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部