zoukankan      html  css  js  c++  java
  • phonegap 插件开法流程demo

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    <?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接口了:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <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内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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.
        }
     
    }
    1
    2
    3
    4
    //在插件内获取当前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的源代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    /********* 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


    本文来自转载,谢谢。

     
     
  • 相关阅读:
    Nginx作为反向代理时传递客户端IP的设置方法
    通过VNC远程连接Linux实例
    【Office-Word妙手回春】Word文本秒转表格
    如何在Windows7安装U盘中加入USB3.0驱动的支持
    关注mainfest.mf的说明
    netty cs 过高优化
    查看MySql使用的数据库引擎
    DispatcherServlet--研究spring mvc 处理 流程必读源码
    PostConstruct,PreDestroy 注解处理器类 InitDestroyAnnotationBeanPostProcessor
    @autoware 注解处理器
  • 原文地址:https://www.cnblogs.com/canghaixiaoyuer/p/4577063.html
Copyright © 2011-2022 走看看