什么是 Cordova 一个移动应用开发框架 本质是在 html,css,js 外面包装个原生的壳 出自于 Adobe 11 年收购的 PhoneGap,是驱动 PhoneGap 的核心引擎 是 apache 的顶级开源项目 Cordova 提供了一系列设备相关的 API, 通过这组 API,移动应用能够以 JavaScript 访问原生的设备功能, 如摄像麦克风等。
常见的移动端开发的三大分类 原生 App web App 混合 App (Hybrid App) cordova 的优缺点 优点:跨平台,便于移植,开发快速,成本低 缺点:执行速度相对原生会慢一些,一次编写,要处处调试 预装环境 下载并安装 Node.js 在安装时,您应该能够在命令行上调用节点和 npm。
nodejs 的安装 nodejs 官网:http://nodejs.cn/download/ 查看版本:
安装 Cordova CLI,下载并安装 Cordova 全局模块 查看版本:
安装 Java JDK 下载地址:https://www.oracle.com/java/technologies/javase-jdk14-downloads.html
查看版本:
1 2 java -version javac -version
创建第一个 APP 创建 App 1 cordova create [projectName] [packageName]
1 2 3 4 5 eg: cordova create hello com.example.hello HelloWorld hello:cordova目录名 com.example.hello: 包名 HelloWorld: 项目名(在config.xml中查看)
进入项目 添加平台 给你的 App 添加目标平台 1 2 3 cordova platform add ios --save cordova platform add android --save cordova platform add browser --save
检查你当前平台设置状况 1 2 3 4 5 6 7 8 Installed platforms: android 8.1.0 ios 5.1.1 Available platforms: browser ^6.0.0 electron ^1.0.0 osx ^5.0.0 windows ^7.0.0
移除 android 平台 1 cordova platform rm android
检查打包条件 编译 App,打包 app 测试 App,打包 cordova 项目到 Android/iOS 平台 1 2 3 Could not find an installed version of Gradle either in Android Studio, or on your system to install the gradle wrapper. Please include gradle in your path, or install Android Studio
安装 gradle 点击下载 gradle:https://gradle.org/releases/ 配置环境变量:系统变量–Path–编辑
指定模拟器 1 2 cordova emulate ios --target='iPhone-11' cordova emulate ios --target iPhone-6s
cordova 应用启动流程 Html 页面加载流程
原生代码启动 splashscreen load html 顺序执行 javascript => cordova.js 也执行 $(document).ready()执行,cordova 中的事件不一定可用 6.注册 deviceready 事件 插件 添加插件 1 cordova plugin add [plugin-full-name]
删除插件 1 cordova plugin rm [plugin-full-name]
查看已添加的插件 插件列表 插件 描述 cordova plugin add cordova-plugin-device 基本设备信息 cordova-plugin-device 基本设备信息 cordova-plugin-network-information 网络连接信息 cordova-plugin-battery-status 电池状态信息 cordova-plugin-device-motion 加速度信息 cordova-plugin-device-orientation 指南针信息 cordova-plugin-geolocation 定位数据 cordova-plugin-camera 相机 cordova-plugin-media-capture 媒体捕获 cordova-plugin-media 媒体播放器 cordova-plugin-file 访问文件 cordova-plugin-file-transfer 文件传递 cordova-plugin-dialogs 消息提示对话框 cordova-plugin-vibration 振动提醒 cordova-plugin-contacts 联系人 cordova-plugin-globalization 全球化 cordova-plugin-splashscreen 闪屏(启动画面) cordova-plugin-inappbrower 浏览器 cordova-plugin-console 控制台 cordova-plugin-statusbar 状态栏
手机电池状态 该插件可以用于监视设备电池的变化,全局提供了三个事件
安装电池插件 1 cordova plugin add cordova-plugin-battery-status
添加事件监听 1 2 3 4 5 document .addEventListener("deviceready" , function ( ) { window .addEventListener("batterystatus" , onBatterystatus, false ); window .addEventListener("batterycritical" , onBatterycritical, false ); window .addEventListener("batterylow" , onBatterylow, false ); });
回调函数性 事件 状态 batterystatus 表示电池状态发生改变(至少 1%电量变化) 或者 充电状态改变 触发 batterycritical 表示电池电量进入临界值,快关机了 batterylow 表示电池电量比较低,触发
1 2 3 4 5 6 7 8 9 10 11 function onBatterystatus (status ) { log("当前电量:Level: " + status.level + "是否充电中:isPlugged: " + status.isPlugged); } function onBatterycritical (status ) { log("当前电量已经进入临界值,当前电量:Level: " + status.level + "是否充电中: isPlugged: " + status.isPlugged); } function onBatterylow (status ) { log("当前电量已经比较低了,当前电量:Level: " + status.level + " isPlugged: " + status.isPlugged); }
每个事件都会返回一个 status 对象,有两个属性
level: 当前电量的百分比值,范围(0-100). (Number 数值类型) isPlugged: 标记当前手机是否在充电 (Boolean 类型) 照相机 该插件提供了一个全局对象 navigator.camera,提供了一系列的 api,这些 api,可以帮助我们拍照,或者从相册中读取图片 注意:需要在 deviceready 完成后,才能获取 navigator.camera 对象
安装照相机插件 1 cordova plugin add cordova-plugin-camera
添加事件监听 1 2 3 4 5 document .addEventListener("deviceready" , function ( ) { window .addEventListener("batterystatus" , function ( ) { console .log(navigator.camera); }); });
在 navigator.camera 对象中,提供了一个方法,getPicture(success, error, options);
getPicture 可以用于拍照 或者 从相册中读取图片
quality
:表示图片质量destinationType
:表示返回的图片格式(路径/base64 格式的字符串) 默认值:FILE_URL 返回文件路径sourceType
:设置使用摄像头还是从相册读取常用参数说明 Camera.DestinationType 参数名 描述 DATA_URL 返回 base64 编码的字符串。DATA URL 可能占用大量内存,并导致应用程序崩溃或内存不足错误。尽可能使用 FILE URI 或 NATIVE_URI FILE_URI 返回文件 uri(适用于 Android 的 content://media/external/images/media /2) NATIVE_URI 返回本地 uri(例如,iOS 的 asset-library://…)
Camera.PictureSourceType 参数名 描述 CAMERA 从图片库中选择图片(与 Android 的 SAVEDPHOTOALBUM 相同) PHOTOLIBRARY 配置图片源为相册 SAVEDPHOTOALBUM 从图片库中选择图像(与 Android 的 PHOTOLIBRARY 相同)(配置相机拍照保存的照片为相册)
Camera.Direction 参数名 描述 BACK 使用后置摄像头 FRONT 使用前置摄像头
示例 拍照–返回图片 url 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <button id ="btn1" > 点击拍照--返回图片url</button > <img style ="display: block; max-width: 100%;" alt ="" /> <script > var img = document .querySelector("img" ); document .addEventListener("deviceready" , function ( ) { document .getElementById("btn1" ).addEventListener("click" , function ( ) { navigator.camera.getPicture(success, error, { quality: 50 , destinationType: Camera.DestinationType.FILE_URL, sourceType: Camera.PictureSourceType.CAMERA }); function success (fileUrl ) { img.src = fileUrl; log("拍照成功" ); } function error ( ) { log("拍照失败" ); } }); }); </script >
拍照–返回 base64 编码的字符串 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <button id ="btn2" > 点击拍照--返回base64编码的字符串</button > <img style ="display: block; max-width: 100%;" alt ="" /> <script > var img = document .querySelector("img" ); document .addEventListener("deviceready" , function ( ) { document .getElementById("btn2" ).addEventListener("click" , function ( ) { navigator.camera.getPicture(success, error, { quality: 50 , destinationType: Camera.DestinationType.DATA_URL, sourceType: Camera.PictureSourceType.CAMERA }); function success (base64Str ) { img.src = "data:image/jpeg;base64," + base64Str; log("拍照成功" ); } function error ( ) { log("拍照失败" ); } }); }); </script >
从相册中获取图片,并显示在页面 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <button id ="btn3" > 从相册中获取图片</button > <img style ="display: block; max-width: 100%;" alt ="" /> <script > var img = document .querySelector("img" ); document .addEventListener("deviceready" , function ( ) { document .getElementById("btn2" ).addEventListener("click" , function ( ) { navigator.camera.getPicture(success, error, { quality: 50 , destinationType: Camera.DestinationType.FILE_URL, sourceType: Camera.PictureSourceType.PHOTOLIBRARY }); function success (fileurl ) { img.src = fileurl; log("从相册中读取成功" ); } function error ( ) { log("从相册中读取失败" ); } }); }); </script >
震动插件 该插件符合 W3C 振动规范http://www.w3.org/TR/vibration/ 该插件提供了一种振动设备的方法。 该插件定义了包括的全局对象 navigator.vibrate。 尽管是全局的方法,但直到 deviceready 事件发生后才可用。
安装震动插件 1 cordova plugin add cordova-plugin-vibration
添加事件监听 navigator.vibrate 有两种调用方式
navigator.vibrate(3000); 表示震动一次,震动 3s navigator.vibrate([3000, 1000, 3000, 1000]); 表示震动 3s,停顿 1s,再震动 3s,再停 1s 1 2 3 4 5 6 7 8 9 <button id ="vibrate1" > 点击震动3s</button > <script > document .addEventListener("deviceready" , function ( ) { document .getElementById("vibrate1" ).addEventListener("click" , function ( ) { navigator.vibrate(3000); }); }); </script >
1 2 3 4 5 6 7 8 <button id ="vibrate2" > 表示震动3s,停顿1s,再震动3s,再停1s</button > <script > document .addEventListener("deviceready" , function ( ) { document .getElementById("vibrate2" ).addEventListener("click" , function ( ) { navigator.vibrate([3000, 1000, 3000, 1000]); }); }); </script >
停止震动 让震动停止,给方法传 0 即可
navigator.vibrate(0);
navigator.vibrate([]);
1 2 3 4 5 6 7 8 <button id ="stopVibrate" > 停止震动</button > <script > document .addEventListener("deviceready" , function ( ) { document .getElementById("stopVibrate" ).addEventListener("click" , function ( ) { navigator.vibrate(0); }); }); </script >
使用 plugman 开发 Cordova 插件 首先安装 plumam 命令行工具 安装完之后,创建 plugin 1 plugman create --name pluginName --plugin_id pluginID --plugin_version version [--path path] [--variable NAME=VALUE]
参数说明 参数 描述 pluginName 插件名称,如 MyToast; pluginID 插件 id, 如:cordova-plugin-mytoast; version 版本号, 如:0.0.1; path 插件存放的绝对或相对路径; variable NAME=VALUE 扩展参数,如说明或作者,如 woodstream
1 eg : plugman create --name MyToast --plugin_id cordova-plugin-mytoast --plugin_version 0 .0 .1
从签名到发布流程 尽量不使用命令行发布,与 app 端沟通后完善 使用 ==android studio==
可以快捷生成签名文件
命令行生成 keystore cmd 进入项目里面 运行命令 1 cordova build --release android
会在 hello\platforms\android\build\outputs\apk 目录下生成一个 android-release-unsigned.apk(这是一个测试版本,要是想测试,无需下面步骤,可直接安装手机测试即可)
1 2 3 4 5 6 What went wrong: Execution failed for task ':app:lintVitalRelease'. > Could not resolve all files for configuration ':app:lintClassPath' . > Could not download groovy-all.jar (org.codehaus.groovy:groovy-all:2.4.15) > Could not get resource 'https://jcenter.bintray.com/org/codehaus/groovy/groovy-all/2.4.15/groovy-all-2.4.15.jar'. > Read timed out
解决方法:
1 2 3 4 5 6 7 进入目录:[path]\hello\platforms\android\app\build.gradle Android { lintOptions { checkReleaseBuilds false abortOnError false } }