前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版

Cordova 结合 Vue 打包混合 App 从环境搭建到调用原生插件

首页2019-10-07 18:10:24Front-End
CordovaVue混合AppAndroid

手上有个跑得好好的 Vue 项目,产品突然说要上架应用商店。重写一套 React Native?没这个人力。学一遍 Ionic?那得连 Angular 一起学。这种时候 Cordova 是成本最低的一条路,它不要求你换框架,只是把你打包好的那堆 HTML、CSS、JS 塞进一个原生壳子里,再给你一座能从 JS 喊到原生的桥。

这篇是我当年把 Vue 项目用 Cordova 打成 App 的完整记录,从装环境、导 Android Studio(这一步的报错最多,占了小半篇幅),到装插件调相机定位,再到打包时那三处必改的路径配置。

在本篇文章中,我们将从浅入深,和大家一起学习以下知识:

  • Cordova、Ionic、React Native 这些打包方案各自适合什么场景
  • Android 和 iOS 两套环境分别要装什么,创建项目时包名为什么必须一次填对
  • 导入 Android Studio 最常见的五类报错,分别是什么原因、怎么解
  • Cordova 插件的安装、查看、卸载,以及调原生能力的固定套路
  • 把 Vue 打包产物塞进 Cordova 项目时,那三处不改就白屏的路径配置
  • 在 Vue 组件里调 cordova 插件的两种写法,以及为什么我不推荐用封装库
  • 这套技术栈今天的维护状态

# 一、先说清楚这套方案现在的状态

这篇写于 2019 年。Apache Cordova 现在已经不再活跃维护,项目退役进了 Apache Attic 归档状态,具体以 https://attic.apache.org/ 上的官方公告为准,我不猜时间点。

所以你要是现在开新项目,别照抄这一套。同样的思路(把 Web 产物塞进原生壳、通过桥调原生能力)现在的主流实现是 Capacitor,它是 Ionic 团队做的,API 设计和 Cordova 一脉相承,甚至兼容一部分 Cordova 插件,但原生工程是作为源码提交进仓库管理的,出问题能直接改,不像 Cordova 那样每次 prepare 都重新生成。

那这篇还留着干什么?因为存量项目还在跑,出问题得有地方查;更重要的是,下面第四节那一整段 Android Studio 报错排查、第七节那三处路径配置,换成 Capacitor 也照样会遇到,它们本来就不是 Cordova 独有的问题,是「Web 产物跑在 WebView 里」这件事本身带来的。

# 二、Cordova 是什么,和别的方案怎么选

我们可以使用cordova来打包现有的vue、react、angular应用为app,可以借助cordova来调用手机设备的原生能力,比如拍照、扫码、定位等

先把当年的几个选项摆开看。

# 2.1 Ionic 3 这条路

ionic3=cordova+angular+ionicUI(Ionic UI组件+ Javascript API+Ionic Native)

  • 优点:它提供了漂亮的UI组件库、强大的JS APi以及基于调用原生的的Native APi,可以让我们快速开发跨平台的混合APP以及移动web页面。(推荐*)
  • 缺点:angular react vue开发的移动端应用要打包成app的时候得重新再学习ionic

这个取舍写得挺实在。Ionic 给你的是一整套东西,UI 组件、导航、原生封装全包了,从零起一个 App 确实快。但代价是绑定 Angular(Ionic 3 时代是硬绑定),你原来那个 Vue 项目一行都用不上。Ionic 3 的完整用法我另外整理了一篇 混合 App 之 Ionic3 小结篇,想走这条路可以对着看。

# 2.2 Cordova 这条路

cordova: 可以把html css js写的代码打包成app,还可以让js调用原生的api。cordova非常成熟、插件也非常多、扩展性也强,10年的历史

Cordova 的定位比 Ionic 低一层,它不管你 UI 怎么写、路由怎么跳,只干两件事:把 Web 产物包成安装包,以及提供插件机制让 JS 能调原生。所以它跟框架无关,这正是它适合「已有项目要上架」这个场景的原因。

