DCloud_App_Array
DCloud_App_Array
  • 发布:2015-10-30 13:12
  • 更新:2024-04-28 09:48
  • 阅读:132284

整包(apk/ipa)升级

分类:HTML5+

官方已发布APP升级中心,支持原生APP整包升级和wgt资源包升级。详见

5+应用可使用以下方式进行升级

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

本文重点描述5+应用整包升级,逻辑其实是非常简单,主要有三个步骤:

  1. 查询是否有新版本更新
  2. 下载新版本
  3. 安装新版本

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

查询是否有新版本更新

这个操作其实非常简单,就是客户端与升级服务器的一次交互操作,比较升级服务器上发布的最新客户端版本是否高于当前客户端版本号(5+ API中可以通过plus.runtime.version获取当前apk/ipa的版本号,注意打包方生效)?是的话则需要升级,否则无需升级。
从逻辑上来考虑有两种判断模式:

  1. 客户端判断是否有升级
    客户端从服务器获取最新的版本号,本地js判断是否需要升级。
  2. 服务器判断是否有升级
    客户端提交版本到服务器,有服务器判断返回是否需要升级。
    前者的优点是否服务器压力小,静态返回最新客户端版本即可,后者的优点则升级控制会更灵活,可以根据其它条件动态控制部分用户先升级(灰度发布)等。有条件的情况推荐采用第二种方式进行判断。

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

下载新版本

如果判断到需要更新版本,则需要从服务器下载新版本,通常升级服务器应该返回下载新版本的地址(或者从固定的地址获取)。
有两种下载方法,一种调用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(); 

安装新版本

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

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

注意
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);

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

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

27 关注 分享
wduser ffffffffff seniafamily Nick丶丶 老醒 木头很努力 Trust 4***@qq.com MRS z***@163.com 1***@qq.com 雪之梦技术驿站 实践活动结束 周建伟 1***@qq.com q***@163.com ali 启程588 5***@qq.com 1***@qq.com 7***@qq.com 7***@qq.com jzq84229 x***@163.com M社長 8***@qq.com eppen2

要回复文章请先登录注册

5***@qq.com

5***@qq.com

请问大神,我用你的这种整包更新方法更新,安卓可以下载和安装apk,但是安装后旧版本没被替换掉,也就是说更新后手机有2个版本的app同时存在,该怎么解决?项目要上线,就差这个了,求大神回复~~
2017-06-22 17:45
1***@qq.com

1***@qq.com

回复 d***@sina.com :
安装包的版本比你当前手机上运行的版本低呗
2017-06-15 09:28
d***@sina.com

d***@sina.com

为什么app下载成功,安装失败,显示“已安装了更高的版本”,我明明打包的app是0.8,服务端的版本是1.1,理论上应该可以替换安装成功,却显示安装失败,显示“已安装了更高的版本”,这个怎么回事?
2017-06-06 15:19
4***@qq.com

4***@qq.com

请问一下:这段代码在小米上可以下载安装。但是在魅族跟华为的手机上调用plus的downloader接口,没有下载到更新的apk包,这个是什么情况?
2017-05-12 18:10
1***@qq.com

1***@qq.com

所以有人知道整包升级的时候如何保留之前的下载目录里的文件吗?
2017-04-25 09:40
周建伟

周建伟

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

9***@qq.com

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

r***@163.com

回复 l***@126.com :
我也是的,没有任何反应
2017-04-01 15:47
1***@qq.com

1***@qq.com

mark
2017-03-08 16:36
Element

Element

膜拜大神
2017-01-12 15:01