Cordova插件开发(Android、iOS)

来源:互联网 发布:职人咖啡 知乎 编辑:程序博客网 时间:2024/05/17 00:55
首先,在任意目录下创建一个插件目录,本例目录名为com.anasit.callnative,然后在com.anasit.callnative目录下新建src、www两个目录,src中存放的是对应平台的插件代码,www存放的是插件的js代码,再新建一个plugin.xml文件,写入的是插件的相关配置信息,本例只开发了android和iOS两个平台,所以在src下再新建android和ios两个目录。

一、javascript部分

    代码:(callNative.js,存放于com.anasit.callnative/www)
    var exec = require('cordova/exec');
    var CallNative = {

        //调用Activity或Controller
        call:function(rtspUrl) {
            exec(
                function(echoValue){console.log("call CallNativePlugin success");},
                function(echoValue) {console.log("CallNativePlugin is not exist");},
                "CallNativePlugin",
                "play_rtsp",
                //在android平台中只是Action,在iOS中是实现类中的方法名
                [
                    "cn.kigsir.jpushdemo.PlayRTSPActivity",
                    rtspUrl
                ]
            );
        }
    }
    module.exports = CallNative;

    在使用时,先用script标签引入callNative.js,然后通过cordova.plugins.CallNativePlugin.call(rtspUrl);调用即可,html中的调用代码此处先不详述。

二、android native部分

    1、插件类的实现

        public class CallActivityPlugin extends CordovaPlugin {
            private final String ACTION_FLAG = "play_rtsp";//传入的action参照

            @Override
            public boolean execute(String action, final JSONArray args, final CallbackContext callbackContext) throws JSONException {
                if (ACTION_FLAG.equals(action)) {//action是javascript的exec()方法传入的第4个参数
                    try {
                        //此处是通过类名获取到目标Activity类,在javascript代码中传入,必须带完整包名
                        cordova.startActivityForResult(CallActivityPlugin.this, new Intent(cordova.getActivity(), Class.forName(args.getString(0))), 1);
                        callbackContext.success();//保证线程安全
                    } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    return true;
                }
                return false;
            }
        }
        类中使用到的包自行导入。

    2、新建一个目标Activity,并配置到清单文件中,然后把此Activity的完整路径(包名一定要完整)copy到callNative.js中相应的参数表(此例中是"cn.kigsir.jpushdemo.PlayRTSPActivity")。

三、iOS native部分

    1.插件类的实现

        头文件部分(CallNativePlugin.h):
            #import <Cordova/CDV.h>

            @interface CallNativePlugin : CDVPlugin

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

            @end

        具体实现部分(CallNativePlugin.m):
            #import "CallNativePlugin.h"
            #import <Cordova/CDV.h>
            #import "KxMovieViewController.h"

            @implementation CallNativePlugin

            - (void)play_rtsp:(CDVInvokedUrlCommand *)command{
                KxMovieViewController *vc = [KxMovieViewController movieViewControllerWithContentPath:[command.arguments objectAtIndex:1] parameters:nil];
                
                NSLog([command.arguments objectAtIndex:1]);
                [self.viewController presentViewController:vc animated:YES completion:nil];
            }

            @end

    2、新建自己的Controller作为跳转目标,取代上文中的KxMovieViewController即可。

    3、本项目使用ionic做UI,iOS原生使用KxMovie播放rtsp,在做移植的时候KxMovie在普通工程中可以直接使用,当移植到Cordova项目中却报了一大堆错,在死了许多脑细胞之后,终于解决了问题,在工程中导入了以下framework后编译通过,顺便在这提一下,希望可以帮到大家,具体framework如下:
        Accelerate.framework、
        OpenGLES.framework、
        AudioToolbox.framework、
        CoreVideo.framework

四、plugin.xml部分

    在插件根目录下我们创建的plugin.xml中写入以下代码

    <?xml version="1.0" encoding="UTF-8"?>

    <plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
        id="com.anasit.callNative"
        version="0.0.1">
        <name>CallNativePlugin</name>
        <description>Anasit Call Native Plugin</description>
        <license>Apache 2.0</license>
        <keywords>call native</keywords>
        <js-module name="CallNativePlugin" src="www/callNative.js">
            <!--target是调用插件的方法名前缀,完整调用见上文-->
            <clobbers target="cordova.plugins.CallNativePlugin"/>
        </js-module>

        <!-- android -->
        <platform name="android">
            <config-file target="res/xml/config.xml" parent="/*">
                <feature name="CallNativePlugin">
                    <param name="android-package" value="cn.kigsir.jpushdemo.plugins.CallActivityPlugin" />
                </feature>
            </config-file>
            <source-file src="src/android/CallActivityPlugin.java" target-dir="src/cn/kigsir/jpushdemo/plugins"/>
        </platform>

        <!-- ios -->
        <platform name="ios">
            <config-file target="config.xml" parent="/*">
                <feature name="CallNativePlugin">
                    <param name="ios-package" value="CallControllerPlugin" />
                </feature>
            </config-file>

            <header-file src="src/ios/CallControllerPlugin.h" />
            <source-file src="src/ios/CallControllerPlugin.m" />
        </platform>
    </plugin>

五、插件安装部分

    
    在项目根目录下打开命令行,输入cordova plugin add com.anasit.callNative(注:根据自己设置的路径写),按下回车后,插件就会自动安装到项目根目录下的plugins目录中。


注:本例所使用的cordova版本是5.3.3


By:BeanYon
2015.11.1
0 0
原创粉丝点击