整包(apk/ipa)升级

5+应用可使用以下方式进行升级
- 整包升级:适用于大版本更新,runtime发生变化时(模块、配置、版本等变化)必须使用此更新方法
- 应用资源升级:适用于小版本更新 。runtime不变,前端页面整体压缩包更新
- 应用资源差量升级:适用于小版本更新 。runtime不变,前端页面仅需要更新的部分更新。

本文重点描述5+应用整包升级,逻辑其实是非常简单,主要有三个步骤:
1. 查询是否有新版本更新
2. 下载新版本
3. 安装新版本

而在实际应用的升级过程中则需要处理很多细节问题,下面就按照这个流程来简单说明在5+App中实现应用升级的逻辑。

查询是否有新版本更新

\n

这个操作其实非常简单,就是客户端与升级服务器的一次交互操作,比较升级服务器上发布的最新客户端版本是否高于当前客户端版本号(5+ API中可以通过plus.runtime.version获取当前apk/ipa的版本号,注意打包方生效)?是的话则需要升级,否则无需升级。
从逻辑上来考虑有两种判断模式:
1. 客户端判断是否有升级
客户端从服务器获取最新的版本号,本地js判断是否需要升级。
2. 服务器判断是否有升级
客户端提交版本到服务器,有服务器判断返回是否需要升级。
前者的优点是否服务器压力小,静态返回最新客户端版本即可,后者的优点则升级控制会更灵活,可以根据其它条件动态控制部分用户先升级(灰度发布)等。有条件的情况推荐采用第二种方式进行判断。

可以使用Javascript中的标准XHR请求,如果存在跨域问题则使用5+ API的XMLHttpRequest

下载新版本

\n

如果判断到需要更新版本,则需要从服务器下载新版本,通常升级服务器应该返回下载新版本的地址(或者从固定的地址获取)。
有两种下载方法,一种调用Downloader API下载,示例如下:

var url=""; // 下载文件地址
var dtask = plus.downloader.createDownload( url, {}, function ( d, status ) {
if ( status == 200 ) { // 下载成功
var path = d.filename;
console.log(d.filename);
} else {//下载失败
alert( "Download failed: " + status );
}
});
dtask.start();
\n

安装新版本

\n

下载原生安装包apk后,可调用plus.runtime.install方法安装,示例如下:

    plus.runtime.install(path);  // 安装下载的apk文件
\n

注意
iOS平台的ipa无法安装,此时需要跳转到appstore,提示用户自动点击升级更新,跳转到appstore的方法为打开应用的appstore地址,示例如下:

var url='itms-apps://itunes.apple.com/cn/app/hello-h5+/id682211190?l=zh&mt=8';// HelloH5应用在appstore的地址
plus.runtime.openURL(url);
\n

此处url是以"itms-apps://"开头,后面跟appstore上应用地址。

示例
在Hello H5+和Hello mui示例里,有2种不同的检查更新处理方式。
Hello H5+里的update.js比较复杂,在js里执行下载apk并安装的逻辑。
Hello mui里的update.js比较简单,弹出新包下载地址到浏览器,由浏览器执行下载逻辑。
如何选择看自己的要求。


14 分享
wduser ffffffffff seniafamily Nick丶丶 wangqianjiao@126.com 木头很努力 DCloud_客服_Trust 449266659@qq.com MRS zhuhong02199@163.com 1685863468@qq.com 513238368@qq.com 455218007@qq.com 周建伟
1262223758@qq.com

1262223758@qq.com

所以有人知道整包升级的时候如何保留之前的下载目录里的文件吗?
0 赞 2 天前
周建伟

周建伟

@DCloud_App_Array 请问这种整包升级,是否适应这种场景:
创业初期,使用DCloud快速开发,等业务和用户量上来后,某些功能使用DCloud无法实现或者效果达不到要求时,使用原生重新开发,然后强制用户使用这种方式重新下载原生安装包(确保AppID和安卓包名和DCloud开发的一致),然后升级为原生。
谢谢!
0 赞 2017-04-19 22:45
906529775@qq.com

