uni-app: 如何实现增量更新功能?
都知道,很多APP都有增量更新功能,Uni APP
也是在今年初,推出了增量更新功能,今天我们就来学习一波。 当然,很多应用市场为了防止开发者不经市场审核许可,给用户提供违法内容,对增量更新大多持排斥态度,特别是apple
。所以拥有增量更新的app,需要注意以下几点:
1、上架审核期间不要弹出增量更新提示
2、增量更新内容使用https
下载,避免被三方网络劫持
3、不要更新违法内容、不要通过增量更新破坏应用市场的利益,比如iOS的虚拟支付要给Apple
抽佣等
通过本章节你能学到那些?
1、如何实现增量更新功能 2、Uni-App 如何制作增量更新升级包 3、Uni-App 增量更新功能需要注意些什么 4、Uni-App 部分相关api学习
话不多说,直接上干货!
如何实现增量更新功能
这里不是针对Uni-App
开发,所有的增量更新都应如此(但代码以Uni-App
为例)。
1、app
端,先调用服务端接口,判断是否需要更新
2、需要更新,直接下载更新升级包
3、安装升级包,app
重启即可完成升级
ok,我们以Uni-App
为例,看看代码具体实现
客户端实现 在 根目录 App.vue 的 onLaunch 中检测升级,代码如下:
// #ifdef APP-PLUS plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) { uni.request({ url: 'http://www.javanx.cn/update/', data: { version: widgetInfo.version, name: widgetInfo.name }, success: (result) => { var data = result.data; if (data.update && data.wgtUrl) { uni.downloadFile({ url: data.wgtUrl, success: (downloadResult) => { if (downloadResult.statusCode === 200) { plus.runtime.install(downloadResult.tempFilePath, { force: false }, function() { console.log('install success...'); plus.runtime.restart(); }, function(e) { // 这里的错误很重要,最好能记录的服务器日志中,方便调试或以后维护了解更新错误情况,及时解决 // 如何更新到服务器? // 调用一个接口,将e返回咯 console.error('install fail...'); }); } } }); } } }); }); // #endif
代码解析: 1、#ifdef APP-PLUS
判断是app
端,才检测是否需要更新
2、plus.runtime.getProperty
获取指定APPID
对应的应用信息
plus.runtime.getProperty( plus.runtime.appid, function ( wgtinfo ) { //appid属性 var wgtStr = "appid:"+wgtinfo.appid; //version属性 wgtStr += "<br/>version:"+wgtinfo.version; //name属性 wgtStr += "<br/>name:"+wgtinfo.name; //description属性 wgtStr += "<br/>description:"+wgtinfo.description; //author属性 wgtStr += "<br/>author:"+wgtinfo.author; //email属性 wgtStr += "<br/>email:"+wgtinfo.email; //features 属性 wgtStr += "<br/>features:"+wgtinfo.features; console.log( wgtStr ); } );
3、uni.request
调用服务端接口,传入当前版本,服务端返回update是否需要更新,需要更新时返回wgtUrl更新升级包路径。
4、uni.downloadFile
下载文件资源到本地,客户端直接发起一个 HTTP GET 请求,返回文件的本地临时路径tempFilePath
。如何我们需要监听下载进度,可以这样:
var downloadTask = uni.downloadFile({ url: 'https://www.javanx.cn/file/uni-app.rar', complete: ()=> {} }); downloadTask.onProgressUpdate(function(res)=>{ console.log('下载进度' + res.progress); console.log('已经下载的数据长度' + res.totalBytesWritten); console.log('预期需要下载的数据总长度' + res.totalBytesExpectedToWrite); })
downloadTask
对象的还提供了一下方法: (1)、abort
中断下载任务
(2)、onHeadersReceived` 监听 HTTP Response Header 事件,会比请求完成事件更早,仅微信小程序平台支持
(3)、offProgressUpdate
取消监听下载进度变化事件,仅微信小程序平台支持
(4)、offHeadersReceived
取消监听 HTTP Response Header 事件,仅微信小程序平台支持
5、plus.runtime.install(filePath, options, installSuccessCB, installErrorCB)
。 支持以下类型安装包:
(1)、应用资源安装包(wgt),扩展名为'.wgt';
(2)、应用资源差量升级包(wgtu),扩展名为'.wgtu';
(3)、系统程序安装包(apk),要求使用当前平台支持的安装包格式。 注意:仅支持本地地址,调用此方法前需把安装包从网络地址或其他位置放置到运行时环境可以访问的本地目录。
服务端实现 以nodejs为例:
var express = require('express'); var router = express.Router(); var db = require('./db'); // TODO 查询配置文件或者数据库信息来确认是否有更新 function checkUpdate(params, callback) { db.query('一段SQL', function(error, result) { // 这里简单判定下,不相等就是有更新。 var currentVersions = params.appVersion.split('.'); var resultVersions = result.appVersion.split('.'); if (currentVersions[0] < resultVersions[0]) { // 说明有大版本更新 callback({ update: true, wgtUrl: '', pkgUrl: result.pkgUrl // apk,ipa包可下载地址 }) } else if (currentVersions[currentVersions.length-1] < resultVersions[resultVersions.length-1]) { // 认为是小版本更新 callback({ update: true, wgtUrl: result.wgtUrl, // wgt包可下载地址 pkgUrl: '' }) } else { // 其它情况均不更新 callback({ update: false }) } }); } router.get('/update/', function(req, res) { var appName = req.query.name; var appVersion = req.query.version; checkUpdate({ appName: appName, appVersion: appVersion }, function(error, result) { if (error) { throw error; } res.json(result); }); });
ok,有了以上的功能,我们就用HBuilderx制作升级包.wgt
,放到服务器上,共升级使用。
Uni-App 如何制作增量更新升级包
1、更新 manifest.json 中的版本号。如果上一个版本的版本号是1.0.0,这里打升级包的时候就可以是1.0.1,反正要不前面的大,大家也可看到服务端接口实现了,就是通过版本号来判断的。
2、菜单->发行->原生App-制作移动App资源升级包
3、等待控制台生成升级包的输出位置
4、将升级包上传到服务器,接口实现并返回:wgtUrl=刚刚打的升级包
这样,我们的app就拥有了,增量更新功能。每次如果是小量更新,就可以通过wgt包,来实现增量更新。
下面来看看,Uni App
增量更新时,需要注意哪些问题?
Uni-App 增量更新功能需要注意些什么
1、SDK 部分有调整,比如新增了 Maps
模块等,不可通过此方式升级,必须通过整包的方式升级。
2、如果是老的非自定义组件编译模式,之前没有 nvue
文件,但更新中新增了 nvue
文件,不能使用此方式。因为非自定义组件编译模式如果没有 nvue
文件是不会打包weex
引擎进去的,原生引擎无法动态添加。自定义组件模式默认就含着weex
引擎,不管工程下有没有nvue
文件。
3、原生插件的增改,同样不能使用此方式。
4、#ifdef APP-PLUS
条件编译,仅在 App
平台执行此升级逻辑。
5、appid
以及版本信息等,在 HBuilderX
真机运行开发期间,均为 HBuilder
这个应用的信息,因此需要打包自定义基座或正式包测试升级功能。
6、plus.runtime.version
或者 uni.getSystemInfo()
读取到的是 apk/ipa
包的版本号,而非 manifest.json
资源中的版本信息,所以这里用 plus.runtime.getProperty()
来获取相关信息。
7、安装 wgt
资源包成功后,必须执行 plus.runtime.restart()
,否则新的内容并不会生效。
8、如果App的原生引擎不升级,只升级wgt包时需要注意测试wgt资源和原生基座的兼容性。平台默认会对不匹配的版本进行提醒,如果自测没问题,可以在manifest中配置忽略提示
总结
今天你学到了什么?Uni-App 增量更新你学会了吗?

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Go 开发关键技术指南 | Go 面向失败编程 (内含超全知识大图)
作者 |杨成立(忘篱) 阿里巴巴高级技术专家 关注“阿里巴巴云原生”公众号,回复 Go 即可查看清晰知识大图! 导读:从问题本身出发,不局限于 Go 语言,探讨服务器中常常遇到的问题,最后回到 Go 如何解决这些问题,为大家提供 Go 开发的关键技术指南。我们将以系列文章的形式推出《Go 开发的关键技术指南》,共有 4 篇文章,本文为第 2 篇。 Could Not Recover 在 C/C++ 中, 最苦恼的莫过于上线后发现有野指针或内存越界,导致不可能崩溃的地方崩溃; 最无语的是因为很早写的日志打印,比如 %s 把整数当字符串,突然某天执行到了崩溃; 最无奈的是无论因为什么崩溃都导致服务的所有用户受到影响。 如果能有一种方案,将指针和内存都管理起来,避免用户错误访问和释放,这样虽然浪费了一部分的 CPU,但是可以在快速变化的业务中避免这些
- 下一篇
FastDFS 6.05 发布,分布式文件系统
FastDFS 6.05发布了。FastDFS 是一个分布式文件系统,功能主要包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了文件大容量存储和高性能访问的问题。FastDFS 特别适合以文件为载体的在线服务,如图片、视频、文档等。 此版本主要对小文件合并存储的 binlog 压缩功能进行了企业级的增强和完善,主要改进如下: 根据内存快照定期生成新的 trunk binlog,以达到最好的压缩效果,减少磁盘空间占用,并且可以明显提升数据加载速度。 上述 trunk binlog 压缩支持事务,以保证 trunk 可用空间数据正确性。采用事务支持意外掉电或宕机后的数据恢复(通常为数据回滚,也可能做数据提交,系统自动完成,不需要人工干预)。 在适当时机自动备份 trunk binlog,用作灾备(备份数有上限,比如最多 7 份,采用先进先出方式删除最旧的备份文件)。 trunk 空间分配支持对齐(比如 256 或 512 字节对齐),可以有效防止产生过多的 trunk 碎片,提升 trunk 空间利用率。 对于多个连续的可用(空闲)trunk 空间,支持合并为一个较大的可用...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS关闭SELinux安全模块
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2全家桶,快速入门学习开发网站教程
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- 2048小游戏-低调大师作品
- CentOS7,CentOS8安装Elasticsearch6.8.6