需要形容

如果想要做一个app的话,能够有很多种抉择计划,uni-app是其中的一个性价比高一些(坑多一些)的计划。本文记录一下,uni-app安卓包当前,须要查看并下载更新,且显示进度条的性能。

代码在本人公司我的项目中利用,大家可放心使用。

需要:

  • 查看版本是否是最新版
  • 若不是最新版就下载远端服务器的最新的apk包
  • 下载中须要显示下载了多少了,当下载到100%的时候,主动装置接口

思路剖析

比方咱们有一个设置页面,在设置页面中能够去进行版本更新。

1. 查看是不是最新版

当每次进入设置页面的时候,在onShow钩子中向后端发申请,获取最新版本的信息,并与以后的版本信息做比照。

比方后端提供的有这样一个:获取最新版本信息 的接口

// 接口申请,返回数据如下:{    "code": 1,    "success": true,    "data": {        "id": 123456, // 存在数据库的id        "applyName": "拼夕夕", // 版本名称        "applyVersion": "1.2.3", // 版本号        "versionDescribe": "此版本新增,是兄弟就帮忙砍一刀性能", // 版本形容        "fileSize":11566511, // 文件的总大小,计算下载进度百分比须要应用        "filePath": "http://ashuai.work:10000/appSrc/pdd.apk", // 版本的url门路,失常在浏览器地址栏中输出即间接下载了        ... // 等等    },    "msg": "操作胜利"}

咱们首先拿到后端返回的这个applyVersion字段的值"1.2.3"去和当下的版本值比照。如果远端的最新版的版本号高于当下的版本号,就阐明要更新了。否则当下的就是最新版,就不必更新。

那问题又来了,如何能拿到当下的版本呢?没关系,官网提供的有api,能够间接获取的,代码如下:

plus.runtime.getProperty(plus.runtime.appid, (info) => {        this.currentVersion = info.version; // 将当下版本存到currentVersion字段中去})
留神这个获取版本号的操作是异步的哦,异步,异步。

而后将版本号字符串"a.b.c"转换成数字进行比照即可。

形式有很多种,比方:a*100000 + b*1000 + c*1

// 当然这里须要if(this.applyVersionVal > this.currentVersionVal){    // 须要更新    this.AndroidUpdate()}else {    // 以后已是最新版本    uni.showToast({        title: '以后已是最新版本',        duration: 2000,        icon:'none'    });    return}

2. 更新下载服务器远端的apk文件&进度条显示

调用安卓的办法,创立一个下载工作,能拿到某一时刻下载的文件的大小,比照总大小即可失去下载进度百分比

AndroidCheckUpdate() {    const _this = this    uni.showModal({            title: "版本更新",            content: 'APP有新版本公布,点击 立刻更新 进行最新版本下载。',            confirmText: '立刻更新',            cancelText: '稍后进行',            success: function(res) {                    if (res.confirm) {                            _this.show = true // show变量管制一个下载进度弹框(这个UI款式本人写即可)                            // 创立一个下载工作,并依据后端返回的apk动态资源地址filePath进行下载                            var dtask = plus.downloader.createDownload(_this.filePath, {}, function(d, status) {                                    // 下载实现                                      if (status == 200) {                                            _this.show = false // 下载实现再把下载进度弹框敞开即可                                            plus.runtime.install(plus.io.convertLocalFileSystemURL(d                                                    .filename), {}, {}, function(error) {                                                    uni.showToast({                                                            title: '装置失败',                                                            duration: 1500                                                    });                                            })                                    } else {                                            uni.showToast({                                                    title: '更新失败',                                                    duration: 1500                                            });                                    }                            });                            dtask.start(); // 下载工作开始下载                            // 对于进度的获取是应用定时器一直获取曾经下载的文件的大小,再比照总大小即可                            let timer = setInterval(() => {                                    let percent = (dtask.downloadedSize / this.fileSize).toFixed(2) // fileSize文件总大小,后端返回的                                    _this.percentVal = Math.floor(percent * 100) // 转成整数展现                                    if (percent >= 1) { // 留神百分比,及时革除定时器即可                                            clearInterval(timer)                                    }                            }, 18)                    } else if (res.cancel) {                            console.log('稍后更新');                    }            }    });}

进度条应用的是u-popup组件,如下:

<u-popup :round="10" :show="show" mode="center">        <view class="progressBox">                <u-loading-icon size="36"></u-loading-icon>                <text class="words">下载中 请勿退出 {{percentVal}}%</text>        </view></u-popup>

留神,下载这一块是要在手机模拟器上,能力看到成果哦。笔者工作中应用的是逍遥模拟器,挺好。

因为plus变量在浏览器中是没有的

版本号

效果图

下载结束当前,安卓主动装置

为了不便大家去验证,笔者也提供了一个apk动态资源包filePath: http://ashuai.work:10000/appSrc/pdd.apk ,在地址栏输出就能够拜访了。

动态资源apk接口

express同级目录下,新建文件夹app寄存一下apk文件

// 先查问有没有这个app,有的话返回这个动态app资源url地址route.get('/findAppUrl', (req, res) => {  res.header('Access-Control-Allow-Origin', '*');  let appName = (req.query.appName ? req.query.appName : 'pdd') + '.apk'  let files = fs.readdirSync('./app')  if (files.includes(appName)) { // 库存有    res.send({      code: '00000000',      url: "http://ashuai.work:10000/appSrc/" + appName    })  } else { // 库存没有    res.send({      code: '00000000',      url: ""    })  }})// 当拜访app资源时,就把对应的资源以流的模式返回去route.get('/appSrc/:fileName', (req, res) => {  res.header('Access-Control-Allow-Origin', '*');  let fileName = req.params.fileName // wms2month.apk  try {    // 存储一份app的门路    let appUrl = './app/' + fileName    let stat = fs.statSync(appUrl)    res.writeHead(200, {      'Content-Type': 'application/vnd.android.package-archive', // 安卓      'Content-Length': stat.size,    })    //创立可读流    let readStream = fs.createReadStream(appUrl)    // 将读取的后果以管道pipe流的形式返回    readStream.pipe(res);  } catch (error) {    res.send('暂无此app文件哦')  }})

至于强制更新的话,就做一个判断即可,以后版本不是服务器远端的最新版本的话,就不让往下走,不让登录即可

好忘性不如烂笔头,记录一下吧^_^