- Cordova是一个混合开发打包工具,许多混合开发UI库都基于Cordova。将网页文件放到指定目录,运行一条命令,便可打包成Apk或webview。
需要安装打包工具cordova, andriod环境,java
- 安装cordova: npm install -g cordova
- 安装andriod studio下载地址
- 设置ANDROID_HOME为环境变量
- 把Android SDK's的tools, tools/bin, platform-tools添加到PATH中
- 打开Android studio,Tools->AVD Manager,新建一个虚拟安卓手机,以供调试
- 安装jdk下载地址
- 设置JAVA_HOME为环境变量
- 设置环境变量和PATH后需要重启电脑。
Cordova 文档
> Cordova是一个打包工具。能把前端的HTML, CSS, JS打包成APK或webview.打包成APK的话可直接安装使用。
- 先开发前端,在index.html中需添加
<script type="text/javascript" src="cordova.js">,
- 新建项目:cordova create hello com.example.hello HelloWorld
- 把网页的HTML, CSS, JS放到www文件夹中。
- cordova run android把文件打包成apk,如果打开了安卓虚拟机,会自动安装。cordova run android --device,打包并自动部署到手机上,手机需通过数据线连接电脑。
需要安卓同事看看此页文档教程。 文中称在/framework目录下生成jar,指nodes_modules下cordova-android的framework目录详见
- 安卓手机需在开发者选项中打开允许调试,并用数据线连接电脑,
- 在chrome://inspect中,可以看到手机和安卓虚拟机中打开的网页以及webview,点击inspect后调试
通过Cordova调用原生能力 文档
- 以查看电池为例
- 先安装插件 cordova plugin add cordova-plugin-battery-status
- 然后
window.addEventListener("batterystatus", onBatteryStatus, false);
function onBatteryStatus(status) {
console.log("Level: " + status.level + " isPlugged: " + status.isPlugged);
}
- 更多功能详见文档
- devicereadys事件。Cordova加载完成时触发,所以前端代码需要监听到此事件后调用
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
// Now safe to use device APIs
}
- pause事件。App进入后台时触发,通常表示用户切换到了其他程序。
- resume事件。表示进入后台的App又被打开了。
- 还有一些监听手机按钮的事件,点击阅读
- 采用SPA。
Cordova app需等待deviceReady事件。若不采用SPA,不仅需下载新文件,还得再次等待这个事件
- 用touch,不用click
为了与touch和touch hould事件区分开来,click会有300ms延迟
- 制作动画用transition,不要操作dom
- 移动端网络情况较差,多用本地存储,谨慎传递数据
深入阅读
- 妥善处理网络联通和断开的情况。而且NetWork connection API不靠谱。需发请求来判断网络是否畅通。
深入阅读:"Is This Thing On?"
开发前需要后台、IOS、安卓、前端要一起商量规划好的细节问题
- webview里通过Url Schema通知Native调用方法
- Native监听Url Schema的变化,兼容性好,不存在等待webview加载的问题
- webview里直接调用Native注入的方法
- 因为是注入的方法,有一个生命周期,可能会出现js代码已经都实例化完毕,而方法还没被注入的问题。
- Native跳H5
- H5跳Native
- H5跳H5(这里还要分内嵌的场景)
- H5新开Webview打开H5
header组件需用Native组件,因为:
- 其它主流容器都是这么做的,比如微信、手机百度、携程
- 没有header一旦网络出错出现白屏,APP将陷入假死状态,这是不可接受的,而一般的解决方案都太业务了
- 使用Native的Header组件,就是为了防止假死
- 通过检测网络情况,webview里js代码执行情况,给Header的后退按钮注册不同的方法,来避免假死。
- webview打开在线站点时,用ajax发请求
- webview打开本地网站时
- 调用native注入的方法发请求
- 使用url schema,native监测到url schema,然后发请求,并执行js的回调
- 为简化逻辑,请求需要都通过native发出
- 登陆和登出,也需要通过调用统一的组件。
- 给每个模块一个版本号
- app每次启动时军询问后台是否有更新
- 有更新则下载新的资源完成更新
- 可以封装一些非常通用的NativeUI以供调用
因为开发时宿主环境是浏览器,上线后是webview,静态资源的位置可能会变化
- 静态资源都读取线上资源,Native可拦截webview请求,实现一些缓存的逻辑。