906529775@qq.com 回复 DCloud_App_Array

【这段写错了】var downSize = dtask.downloadedSzie; // 已下载大小
----------------------------------------------------------------------------
【改成这样】var downSize = dtask.downloadedSize; // 已下载大小
0 赞 2017-04-19 12:50
rockproject@163.com

rockproject@163.com 回复 l18274950624@126.com

我也是的,没有任何反应
0 赞 2017-04-01 15:47
1019422167@qq.com

1019422167@qq.com

mark
0 赞 2017-03-08 16:36
Element

Element

膜拜大神
0 赞 2017-01-12 15:01
798351803@qq.com

798351803@qq.com

是不是说,整包升级可以不需要再次审核了
0 赞 2016-12-22 13:24
MRS

MRS 回复 2451057421@qq.com

是不是说,整包升级可以不需要再次审核了
0 赞 2016-12-06 15:53
2451057421@qq.com

2451057421@qq.com

试问整包升级本质上和下载一个新的应用有什么区别
0 赞 2016-12-06 11:15
l18274950624@126.com

l18274950624@126.com

我根据Hello mui里的update.js的例子写的,为什么没有反应?
0 赞 2016-11-21 11:52
447099719@qq.com

447099719@qq.com

mark
0 赞 2016-11-17 14:53
Eason

Eason

版本号有问题的同学可以看下这篇文章:
http://ask.dcloud.net.cn/article/1019
0 赞 2016-11-15 16:32
蓓岑2015

蓓岑2015 回复 东哥的苹果

我靠,这个信息很重要啊,大家赞一下,给这条评论置顶吧。
0 赞 2016-08-19 16:15
xhq

xhq

app升级后,本地sqlite数据库如何迁移过来?
0 赞 2016-08-04 16:03
DCloud_App_Array

DCloud_App_Array 回复 faithLLY

比如新版本应用需要使用添加新的模块,而老版本的apk/ipa没有包含此模块
0 赞 2016-07-08 16:21
faithLLY

faithLLY

runtime发生变化时(模块、配置、版本等变化) 这句话什么意思啊?
0 赞 2016-07-07 10:54
迷途小压压

迷途小压压

升级服务器端怎么写
0 赞 2016-06-13 10:49
老王

老王

mark
0 赞 2016-04-25 15:39
荼蘼

荼蘼

mark
0 赞 2016-04-20 11:58
xiamo152

xiamo152

针对前端资源升级感觉两种方式太繁琐,并且IOS还有局限性,是否可将web部分部署在服务端,升级直接更新服务器上资源不就好了??
0 赞 2016-04-01 16:48
magengshun

magengshun

罪过啊刚看到这条消息,终于可以不用担心Android升级的问题了,用个推推送安装太不稳定了。
0 赞 2016-03-09 15:51
DCloud_App_Array

DCloud_App_Array 回复 liwei1

可通过以下方法获取下载的进度:
dtask.addEventListener( "statechanged", function(){
var downSize = dtask.downloadedSzie; // 已下载大小
var totalSize = dtask.totalSize; // 总大小
}, false );
1 赞 2016-03-09 11:30
liwei1

liwei1

下载时怎么没有进度条呢
0 赞 2016-03-08 19:47
东哥的苹果

东哥的苹果

plus.runtime.version,ios打包之后才能显示真实的ipa版本号,不打包显示的是Hbuilder的版本,草他妈的官方文档,怎么不写清楚,怎么不写清楚,怎么不写清楚????草草草,重要的事情说三遍。
3 赞 2016-03-03 17:54
柳枫

柳枫

根据示例,下载失败,status返回400,URL:HTTP://192.168.1.200/TEST.APK,确定在一个局网内,浏览器可下载。
0 赞 2016-03-02 14:59
可怜的光头强

可怜的光头强

咋样查看应用在App Store上的url地址?
0 赞 2016-02-04 11:57
帝普一世

帝普一世

给个完整示例咯
0 赞 2015-12-23 20:50
dmx

dmx

有两种下载方法,另一种下载方法是什么
2 赞 2015-12-17 10:23

要回复文章请先登录注册