打包App有几个方案

  • ionic
  • reactNative
  • weex
  • flutter
  • cordova+vue
  • cordova+react
  • cordova+angular

这几个里,React Native 和 Flutter 是另一个路子,UI 走原生渲染,性能上限高,但要重写。Cordova 系的方案 UI 还是跑在 WebView 里,性能天花板受 WebView 限制,长列表和复杂动画会明显吃亏。选哪个说到底看你的 App 是「内容展示为主」还是「重交互」,前者用 Cordova 完全够,后者别硬上。

# 三、Android 环境搭建

搭 Android 环境要装四样东西:

  • 安装jdk 、配置jdk
  • 安装android studio
  • 安装nodejs
  • 安装cordova

前三样各自去官网装就行,没什么讲究,JDK 记得配 JAVA_HOME 环境变量。Cordova 走 npm:

## 淘宝源安装
npm install -g cordova --registry=https://registry.npm.taobao.org
@前端进阶之旅: 代码已经复制到剪贴板
cnpm install -g cordova
@前端进阶之旅: 代码已经复制到剪贴板

这两条是当年国内下载慢的应对办法,现在 npm 镜像地址已经换成 https://registry.npmmirror.com 了,taobao.org 那个域名早就停了,照抄会连不上。cnpm 我个人不推荐用来装这种全局 CLI,它做的是软链接式的安装,遇到需要读取自身目录结构的工具容易出怪问题,直接用 npm 配镜像更稳。

创建项目 cordova create 项目名称

cordova create 项目名 com.公司名.项目名 类名 (建议)

cordova create cordovademo02  com.baidu.cordova  Cordovademo	
@前端进阶之旅: 代码已经复制到剪贴板

三个参数分别是:本地目录名、应用包名、应用显示名。中间那个包名是重点。

创建项目的时候注意包名称:发布上线打包的时候用到包名称,注意

这句必须重视。包名(Android 那边叫 applicationId,iOS 那边叫 Bundle Identifier)是应用在商店里的唯一身份,上架之后就再也改不了了,改了等于是一个全新的应用,老用户不会收到更新。所以别图省事用 com.example.demo 一路跑到底,创建那一刻就填成正式的。

修改应用包名名称:

  • 修改config.xml里面的包名称
  • 修改完成以后重新执行cordova platform add android

如果一开始填错了,改法在 config.xml 根节点的 id 属性上。

在 config.xml 中修改 widget 的 id 属性即应用包名

改完这里还没完,必须把平台删掉重加。原因是 platforms/android 下的原生工程是根据 config.xml 生成出来的,包名会被写进 AndroidManifest.xml、build.gradle 和一堆 Java 包目录里,光改 config.xml 不重新生成,编出来的还是老包名。这个我踩过,改完直接 build,装到手机上发现新旧两个 App 并存,才反应过来。

cd 到项目里面 cd cordovademo02

  • 把android的平台添加到项目里面 cordova platform add android
  • 把项目导入到 android studio 进行运行调试 (或者运行 cordova run android)

导入的时候选 platforms 下的 android 目录,不是项目根目录。

在 Android Studio 中导入 platforms 下的 android 工程目录

这里得建立一个认知:platforms/ 目录是生成物,不是源码。你在 Android Studio 里直接改里面的文件,下次 cordova platform rm/add 或者某些 prepare 操作会把改动冲掉。真需要改原生配置,正确的位置是 config.xml 或者写 hooks 脚本。

# 四、导入 Android Studio 可能遇到的报错

这一节是当年花时间最多的地方。Cordova 生成的 Android 工程用的 Gradle 版本通常偏老,跟你本机装的 Android Studio 未必对得上,加上依赖要从境外仓库拉,各种报错就都来了。

1. 导入后提示 Android Studio Error:Connection timed out: connect

Android Studio 导入后提示 Connection timed out 的报错界面

