1️⃣、请选择一个你比较熟悉的 cordova 插件,介绍其功能、使用方式及运行原理。
插件:cordova-plugin-camera
功能:供照相机API与设备相机进行交互
调用示例和参数:
1 | navigator.camera.getPicture(cameraSuccess, cameraError, cameraOptions); |
Name | Type | Default | Description |
---|---|---|---|
quality | number |
50 |
图像的保存质量,范围0-100,100是最大值,最高的分辨率,没有任何压缩损失(请注意有关该相机的分辨率信息不可用。) |
destinationType | DestinationType |
FILE_URI |
选择返回值的格式 |
sourceType | PictureSourceType |
CAMERA |
获取图片的来 |
allowEdit | Boolean |
false |
允许在选择图片之前进行简单的编辑 |
encodingType | EncodingType |
JPEG |
选择图像的返回编码 |
targetWidth | number |
宽度像素用来缩放图像。必须和targetHeight一起使用。宽高比保持不变。 | |
targetHeight | number |
高度像素用来缩放图像。必须和targetWidth一起使用。宽高比保持不变 | |
mediaType | MediaType |
PICTURE |
选择media类型。它只适用PictureSourceType是PHOTOLIBRARY或SAVEDPHOTOALBUM |
correctOrientation | Boolean |
如果是横向拍摄的照片,会自动旋转到正确的方向 | |
saveToPhotoAlbum | Boolean |
设备拍照后的图像是否保存的图片库中 | |
popoverOptions | CameraPopoverOptions |
仅ios可用,设定在ipad的popover的位置 | |
cameraDirection | Direction |
BACK |
选择前置摄像头还是后置摄像头 |
以新建项目ionic1为例
1.新建项目
1 | sudo npm install -g cordova ionic |
2.安装ngCordova
(也可以忽略),这个其实就是多封装了一层promise的
1 | #安装ngCordova |
3.引入js文件,同时引入了cordova.js
4.注入
5.添加平台并且安装插件
1 | #添加平台 |
6.真机调试(调试前可以修改使用UIWebView还是WkWebView)
使用xcode安装到手机上,接着碰到一个问题导致调用插件的时候app直接闪退
解决方案:
7.在要使用插件的模块注入。
8.启动执行过程
1)前端加载 cordova.js
2)前端加载 cordova_plugins.js
3)通过 cordova_plugins.js
找到需要加载的 cordova
插件
4)通过动态创建 <script>
加载 cordova
插件
5)cordova
插件动态创建 iframe
或复写 prompt
方法调用
6)exec
-> iOSExec
-> pokeNative
7)原生层调用 nativeFetchMessages
获取调用参数
8)通过 cordova.callbackFromNative
获取原生回传的数据。
补充:
Cordova 内部自己实现了一个模块加载器,require 引入模块后,会根据 clobbers 字段配置的值,自动导出到指定的对象上。
2️⃣、请介绍一下开发 cordova 插件的主要流程和注意事项。
1.安装 plugman
1 | npm install -g plugman |
2.创建插件
1 | plugman create --name EchoPlugin --plugin_id com.joker.cordova --plugin_version 1.0.0 |
3.plugin.xml
内容
1 | <?xml version='1.0' encoding='utf-8'?> |
id
为plugman创建命令使用的–plugin_idversion
为创建命令使用的–plugin_version
4.添加android平台(插件)
1 | cd EchoPlugin/plugman platform add --platform_name android |
EchoPlugin为默认插件,该插件返回调用的字符串参数。EchoPlugin.java
为继承CordovaPlugin
插件的类,主要内容如下
1 | public class EchoPlugin extends CordovaPlugin { |
核心方法execute
执行JS的调用
接收参数:action
调用方法名,args
调用方法传递的参数callbackContext
异步回调函数,向JS返回执行结果
5.添加package.json
1 | { |
6.修改插件配置文件plugin.xml
1 | <?xml version='1.0' encoding='utf-8'?> |
3️⃣、 请选择一个你比较熟悉的 ionic-native 插件,介绍其功能、使用方式及运行原理。
Ionic Native是Cordova / PhoneGap插件的一个TypeScript包装器
1.安装@ionic-native/插件名
,和插件
1 | ionic cordova plugin add cordova-plugin-camera |
单纯的使用cordova plugin add …
安装了插件的话是不能引用到的,因为ts不能引用到js哦。
解决方式是:添加一个xx.d.ts文件即可。
什么是 “.d.ts”头文件?
简单一点讲,就是你可以在 ts 中调用的 js 的声明文件,它完全是个声明文件,没有任何实现代码,如何写.d.ts文件
2.在需要使用的地方的xxx.module.ts
的地方引入,就可以使用了
调用示例和参数:和第一题一样
4️⃣、请介绍一下开发 ionic-native 插件的主要流程和注意事项。
1.创建插件类
1 | () |
2.创建类元数据,我们需要指定一些关于插件的一些信息,如@Plugin装饰器来添加一些插件的信息
1 | ({ |
3.创建类方法,如getCurrentPosition方法
1 | () |
4.在platformModule中使用派生类注册provider,useClass使用对应平台的插件类
5.具体业务逻辑层import exe-插件名的派生类,依赖注入后使用
5️⃣、请分析一下 ionic-native 插件和 cordova 插件是如何协作的。
ionic-native插件:
1 | import { Injectable } from "@angular/core"; |
@Plugin:
在ionic-native/core/decorators.ts
下,其实是个方法调用,传入config
参数,然后为类添加静态方法,定义了一些方法。
1 | export function Plugin(config: PluginConfig): ClassDecorator { |
@Cordova:
会返回一个对象,里面有个方法调起对应的插件。
1 | export function Cordova(opts: CordovaOptions = {}) { |
wrap函数:
封装了返回的类型,根据装饰器方法参数,可返回promise,observable等类型函数,默认返回为promise。
1 | /** |
setIndex方法适配不同的cordova插件调用
1 | function setIndex(args: any[], |