优势:
不足:
官网: https://cordova.apache.org/
中文镜像:http://cordova.axuer.com/
Github: https://github.com/apache/cordova
默认情况下,Web 应用不能使用移动端功能(例如:定位,蓝牙,摄像头等)。通过 Cordova,我们可以使用 Web 技术,实现应用,同时,支持移动端功能。
整体来说,Cordova 需要的环境是 Node.js + 平台( 例如:Android 和 iOS ) 。环境搭建主要包含如下
内容:
Node.js 的版本应大于等于 12 ,推荐安装 LTS 版本(去 Node.js 官网下载安装包)
安装之后,(为了提高下载速度)我们将 npm 镜像源,设置为淘宝的
1 # 修改 npm 的镜像源
2 npm config set registry https://registry.npm.taobao.org
3
4 # 验证是否更改成功(查看镜像源):
5 npm config get registry
Cordova 依赖 Git 命令行工具
如果未安装 Git for Windows,请先安装;
如果已安装 Git for Windows,请确保命令提示符或 PowerShell 中可运行 git 命令
简介
JDK(Java Development Kit)是 Java 开发套件的简称。Android 开发,需要安装 JDK。
下载
下载地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
请选择一个适合本地操作系统的安装包(操作系统+位数,例如:Windows x64) 。
下载时,提示需要登陆,我们可以先注册 Oracle 账户,登陆后再下载。
安装
下载完成后,双击安装包,开始安装(一直下一步就好,无需特殊配置)
设置 Java 环境变量
JAVA_HOME=C:\Program Files\Java\jdk1.8.0_
配置好 JAVA_HOME 后,可以再配置两个路径
检测安装结果
如果以下命令可以正常运行,则说明环境变量配置成功
1 java - version
2
3 javac
Android Studio (简称 AS)是安卓开发的编辑器和运行环境。使用之前,先下载。( 如已经安装,请略
过本节 )
下载地址:https://developer.android.com/studio/index.html
安装 Android SDK(可选)
正常来说,你可以忽略这一步。 因为 Android Studio 默认会安装最新版本的 Android SDK 。
打开 Android Studio,在菜单 Tools 下找到 “SDK Manager”
下载过程需要翻墙,下载安装内容很多,所以安装过程会很缓慢
Android SDK 是针对安卓开发的套件。
如果最新的 Android SDK 存在兼容性问题。这里你还可以单独安装,指定版本的 Android SDK。
在 SDK Manager 中选择"SDK Platforms"选项卡,然后,在右下⻆勾选"Show Package Details"。展
开指定版本(例如:Android 10 (Q))的选项,确保勾选了下面这些组件( 重申:你必须使用稳定的
翻墙工具,否则可能都看不到这个界面 ):
Android SDK Platform 29
Intel x86 Atom_64 System Image(官方模拟器镜像文件,使用非官方模拟器不需要安装此组
件)
然后 点击"SDK Tools"选项卡,同样勾中右下⻆的"Show Package Details" 。展开"Android SDK
Build-Tools"选项,确保选中了29.0.2版本。
点击 OK 执行下载(这个下载时间也比较⻓,同时确保翻墙工具稳定可用)
下载完成后,点击 Finish
设置 Android 环境变量
ANDROID_HOME=C:\Users\你的名字\AppData\Local\Android\Sdk
ANDROID_SDK_ROOT=C:\Users\你的名字\AppData\Local\Android\Sdk
总共有两个内容,组件大小约:113.0 MB,安装后占用空间约:451.9 MB
如果下载过程中断,请重复选中以上两个组件,再次下载
例如,我本地下载中断,报错:SSL peer shut down incorrectly(网络中断报错)
只需要重复选中所需组件,再次下载即可 。
1. 下载
下载地址:https://services.gradle.org/distributions/
下载版本:建议使用 gradle-6.5-all.zip (我之前下载的 6.8 说太高了,而后又切换到 6.5)
2. 解压
下载后解压,将加压包放到任意位置(例如,我本地是 D:\Program Files\gradle-6.5)
3. 绑定环境变量
D:\Program Files\gradle-6.5\bin
4. 检测安装结果
1 gradle - v
Mac 上的相同内容的安装这里省略
例如:Node.js、Git、JDK、Android SDK、Gradle 等
安装 Xcode
在 App Store 中安装即可。安装完成后,再安装 iOS 模拟器。
安装部署工具
1 npm install - g ios-sim
2 npm install - g ios-deploy
下载地址:https://code.visualstudio.com/
在 VS Code 中编辑 Cordova 代码,最好安装 Cordova Tools 插件
当前平台信息( 注意平台版本,例如,Android 是 9.0,将来安装模拟器时,也要安装对应的版本 )
1 npm install - g cordova
2
3 cordova - v
1 cordova create HelloCordova io.cordova.hellocordova CordovaApp
2 # HelloCordova 应用程序的目录名称。
3 # io.cordova.hellocordova 项目唯一标识(默认的反向域值)。一般是点连接的语法
4 # CordovaApp 应用的标题。
1 cd HelloCordova
2
3 # 浏览器
4 cordova platform add browser
5
6 # 安卓 添加 android 平台,并确保他们保存在了 config.xml 中
7 cordova platform add android --save
8
9 # 查看当前平台
10 cordova platform ls
1 Installed platforms:
2 android 9.0.
3 browser
4 Available platforms:
5 browser ^6.0.
6 electron ^1.0.
7 windows ^7.0.
模拟器安装截图
如果版本不兼容,后续运行 Cordova 时,模拟器可能无法启动。
1 # 浏览器端运行
2 cordova run browser
3
4 # 安卓端运行
5 cordova run android # 真机调试
6 cordova emulate android # 模拟器启动
hooks:钩子目录。每个Cordova 命令都可以定义 before 和 after 的 Hook,比如:before_build、
after_build
platforms:平台目录。例如 android、ios、browser 等
plugins:插件目录。安装的插件会放在这里
www:源代码目录。在执行 cordova prepare 的时候,源码会被 copy 到各个平台工程的 assets\www
目录下
config.xml:主配置文件,比如:项目使用了哪些插件、应用图标和启动⻚面
网⻚安全策略(CSP)的实质就是白名单,开发者明确告诉客户端,哪些外部资源可以加载和执行,哪些
不可以。
CSP 的主要目标是减少和报告 XSS 攻击。大大增强了网⻚的安全性。攻击者即使发现了漏洞,也没法
注入脚本
两种方法可以启用 CSP
选项名
script-src :外部脚本
style-src :样式表
img-src :图像
media-src :媒体文件(音频和视频)
font-src :字体文件
object-src :插件(比如 Flash)
child-src :框架
frame-ancestors :嵌入的外部资源(比如、
default-src
用来设置上面各个选项的默认值。
Content-Security-Policy: default-src 'self'
上面代码限制所有的外部资源,都只能从当前域名加载。
如果同时设置某个单项限制(比如 style-src)和 default-src,前者会覆盖后者 ,即字体文件会采用
style-src 的值,其他资源依然采用 default-src 的值。
选项值
多个值也可以并列,用空格分隔。
1 Content-Security-Policy: script-src 'self' https://apis.google.com
Content-Security-Policy-Report-Only 表示不执行限制选项,只是记录违反限制的行为。
telephone
主要作用是:是否设置自动将你的数字转化为拨号连接
telephone=no 禁止把数字转化为拨号链接
telephone=yes 开启把数字转化为拨号链接,默认开启
email
告诉设备不识别邮箱,点击之后不自动发送
email=no 禁止作为邮箱地址
email=yes 开启把文字默认为邮箱地址,默认情况开启
adress
adress=no 禁止跳转至地图
adress=yes 开启点击地址直接跳转至地图的功能, 默认开启
关闭 Windows 上的触碰高亮
视口:是用户网⻚的可视区域。
一些设备上浏览器默认的 viewport 大小
用法:
参数:
使网站支持多种模式(高亮模式、暗黑模式)。 当用户的系统主题更改后,网站样式随之更改。
如何实现:
1 body {
2 /* 默认为 light */
3 background-image:linear-gradient(to bottom, #A7A7A7 0%, #E4E
E4 51%);
4 }
5
6 @media screen and (prefers-color-scheme: dark) { /* 暗黑模式 */
7 body {
8 background-image:linear-gradient(to bottom, #585858 0%, #
1B1B1B 51%);
9 }
10 }
具体效果(以 Windows 为例)
高亮模式:
暗黑模式:
注意:并不是所有的浏览器都支持 color-scheme ,详情查看:https://www.caniuse.com/?search=color-scheme
在 [项目目录]/www/index.html 中引入的 cordova.js 不是当前目录下的。而是构建之后目录下的
这里以 browser 平台为例来解释(如果没有添加 browser 平台,请先添加)
运行 browser
cordova run browser
然后观察 [项目目录]/platform/browser/www/ 目录,如下:
此时,平台的构建目录下,就有 cordova.js 了
实际上,平台下 cordova.js 来自于 [项目目录]/platform/[平台名称]/platform_www/cordova.js 不同
平台下的 cordova.js 内容不同
Cordova 给我们提供了很多的事件。应用程序代码中可以添加这些事件的监听。
它是 Cordova 设备 API 准备好,并可以访问的信号。相当于 Web ⻚面中的 onload 事件。
其他后续事件,一般都写在 onDeviceReady 函数中
1 document.addEventListener('deviceready', onDeviceReady, false);
2
3 function onDeviceReady() {
4 // 设备就绪后的其他逻辑代码
5 }
1 function onDeviceReady() {
2 // 当前应用切换到后台时,触发 pause 事件
3 document.addEventListener('pause', function() {
4 alert('设备挂起');
5 })
6 }
1 function onDeviceReady() {
2 // 当前应用由后台切换到前台时,触发 resume 事件
3 document.addEventListener('resume', function() {
4 alert('设备重新回来');
5 })
6 }
1 function onDeviceReady() {
2 // 点击回退按钮时,触发 backbutton 事件
3 document.addEventListener('backbutton', function() {
4 alert('回退按钮');
5 })
6 }
1 function onDeviceReady() {
2 // 按下菜单按钮时,触发 menubutton 事件
3 document.addEventListener('menubutton', function() {
4 alert('按下菜单按钮');
5 })
6 }
更多详情:https://cordova.apache.org/docs/en/10.x/cordova/events/events.html
config.xml 是 Cordova 应用程序的全局配置文件。进行项目构建后,该文件会被复制到平台的子目录下。例如:
1 app/platforms/android/res/xml/config.xml
2 app/platforms/ios/AppName/config.xml
3 app/platforms/browser/config.xml
1
2
3 引用名称
4 应用描述
5 作者
6
7
8
9
10
11
12
13
14
15
16
17
18
19
上述配置是精简后的,不能直接用于项目
Widget 是 config.xml 文档的根元素。
1
2
8
9
name
指定应用程序的正式名称,因为它出现在设备的主屏幕上
1 HelloCordova
description
指定可在应用商店上市出现的元数据
1 A sample Apache Cordova application
author
指定可在应用商店上市出现的联系人信息。
1
author>
content
声明应用的起始⻚面,默认是 index.html,指代 www 目录下的 index.html
1
access
声明与应用程序通信的外部域名集合。
允许访问所有域名
1
允许访问指定域名
1
allow-navigation
声明 WebView 可以导航到哪些 URL
1
2
3
4
5
allow-intent
声明应用请求系统打开的 URL
1
2
3
4
engine
指定有关准备过程中要还原的平台的详细信息。
1
2
plugin
指定准备过程中要还原的插件的详细信息。
1
2
preference
偏好设置。设置各种 名/值 格式的属性。其中 名 大小写敏感。很多属性在特定平台下名称是唯一的。
1
2
3
4
5
更多详情: http://cordova.axuer.com/docs/zh-cn/latest/config_ref/index.html#preference
platform
1
2
3
4
hook
特定动作发生时,需要执行的自定义脚本
1
2
钩子详情:https://cordova.apache.org/docs/en/10.x/guide/appdev/hooks/index.html
更多详情:https://cordova.apache.org/docs/en/10.x/config_ref/index.html
1 cordova [options] -- [platformOpts]
1 cordova help
命令 描述
info 生成项目信息
requirements 检查并打印指定平台的所有安装需求
platform 管理项目平台
plugin 管理项目插件
prepare 将文件复制到平台目录下,准备构建
compile 为平台编辑项目
build 为平台构建项目 (prepare + compile)
clean 从构建工件中清除项目
run 运行项目 (包括 prepare 和 compile)
serve 通过本地服务器运行项目 (包括 prepare)
1 cordova create HelloCordova io.cordova.hellocordova CordovaApp
2 # HelloCordova 应用程序的目录名称。
3 # io.cordova.hellocordova 项目唯一标识(默认的反向域值)。一般是点连接的语法
4 # CordovaApp 应用的标题。
1 cordova install android // 将编译好的应用程序安装到模拟器上
2 cordova emulate android // 在模拟器上运行
3 cordova serve android // 在浏览器运行
4 cordova build android // 打包 Cordova 项目到 android 平台。
5 cordova run android // 通过 USB 直接安装到真机(这里已经包括了 build
命令)
这里以 管理平台 为例
cordova {platform | platforms} [
add [...] {--save | link= } |
{remove | rm} platform [...] |{list | ls} |check |
save ]
上述命令语法是官网给出的,可以拆分成如下命令
添加平台
1 cordova platform add android
删除平台
1 cordova platform remove android
2 # 或
3 cordova platform rm android
列出平台
1 cordova platform list
2 # 或
3 cordova platform ls
通估参数,可以限制命令的执行效果。例如:
1 # 安装插件,并将插件记录在 package.json 中 (默认)
2 cordova plugin add cordova-plugin-geolocation --save
3
4 # 只安装插件,不记录在 package.json 中
5 cordova plugin add cordova-plugin-geolocation --nosave
更多详情:https://cordova.apache.org/docs/en/10.x/reference/cordova-cli/index.html
cordova是一个注入代码包,允许Cordova webview在其中呈现的应用程序与运行它的本机平台进行通
信,提供基于web的应用程序与设备和平台功能的访问,所有主要的Cordova API功能都作为插件实
现,通俗点来说, cordova插件是连接web应用程序和设备平台之间的一个桥梁 。
安装
1 cordova plugin add cordova-plugin-battery-status
使用
安装
1 cordova plugin add cordova-plugin-camera
使用
安装
1 cordova plugin add cordova-plugin-contacts
使用
安装
1 cordova plugin add cordova-plugin-device
使用
安装
1 cordova plugin add cordova-plugin-dialogs
使用
安装
1 cordova plugin add cordova-plugin-file
使用
安装
1 cordova plugin add cordova-plugin-geolocation
使用
安装
1 cordova plugin add cordova-plugin-globalization
使用
安装
1 cordova plugin add cordova-plugin-network-information
使用
安装
1 cordova plugin add cordova-plugin-splashscreen
使用
安装
1 cordova plugin add cordova-plugin-inappbrowser
使用
安装
1 cordova plugin add cordova-plugin-qrscanner
使用
1 cordova plugin add cordova-plugin-barcodescanner
该插件用来获取设备信息,例如:操作系统,版本号
详情查看:https://www.npmjs.com/package/cordova-plugin-device
1 cordova plugin add cordova-plugin-device
1
1 document.getElementById("deviceInfo").addEventListener("click", de
viceInfo);
1 function deviceInfo() {
2 alert("Cordova version: " + device.cordova + "\n" +
3 "Device model: " + device.model + "\n" +
4 "Device platform: " + device.platform + "\n" +
5 "Device UUID: " + device.uuid + "\n" +
6 "Device version: " + device.version);
7 }
device.cordova:获取 Cordova 版本
device.model:获取设备模型(包含制造商等相关信息)
device.platform:获取设备操作系统名称
device.uuid:获取设备唯一 ID
device.version:获取操作系统版本
device.manufacturer:获取设备制造商
device.isVirtual:判断是否运行在模拟器上
device.serial:获取设备的硬件号码
该插件用来指定导航中的白名单策略
详情查看:https://www.npmjs.com/package/cordova-plugin-whitelist
1 cordova plugin add cordova-plugin-whitelist
一般来说,Cordova 项目初始化时,会自动安装该插件
白名单用来配置域名的访问规则。一般来说,有两个地方可以配置
该插件允许在 Cordova 应用内部打开 Web 地址(例如:播放视频,查看文章等)。而不用跳出当前
App。
详情参考:https://www.npmjs.com/package/cordova-plugin-inappbrowser
1 cordova plugin add cordova-plugin-inappbrowser
1
1 document.getElementById("goBaidu").addEventListener("click", openB
aidu);
1 function openBaidu() {
2 var url = 'https://m.baidu.com'; // 跳转地址
3 var target = '_blank'; // 打开方式 _blank 新⻚面, _self 当前⻚, _s
ystem 系统浏览器中打开
4 var options = "location=yes" // 是否显示地址栏
5 var ref = cordova.InAppBrowser.open(url, target, options);
6
7 ref.addEventListener('loadstart', loadstartCallback);
8 ref.addEventListener('loadstop', loadstopCallback);
9 ref.addEventListener('loaderror', loaderrorCallback);10 ref.addEventListener('exit', exitCallback);
11
12 function loadstartCallback(event) {
13 alert('Loading started: ' + event.url)
14 }
15
16 function loadstopCallback(event) {
17 alert('Loading finished: ' + event.url)
18 }
19
20 function loaderrorCallback(error) {
21 alert('Loading error: ' + error.message)
22 }
23
24 function exitCallback() {
25 alert('Browser is closed...')
26 }
27 }
跳转语法:cordova.InAppBrowser.open(url, target, options);也可以将其挂到 window 对象上:window.open = cordova.InAppBrowser.open;
该插件允许使用摄像头拍照,或在相册中选取图片。
详情查看:https://www.npmjs.com/package/cordova-plugin-camera
1 cordova plugin add cordova-plugin-camera
按钮:负责触发事件
图像:用来展示图片
1
2
3
1 // 拍照
2 document.getElementById("takePic").addEventListener("click", takeP
ic);
3
4 // 从相册中选取
5 document.getElementById("getPic").addEventListener("click", getPic
);
1 const takePic = () => {
2 navigator.camera.getPicture(onSuccess, onFail, {3 quality: 50 ,
4 destinationType: Camera.DestinationType.FILE_URI
5 });
6
7 function onSuccess(imageURI) {
8 var image = document.getElementById('myImage');
9 image.src = imageURI;
10 }
11
12 function onFail(message) {
13 alert('Failed because: ' + message);
14 }
15 }
语法:camera.getPicture(successCallback, errorCallback, options)
1 const getPic = () => {
2 // alert('相册')
3 navigator.camera.getPicture(onSuccess, onFail, {
4 quality: 50 ,
5 destinationType: Camera.DestinationType.FILE_URI,
6 sourceType: Camera.PictureSourceType.PHOTOLIBRARY
7 });
8
9 function onSuccess(imageURL) {
10 var image = document.getElementById('myImage');
11 image.src = imageURL;
12 }
13
14 function onFail(message) {
15 alert('Failed because: ' + message);
16 }
17 }
该插件可以执行扫码功能
详情查看:https://www.npmjs.com/package/cordova-plugin-qrscanner
1 cordova plugin add cordova-plugin-qrscanner
1 var done = function(err, status){
2 if(err){
3 console.error(err._message);
4 } else {
5 console.log('QRScanner 初始化. 状态:');
6 console.log(status);
7 }
8 };
9
10 QRScanner.prepare(done);
1 var callback = function(err, contents) {
2 if(err){
3 console.error(err._message);
4 }
5 alert('扫描内容: ' + contents);
6 };
7 QRScanner.scan(callback);
1 QRScanner.cancelScan(function(status) {
2 console.log(status);
3 });
1 QRScanner.show(function(status) {
2 console.log(status);
3 });
4 QRScanner.hide(function(status) {
5 console.log(status);
6 });
1 QRScanner.enableLight(function(err, status) {
2 err && console.error(err);
3 console.log(status);
4 });
5 QRScanner.disableLight(function(err, status) {
6 err && console.error(err);
7 console.log(status);
8 });
1 QRScanner.useFrontCamera(function(err, status) {
2 err && console.error(err);
3 console.log(status);
4 });
5 QRScanner.useBackCamera(function(err, status) {
6 err && console.error(err);7 console.log(status);
8 });
1 QRScanner.destroy(function(status) {
2 console.log(status);
3 });
该插件可以获取位置信息(经纬度)
详情查看:https://www.npmjs.com/package/cordova-plugin-geolocation
1 cordova plugin add cordova-plugin-geolocation
1
2
也可以在⻚面加载时(例如:onload 或 deviceready),直接调用位置插件。
1 document.getElementById("getPosition").addEventListener("click", g
etPosition);
2 document.getElementById("watchPosition").addEventListener("click",
watchPosition);
1 function getPosition() {
2 var options = {
3 enableHighAccuracy: true, // 启用高精度
4 maximumAge: 3600000 // 最大请求时间(单位:毫秒)
5 }
6
7 var watchID = navigator.geolocation.getCurrentPosition(onSuccess, onError, options);
8
9 function onSuccess(position) {
10 alert('Latitude: ' + position.coords.latitude
+ '\n' + // 纬度
11 'Longitude: ' + position.coords.longitude
+ '\n' + // 经度
12 'Altitude: ' + position.coords.altitude
+ '\n' + // 高度
13 'Accuracy: ' + position.coords.accuracy
+ '\n' + // 精确度
14 'Altitude Accuracy: ' + position.coords.altitudeAccura
cy + '\n' + // 高度精确度
15 'Heading: ' + position.coords.heading
+ '\n' + // 方向
16 'Speed: ' + position.coords.speed
+ '\n' + // 速度
17 'Timestamp: ' + position.timestamp
+ '\n'); // 获取时间戳
18 };
19
20 function onError(error) {
21 // alert('code: ' + error.code + '\n' + 'message: ' +
error.message + '\n');
22 switch(error.code) {
23 case error.PERMISSION_DENIED:
24 alert("定位失败,用户拒绝请求地理定位");
25 break;
26 case error.POSITION_UNAVAILABLE:
27 alert("定位失败,位置信息是不可用");
28 break;
29 case error.TIMEOUT:
30 alert("定位失败,请求获取用户位置超时");
31 break;
32 case error.UNKNOWN_ERROR:
33 alert("定位失败,定位系统失效");
34 break;
35 }
36 }
37 }
1 function watchPosition() {
2 var options = {
3 maximumAge: 3600000 ,
4 timeout: 3000 ,
5 enableHighAccuracy: true,
6 }
7
8 var watchID = navigator.geolocation.watchPosition(onSuccess, o
nError, options);
9
10 function onSuccess(position) {
11 alert('Latitude: ' + position.coords.latitude
+ '\n' +
12 'Longitude: ' + position.coords.longitude
+ '\n' +
13 'Altitude: ' + position.coords.altitude
+ '\n' +
14 'Accuracy: ' + position.coords.accuracy
+ '\n' +
15 'Altitude Accuracy: ' + position.coords.altitudeAccura
cy + '\n' +
16 'Heading: ' + position.coords.heading
+ '\n' +
17 'Speed: ' + position.coords.speed
+ '\n' +
18 'Timestamp: ' + position.timestamp
+ '\n');
19 };
20
21 function onError(error) {
22 alert('code: ' + error.code + '\n' +'message: ' + error.mes
sage + '\n');
23 }
24 }
1 var watchID = navigator.geolocation.watchPosition(onSuccess, onErr
or, { enableHighAccuracy: true });
2
3 // ...later on...
4
5 navigator.geolocation.clearWatch(watchID);
该插件可以获取全球化信息,包括:语言,日期和时区,货币等。
详情查看:https://www.npmjs.com/package/cordova-plugin-globalization
1 cordova plugin add cordova-plugin-globalization
1
2
3
4
1 document.getElementById("getLanguage").addEventListener("click", g
etLanguage);
2 document.getElementById("getLocaleName").addEventListener("click",
getLocaleName);
3 document.getElementById("getDate").addEventListener("click", getDa
te);
4 document.getElementById("getCurrency").addEventListener("click", g
etCurrency);
1 function getLanguage() {
2 navigator.globalization.getPreferredLanguage(onSuccess, onError);
3
4 function onSuccess(language) {
5 // zh-CN | en-US
6 alert('language: ' + language.value + '\n');
7 }
8
9 function onError(){
10 alert('Error getting language');
11 }
12 }
1 function getLocaleName() {
2 navigator.globalization.getLocaleName(onSuccess, onError);
3
4 function onSuccess(locale) {
5 // en-US
6 alert('locale: ' + locale.value);
7 }
8
9 function onError(){
10 alert('Error getting locale');
11 }
12 }
1 function getDate() {
2 var date = new Date();
3
4 var options = {
5 formatLength:'short',
6 selector:'date and time'
7 }
89 navigator.globalization.dateToString(date, onSuccess, onError,
options);
10
11 function onSuccess(date) {
12 // 12/4/2021 6:46 PM
13 alert('date: ' + date.value);
14 }
15
16 function onError(){
17 alert('Error getting dateString');
18 }
19 }
1 function getCurrency() {
2 var currencyCode = 'EUR';
3 navigator.globalization.getCurrencyPattern(currencyCode, onSucc
ess, onError);
4
5 function onSuccess(pattern) {
6 alert('pattern: ' + pattern.pattern + '\n' +
7 'code: ' + pattern.code + '\n' +
8 'fraction: ' + pattern.fraction + '\n' +
9 'rounding: ' + pattern.rounding + '\n' +
10 'decimal: ' + pattern.decimal + '\n' +
11 'grouping: ' + pattern.grouping);
12 }
13
14 function onError(){
15 alert('Error getting pattern');
16 }
17 }
该插件可以设置 App 的启动⻚面和图标
打开项目目录下的 config.xml,在 widget 中添加配置项
详情查看:https://www.npmjs.com/package/cordova-plugin-splashscreen
1 cordova plugin add cordova-plugin-splashscreen
打开项目目录下的 config.xml,在 widget 中添加配置项
1
2
3
4
5
6
7
8
9
10
11
12
13 14
15
16
17
18
19
图标可以针对不同尺寸的屏幕生成。生成网站:https://icon.wuruihong.com/
因为 splash 图片的生成收费,因此,我这里用了同一张图片
另外,还可以通过 land 和 port 前缀指定横屏和竖屏的 splash
详情查看 扩展知识
1
2
3
4
5
密度为每平方英寸(inch)中的像素(px)数,常用 dpi (Dots Per Inch - 每英寸点数)来表示。
ldpi 低密度
mdpi 中等密度
hdpi 高密度
该插件可以获取本地网络信息。
详情查看:https://www.npmjs.com/package/cordova-plugin-globalization
1 cordova plugin add cordova-plugin-network-information
1
1 document.getElementById("networkInfo").addEventListener("click", n
etworkInfo);
2 document.addEventListener("offline", onOffline, false);
3 document.addEventListener("online", onOnline, false);
1 function networkInfo() {
2 var networkState = navigator.connection.type;
3 var states = {};
4
5 states[Connection.UNKNOWN] = 'Unknown connection';
6 states[Connection.ETHERNET] = 'Ethernet connection';
7 states[Connection.WIFI] = 'WiFi connection';
8 states[Connection.CELL_2G] = 'Cell 2G connection';9 states[Connection.CELL_3G] = 'Cell 3G connection';
10 states[Connection.CELL_4G] = 'Cell 4G connection';
11 states[Connection.CELL] = 'Cell generic connection';
12 states[Connection.NONE] = 'No network connection';
13
14 alert('Connection type: ' + states[networkState]);
15 }
16
17 function onOffline() {
18 alert('网络掉线!');
19 }
20
21 function onOnline() {
22 alert('网络在线!');
23 }
该插件用于获取终端电池的状态
详情查看:https://www.npmjs.com/package/cordova-plugin-battery-status
1 cordova plugin add cordova-plugin-battery-status
1 window.addEventListener("batterystatus", onBatteryStatus, false);
1 function onBatteryStatus(info) {
2 alert("BATTERY STATUS: Level: " + info.level + " isPlugged: "+ info.isPlugged);
3 }
插件除了 batterystatus 事件之外,还有两个事件。这些事件的使用方式与 batterystatus 事件相同。
该插件用来设置终端顶部状态条
详情查看:https://www.npmjs.com/package/cordova-plugin-statusbar
1 cordova plugin add cordova-plugin-statusbar
1
2
3
4
5
6
7
8
9
10
11
1 // 是否覆盖 WebView
2 StatusBar.overlaysWebView(true);
3
4 // 使用默认样式(黑色文字,白色背景)
5 StatusBar.styleDefault();
6
7 // 使用高亮样式(白色文字,黑色背景)8 StatusBar.styleLightContent();
9
10 // 黑色半透明样式
11 StatusBar.styleBlackTranslucent();
12
13 // 黑色不透明样式
14 StatusBar.styleBlackOpaque();
15
16 // 通过颜色单词设置背景色,
17 // 支持的颜色由:
18 // black, darkGray, lightGray, white, gray, red, green,
19 // blue, cyan, yellow, magenta, orange, purple, brown
20 StatusBar.backgroundColorByName("red");
21
22 // 通过十六进制声明背景颜色
23 StatusBar.backgroundColorByHexString("#C0C0C0");
24
25 // 隐藏状态栏
26 StatusBar.hide();
27
28 // 显示状态栏
29 StatusBar.show();
30
31 // 判断状态栏是否可⻅
32 StatusBar.isVisible
33
34 // 状态栏是否被触碰(该事件只支持 iOS 平台)
35 window.addEventListener('statusTap', function() {
36 // scroll-up with document.body.scrollTop = 0; or do whatever
you want
37 });
本节实现自定义 Cordova 插件
1 npm install -g plugman
Cordova 通过 Plugman 来创建插件
注意:存放插件的目录,不能有中文和空格等特殊符号。例如:我先创建一个目录 cordovaplugin,然后
cd 进入
1 plugman create --name [插件名] --plugin_id [插件id] --plugin_
version [插件版本]
2 plugman create --name MyToast --plugin_id me.cliu.mytoast --plugin
_version 1 .0.0
3
4 cd MyToast
插件名:建议使用大驼峰
插件 id:建议使用 Java 包的命名方式,例如:me.cliu.mytoast
插件版本:三级写法 1.0.0
生成插件的目录结构:
1 MyToast
2 ├── src 平台源码
3 ├── www 原生 JS
4 │ └── MyToast.js
5 └── plugin.xml 插件配置文件
初始的 MyToast.js 代码
1 var exec = require('cordova/exec');
2
3 exports.coolMethod = function (arg0, success, error) {
4 exec(success, error, 'MyToast', 'coolMethod', [arg0]);
5 };
初始的 plugin.xml 代码
1
2
8 MyToast
9
10
11
12
进入插件目录之后(cd MyToast),我们添加插件支持的平台
1 plugman platform add --platform_name android # 安卓平台支持
2 plugman platform add --platform_name ios # iOS 平台支持(不支持
可以不添加)
添加完平台后,插件src下会多出两个目录
1 MyToast
2 ├── src
3 ├──── android # 安卓平台支持
4 │ └── MyToast.java
5 ├──── ios # iOS 平台支持
6 │ └── MyToast.m
7 ├── www
8 │ └── MyToast.js
9 └── plugin.xml
如果没有调整的内容,则不需要编辑
1 package me.cliu.mytoast;
2
3 import org.apache.cordova.CordovaPlugin;
4 import org.apache.cordova.CallbackContext;
5
6 import org.json.JSONArray;
7 import org.json.JSONException;
8 import org.json.JSONObject;
9
10 /**
11 * This class echoes a string called from JavaScript.12 */
13 public class MyToast extends CordovaPlugin {
14
15 @Override
16 public boolean execute(String action, JSONArray args, Callbac
kContext callbackContext) throws JSONException {
17 if (action.equals("coolMethod")) {
18 String message = args.getString( 0 );
19 this.coolMethod(message, callbackContext);
20 return true;
21 }
22 return false;
23 }
24
25 private void coolMethod(String message, CallbackContext callb
ackContext) {
26 if (message != null && message.length() > 0 ) {
27 callbackContext.success(message);
28 } else {
29 callbackContext.error("Expected one non-empty string
argument.");
30 }
31 }
32 }
此时,我们再来看一下 www/MyToast.js
1 var exec = require('cordova/exec');
2
3 exports.coolMethod = function (arg0, success, error) {
4 exec(success, error, 'MyToast', 'coolMethod', [arg0]);
5 // 执行(成功, 失败, 类名, 方法名, 参数);
6 };
此时,我们可以调整代码内容。例如:方法名可以自定义
但是 www/MyToast.js 中的类名和方法名,需要与 src/android/MyToast.java 中保持一致
目的:熟悉 plugin.xml 中各个配置项的含义
1
2
8 MyToast
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
29
33
34
进入到插件目录,然后运行
在 [项目目录]/www/index.html 中添加如下一行
1 var exec = require('cordova/exec');
2
3 // MyToast: 是 plugin.xml 文件中的 feature 标签 name 属性
4 // coolMethod:是 js 中调用的方法名
5 // [arg0]: 表示一个参数,[arg0, arg1]:表示两个参数
6 exports.coolMethod = function (arg0, success, error) {
7 exec(success, error, 'MyToast', 'coolMethod', [arg0]);
8 };
1 cd MyToast
2 npm init
3
4 # 或
5 plugman createpackagejson [插件路径]
根据提示一路向下,最终会在插件目录下生成 package.json
1 cd [Cordova项目目录]
2 cordova plugin add [插件路径]
3
4 // 我本地
5 cordova plugin add D:\cliu\HelloCordova\MyToast
1
在 [项目目录]/www/js/index.js 中添加如下内容
1 function onDeviceReady() {
2 // ....
3
4 // 添加这一行
5 document.getElementById("toast").addEventListener("click", ca
llMyToast);
6 }
7
8 // 调用自定插件
9 function callMyToast() {
10 cordova.plugins.MyToast.coolMethod('Hello', toastSuccess, toa
stFail);
11
12 function toastSuccess(msg) {
13 alert('toast success'+msg)
14 }
15 function toastFail() {
16 alert('toast fail')
17 }
18 }
现在,我们已经掌握 Cordova 的基本内容了。接下来,我们就通过 Cordova 来开发一款 App。
App = 移动功能 + Web 界面
移动功能可以通过 Cordova 的插件实现
Web 界面可以自己写 HTML、CSS 和 JS。也可以借助成熟的前端框架(例如 Vue)。这样可以提高开
发效率。
Cordova 和 Vue 我们已学过。怎么将二者结合起来呢?
其实逻辑很简单: 将 Vue 项目的打包目录,设置为 Cordova 项目的 www 项目。
这样,我们先打包 Vue,然后运行 Cordova 就可以了。
1 npm install -g @vue/cli
1 vue create vc
手动选择特征
去掉 Linter,选中 Router 和 Vuex
选择 Vue 3.x
不使用 history 模式的路由(App 中,只支持 hash 模式)
Vue 项目将来会通过 Cordova 打包成 App,这里的路由模式不能选 history
默认,继续
默认,继续
如果一切顺利,则项目创建完成
1 cd [Vue 项目目录]
2 npm run serve
本节的目标是将 Vue 项目和 Cordova 合并在一起。通过 Vue 实现非移动端的功能,通过 Cordova 实现移动端的功能。
1 cd [你的 Vue 项目目录]
在 Vue 项目目录下声明 vue.config.js
1 module.exports = {
2 publicPath: './', // 必填
3 outputDir: 'www', // 打包后的目录名称(为了适配 Cordova,这里必须写成 ww
w)
4 assetsDir: '', // 静态资源目录名称
5 productionSourceMap: false, // 去掉打包的时候生成的 map 文件
6 lintOnSave: false,
7 }
在 public/index.html 的 head 中添加 Cordova 需要的 meta 标签
1
2
3
4
5
6 7
8
9
10
11
12
13
14
在 public/index.html 的 body 中添加 cordova.js
通过判断环境来区分 Vue 还是 Cordova。只有 Cordova 运行时,才能加载到 cordova.js
1 <% if (process.env.NODE_ENV === 'production') { %>
2
3 <% } %>
在 src/main.js 中添加 Cordova 的 deviceready 事件
1 if (process.env.NODE_ENV === 'production') {
2 document.addEventListener('deviceready', function() {
3 app.mount('#app')
4 }, false);
5 } else {
6 app.mount('#app')
7 }
这一步的目的是打包出 www 目录,www 目录是 Cordova 必须的源码目录
1 npm run build
先创建一个 Cordova 项目
1 cordova create vc io.cordova.vc CordovaApp
然后将 Cordova 中的 config.xml 复制到 Vue 项目中
如果 Vue 项目中没有 config.xml,会有如下报错
报错:Current working directory is not a Cordova-based project
原因:当前项目中不包含 Cordova 项目的 config.xml
解决:创建 Cordova 项目
cordova create cdva io.cordova.cdva CordovaApp
将 Cordova 项目中的 config.xml 复制到 Vue 项目中
由于 Cordova 初始化项目的配置文件(config.xml)中不包含平台信息,因此,在运行之前先添加平台支
持。
此时,可以在 Vue 项目中直接运行下面的命令
1 cordova platform add android --save
1 cordova plugin add cordova-plugin-whitelist
2 cordova prepare
1 cordova run android
1 npm install corodva-lib # 包含 Cordova 和 Plugman 的常用命令
在 Vue 项目目录下创建 cdva.js。目的是将 Cordova 命令,集成到 Vue 命令中。
1 const { cordova } = require('cordova-lib')
2
3 // 清除
4 const clean = api => {
5 api.registerCommand('clean', args => {
6 return cordova.clean()
7 .catch(console.error)
8 })
9 }
10
11 // 构建
12 const build = api => {
13 const { build } = api.service.commands
14
15 const originalBuild = build.fn
16
17 build.fn = (...args) => {
18 return originalBuild(...args)
19 .then(() => cordova.prepare())
20 .then(() => cordova.compile({ options: args[ 0 ] }))
21 .catch(console.error)
22 }
23 }
24
25 // 运行
26 const develop = api => {
27 api.registerCommand('develop', args => {
28 return cordova.run()
29 .catch(console.error)
30 })
31 }
32
33 // 将命令导出34 module.exports = (api, options) => [clean, build, develop].map(fn
=> fn(api, options))
添加上述命令的支持代码
1 {
2 // ....
3 "scripts": {
4 "clean": "vue-cli-service clean",
5 "serve": "vue-cli-service serve",
6 "build": "vue-cli-service build",
7 "develop": "vue-cli-service develop"
8 },
9 "vuePlugins": {
10 "service": [
11 "cdva.js"
12 ]
13 },
14 // ....
15 }
vue-cli-service: https://cli.vuejs.org/guide/cli-service.html#vue-cli-service-inspect
vuePlugins: https://cli.vuejs.org/guide/plugins-and-presets.html#installing-plugins-in-an-
existing-project
1 npm run develop
Cordova 没有热更新,所以每次代码修改后,都需要重新启动才能看到效果。这里,我们可以通过 Vue的热更新,来近似地实现 Cordova 的实时调试。
1 cd [Vue 项目目录]
2 npm run serve
注意查看启动后的 公网 IP 地址 ,稍后会用来 Cordova 的 config.xml 中
将 Cordova 默认加载的地址,由本地的 index.html 改成上面 Vue 的 公网 IP 地址
1 cordova run android
此时可以修改 Vue ⻚面中的内容,查看 App 端是否实时更新
注意:这里只是利用 Vue 的热更新来 近似地 实现 Cordova 的实时调试。但是,App 端的功能毕竟在浏
览器上不能调试。使用时,请注意区分。
安装 Vant 3
Vant 真的会 Vue 3 也针对性地推出了 Vant 3(对应的包叫 vant@next)
1 npm i vant@next -S
Vant 详情:https://github.com/youzan/vant
Vant 效果:https://vant-contrib.gitee.io/vant/v3/
引入 Vant
1 // ...
2 import Vant from 'vant'
3 import 'vant/lib/index.css'
4
5 const app = createApp(App)
6 app.use(Vant) // 使用 Vant
7 // ...
声明⻚面
声明三个⻚面
首⻚:src/views/home/index.vue
新闻:src/views/news/index.vue
我: src/views/user/index.vue
声明路由
在 src/router/index.js 中,为上述三个⻚面声明路由
1 const routes = [
2 {
3 path: '/',
4 name: 'home',
5 component: () => import('@/views/home/index')
6 },
7 {
8 path: '/news',
9 name: 'news',
10 component: () => import('@/views/news/index')
11 },
12 {
13 path: '/user',
14 name: 'user',
15 component: () => import('@/views/user/index')
16 },
声明导航
声明 src/components/ LayoutFooter.vue
1
2
3
4 首⻚
5 新闻
6 我
7
8
9
10
11
这里,使用 Vant 中的 Tabbar 来实现导航。
Tabbar 详情:https://vant-contrib.gitee.io/vant/v3/#/zh-CN/tabbar
引入导航
在 App.vue 中,引入 LayoutFooter.vue
1
2
3
4
5
6
新闻⻚ = Axios 请求接口 + 列表布局
安装 Axios
1 npm install axios
Axios 详情:https://github.com/axios/axios
封装 Axios
创建 src/api/http.js
1 import axios from 'axios'
2
3 // 创建 axios 实例4 const service = axios.create({
5 timeout: 5000 // 请求超时时间
6 })
7
8 // 请求拦截器
9 service.interceptors.request.use(config => {
10 config.headers['Accept'] = 'application/json'
11 // config.data = Object.assign({}, config.data, {
12 // authToken: 'tokenplaceholder_xxxxxxxx'
13 // });
14
15 return config
16 }, error => {
17 Promise.reject(error)
18 })
19
20 // 响应拦截器
21 service.interceptors.response.use(
22 response => {
23 // console.log(response)
24 if (response.status === 200 ) {
25 return response.data
26 } else {
27 console.log('响应数据报错')
28 return Promise.reject(response)
29 }
30 },
31 error => {
32 if (error.response) {
33 const res = error.response.data
34 // todo
35 return res
36 } else {
37 return Promise.reject(error)
38 }
39 }
40 )
41
42 export default service
申请接口
新闻头条地址:https://www.juhe.cn/docs/api/id/235
申请方式参考官网介绍。
注意: 免费的新闻接口,每天只能访问 100 次。建议自己申请一个秘钥 (如果都用老师的,访问可能受限)
请求接口
声明 src/api/index.js
1 import http from './http'
2
3 var newsAPI = ""
4 if (process.env.NODE_ENV === 'production') {
5 newsAPI = "http://v.juhe.cn" // cordova 中没有跨域。可以直接调用域名
6 } else {
7 newsAPI = "/news" // vue 中的跨域代理
8 }
9
10 // 新闻列表
11 export function newsList(type = 'top', page = 1 , pageSize = 10 ) {
12 return http.get(newsAPI + '/toutiao/index', {
13 params: {
14 key: '你的请求秘钥',
15 type,
16 page,
17 pageSize
18 }
19 })
20 }
解决跨域
在 vue.config.js 中,声明 proxy
1 module.exports = {
2 devServer: {
3 proxy:{
4 '/api': {
5 target: "http://v.juhe.cn",
6 changeOrigin:true, // 是否改变请求源7 pathRewrite:{ // 路径重写
8 "^/api":''
9 }
10 }
11 }
12 }
调用接口
1 import { newsList } from '@/api'
2
3 newsList(this.type, this.page, this.pageSize).then((res) => {
4 this.loading = false;
5
6 if (res.error_code === 0 ) {
7 console.log(res.result.data)
8 this.news = this.news.concat(res.result.data)
9 } else {
10 this.finished = true
11 }
12 }).catch((err) => {
13 console.log(err)
14 })
展示列表
1
2
3
7
8
9
10
1112
13 {{item.title.substring(0,26)
+ '...'}}
14
15
16
17 {{item.date}}
18
19 {{item.author_name.subst
ring(0,5)}}
20
21
22
23
24
之前,我们通过 cordova-plugin-geolocation 获取了地理位置,接下来,我们可以通过地理位置来查询天气。
首先要安装 cordova-plugin-geolocation
1 const getPosition = () => {
2 var options = {
3 enableHighAccuracy: true,
4 maximumAge: 1000 , // 毫秒为单位
5 }
6 navigator.geolocation.getCurrentPosition(onSuccess, onError, op
tions)
7 function onSuccess(position) {
8 alert('经度:' + position.coords.longitude + "\n" +
9 '纬度:' + position.coords.latitude + "\n"
10 );
11 }
12
13 function onError(error) {
14 alert("Code: " + error.code + "\n Message: " + error.messag
e)
15 }
16 }
https://dev.qweather.com/docs/api/weather/
1 import http from './http'
2
3 var weatherProxy = ""4 if (process.env.NODE_ENV === 'production') {
5 weatherProxy = "https://devapi.qweather.com/v7/weather"
6 } else {
7 weatherProxy = "/weather"
8 }
9
10
11 // 3天的天气预报
12 export function get3d(location) {
13 return http.get(
14 weatherProxy + '/3d',
15 {
16 params: {
17 key: "687e517f06684448a9f4695721414a07",
18 location
19 }
20 }
21 )
22 }
编辑 vue.config.js
1 module.exports = {
2 outputDir: 'www',
3 publicPath: './',
4 devServer: {
5 proxy: {
6 "/weather" : {
7 target: 'https://devapi.qweather.com/v7/weather',
8 changeOrigin: true,
9 pathRewrite: {
10 "^/weather": ""
11 }
12 }
13 }
14 }
15 }
1 const getPosition = () => {
2 var options = {
3 enableHighAccuracy: true,
4 maximumAge: 1000 , // 毫秒为单位
5 }
6 navigator.geolocation.getCurrentPosition(onSuccess, onError, op
tions)
7 function onSuccess(position) {
8 alert('经度:' + position.coords.longitude + "\n" +
9 '纬度:' + position.coords.latitude + "\n"
10 );
11 // 调用天气预报接口
12 const location = position.coords.longitude+","+position.coord
s.latitude
13 get3d(location).then(res => {
14 if (res.code == '200') {
15 state.weather = res.daily
16 } else {
17 console.log('获取天气失败')
18 }
19 }).catch(err => {
20 console.log(err)
21 })
22 }
23
24 function onError(error) {
25 alert("Code: " + error.code + "\n Message: " + error.messag
e)
26 }
27 }
1
2
3
4
5
6
7 {{item.textDay}}
8
9
10 ⻛向:{{item.windDirDay}}
11 温度:{{item.tempMin}} - {{item.tempMax}}
12
13
14
需要将天气相关的图标下载到 src/assets/color-64/ 下,然后才能根据接口数据,展示天气图标。
图标详情:https://dev.qweather.com/docs/start/icons/
下载地址:https://github.com/qwd/WeatherIcon
这里我们通过 cordova-plugin-camera 来实现在手机端更新用户头像功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
23
24
25
26
72
注意 actions 中的回调函数,如果写成箭头函数,则必须先声明,然后才能使用
因为箭头函数不能提升(普通函数不用考虑声明位置,会自动提升)
1 const takePic = () => {
2 alert('拍照')
3 // 拍照
4 navigator.camera.getPicture(onSuccess, onError, {
5 quality: 50 ,
6 destinationType: Camera.DestinationType.FILE_URI
7 })
8
9 function onSuccess(imageURI) {
10 var image = document.getElementById('myImage')
11 image.src = imageURI
12 }
13
14 function onError(message) {
15 alert("拍照失败:" + message)
16 }
17 }
1 const getPic = () => {2 alert('从相册中选取')
3 navigator.camera.getPicture(onSuccess, onError, {
4 quality: 50 ,
5 destinationType: Camera.DestinationType.FILE_URI,
6 sourceType: Camera.PictureSourceType.PHOTOLIBRARY // 只需添
加这一行
7 })
8
9 function onSuccess(imageURI) {
10 var image = document.getElementById('myImage')
11 image.src = imageURI
12 }
13
14 function onError(message) {
15 alert("拍照失败:" + message)
16 }
17 }
这里我们通过 cordova-plugin-qrscanner 来实现扫码功能。
插件详情:https://www.npmjs.com/package/cordova-plugin-qrscanner
1 cordova plugin add cordova-plugin-qrscanner
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 放入框内,自动扫
描 21
22
23 {{lightOn? '关闭' : '打开'}}
24
25
26 {{frontCamera? '后摄' : '前摄'}}
27
28
29
30
31
32
33
34
64
65
在 router/index.js 中添加路由
1 import { createRouter, createWebHashHistory } from 'vue-router'
2
3 const routes = [
4 // ...
5 {
6 path: '/scan',
7 name: 'Scan',
8 component: () => import('@/views/scan/index')
9 },
10 // ...
11 ]
1 const doScan = () => {
2 if (typeof QRScanner !== 'object') {
3 alert('QRScanner 不存在')
4 return;
5 }
6
7 QRScanner.prepare(onDone)
8 function onDone(err, status) {
9 if (err) {
10 console.log(err._message)11 }
12
13 if (status.authorized) {
14 QRScanner.scan(displayContents)
15 function displayContents(err, text) {
16 if (err) {
17 console.error(err)
18 } else {
19 alert(text)
20 // 后续操作
21 }
22 }
23
24 // 让 webview 透明,执行扫码操作
25 QRScanner.show()
26 } else if (status.denied) {
27 alert('用户拒绝扫码')
28 } else {
29 alert('未获取数据')
30 }
31 }
32 }
33
34 // 挂载完成
35 onMounted (() => {
36 doScan()
37 })
1 // 切换闪光灯
2 const toggleLight = () => {
3 alert('切换闪光灯')
4 if (state.lightOn === false) {
5 QRScanner.enableLight((err, status) => {
6 err && console.log(err)
7 state.lightOn = true;
8 })9 } else {
10 QRScanner.disableLight((err, status) => {
11 err && console.log(err)
12 state.lightOn = false;
13 })
14 }
15 }
1 // 切换摄像头
2 const toggleCamera = () => {
3 alert('切换摄像头')
4 if (state.frontCamera === false) {
5 QRScanner.useFrontCamera((err, status) => {
6 err && console.log(err)
7 state.frontCamera = true
8 })
9 } else {
10 QRScanner.useBackCamera((err, status) => {
11 err && console.log(err)
12 state.frontCamera = false
13 })
14 }
15 }
1 onUnmounted(() => {
2 document.getElementById('app').style.backgroundColor = "#FFFFF
F"
3 document.querySelector('body').style.backgroundColor = "#FFFFF
F"
4
5 try {
6 QRScanner.hide(status => {
7 console.log('关闭扫描' + JSON.stringify(status))8 })
9 QRScanner.destroy(status => {
10 console.log('销毁扫描' + JSON.stringify(status))
11 })
12 } catch (error) {
13 console.log(error)
14 }
15 })
1 npm run build
2
3 npm run develop
详情查看:cordova-plugin-splashscreen
通过 cordova-plugin-globalization 获取当前语言信息。然后通过 Vue 的 i18n 来实现多语言的效果。
1 npm install vue-i18n@next
创建 src/assets/i18n 目录,并声明语言包
1 src
2 ├── assets
3 | └──i18n 国际化目录
4 │ └── en.js 英文
5 | └── zh.js 中文
6 | └── index.js
en.js
1 export default {
2 // 公共的key
3 common: {
4 all: 'All',
5 back: 'Back',
6 search: 'Search',
7 scan: 'Scan'
8 },
9 nav: {
10 home: 'Home',
11 news: 'News',
12 profile: 'Profile'
13 }
14 }
zh.js
1 export default {
2 // 公共的key
3 common: {
4 all: '全部',
5 back: '返回',
6 search: '搜索',
7 scan: '扫一扫'
8 },
9 nav: {
10 home: '首⻚',
11 news: '新闻',
12 profile: '我的'
13 }
14 }
index.js
1 import { createI18n } from 'vue-i18n'
2 import enLocale from "./en";
3 import zhLocale from "./zh";
4
5 const messages = {
6 en: { ...enLocale }, // 英文语言包
7 zh: { ...zhLocale } // 中文语言包
8 };
9
10 const i18n = createI18n({
11 locale: localStorage.lang || en,
12 messages
13 })
14
15 export default i18n
在 src/main.js 中引入 i18n
1 import i18n from './assets/i18n/index'
2
3 const app = createApp(App)
4
5 app.use(i18n)
1
2
3
4 {{$t('nav.home')}}
5 {{$t('nav.new
s')}}
6 {{$t('nav.profil
e')}}
7
8
9
这里的 nav 就对应语言包中的 nav
1
2
3
4
报错原因:没有添加白名单,或者白名单规则不允许访问上述域名
解决:
报错原因:APP 默认不支持 http 协议(默认只允许 https)
解决:
在 android 目录中的 AndroidManifest.xml 文件添加一行
(一般路径为:android/app/src/main/AndroidManifest.xml)
1
7 >
跳转 跳转到百度