这是最典型的一个,Gradle 要去 services.gradle.org 下载 wrapper、去 jcenter / maven 拉依赖,网络不通就卡在这。

解决方案参考: https://blog.csdn.net/u013020000/article/details/73159754

在 Gradle 设置中配置代理或改用本地 Gradle 发行版 配置完成后重新同步 Gradle 的界面

思路有两条:给 Gradle 配代理(gradle.properties 里写 systemProp.http.proxyHost 那几项),或者把 gradle-x.x-all.zip 手动下下来放到本地,再把 distributionUrl 改成本地路径。后一条更彻底,因为它连带解决了每次换项目都重新下一遍 wrapper 的问题。国内环境还有第三条路,把 build.gradle 里的仓库地址换成阿里云的 maven 镜像,依赖拉取速度会有质的变化。

2. 遇到错误 failed to find with hash string 'android-26'

提示 failed to find target with hash string android-26 的报错

解决方案点击 图上蓝色链接进行安装

这个报错友好得多,意思是工程要的 compileSdkVersion 是 26,而你本机 SDK Manager 里没装这个版本。报错信息里那条蓝色链接点下去 Android Studio 会自动帮你装,装完重新同步就好。

3. Gradle build 没有反应

Gradle build 长时间没有反应的界面 点击 build 按钮触发同步后的进度显示

解决方案 :点击build见图箭头。如果有下载内容 耐心等待 (30分钟-2小时)

「耐心等待 30 分钟到 2 小时」这句是实话,第一次 Gradle 同步要下的东西是真多。判断它到底是在下载还是卡死了,看 Android Studio 底部状态栏有没有进度条在动,或者去 ~/.gradle/caches 看目录大小是不是还在涨。都不动的话基本就是网络断了,回去看第 1 条。

4. 提示 please configure Android SDK

提示 please configure Android SDK 并给出蓝色 configure 链接

解决方案:点击蓝色 configure,然后选择对应的sdk (前提是sdk已经安装)

这条是工程没关联上 SDK 路径。点 configure 指过去就行,前提是 SDK 确实装了。顺手把 ANDROID_HOME(新版叫 ANDROID_SDK_ROOT)环境变量也配上,因为 cordova run android 走的是命令行,它读的是环境变量,不看 Android Studio 的设置。

5. 真机调试时手机连上没有反应

  • 关闭或者卸载自己电脑上面的360手机助手或者其他连手机的软件
  • 安装你手机对应的sdk

在 SDK Manager 中安装手机对应版本的 Android SDK

建议 android 5-到android8 sdk都安装 (安装sdk : Tools->SDK Manager)

那些手机助手会抢占 adb 端口,还会自己启一个版本不同的 adb 进程,两边打架的结果就是设备列表永远是空的。先把它们全关掉,然后跑一次 adb kill-server && adb devices 重启服务,多数情况就恢复了。

  • 点击右上角对应箭头按钮配置

查看当前连接上的手机

在 Android Studio 顶部设备下拉中确认已连接的手机

  • 手机必须开启调试模式(百度搜 xxx手机开启调试模式)
  • 手机拔下来重启android studio,重新插入手机重试
  • 百度搜(android studio 连不上手机…)
fe
  • 一、先说清楚这套方案现在的状态
  • 二、Cordova 是什么,和别的方案怎么选
    • 2.1 Ionic 3 这条路
    • 2.2 Cordova 这条路
  • 三、Android 环境搭建
  • 四、导入 Android Studio 可能遇到的报错
  • 五、iOS 平台搭建 Cordova 环境
  • 六、Cordova 插件的使用
  • 七、Cordova 打包 Vue 项目
  • 八、在 Vue 里调用 Cordova 插件
  • 总结
  • 参考

← ES6 系统复习 ES2015 ES2016 ES2017 ES2018 ES2019 特性全梳理Ionic 调用原生相机与 Cordova 插件命令实战 →