Neil_HL
Neil_HL
  • 发布:2018-08-30 18:40
  • 更新:3 天前
  • 阅读:24173

uni-app 整包升级/更新方案

分类:uni-app

使用 uni-app 开发,可将代码编译到iOS、Android、微信小程序等多个平台,升级时也需考虑多平台同步升级。

  • uni-app发布为小程序的升级模式较简单,只需将开发完的代码提交小程序后台,待审核通过后用户将自动升级
  • iOS/Android App 的升级需开发者自己处理,本文主要简介 App 的整包升级模式。
  • App 的资源热更新另见文档:http://ask.dcloud.net.cn/article/35667

接口约定

如下数据接口约定仅为示例,开发者可以自定义接口参数。

请求地址:https://www.example.com/update

请求方法:GET

请求数据:

{  
    "appid": plus.runtime.appid,  
    "version": plus.runtime.version  
}  

响应数据:

{  
    "status":1,//升级标志,1:需要升级;0:无需升级  
    "note": "修复bug1;\n修复bug2;",//release notes  
    "url": "http://www.example.com/uniapp.apk" //更新包下载地址  
}  

客户端实现

App启动时,向服务端上报当前版本号,服务端判断是否提示升级。

在App.vue的onLaunch中,发起升级检测请求,如下:

onLaunch: function () {  
    //#ifdef APP-PLUS  
    var server = "https://www.example.com/update"; //检查更新地址  
    var req = { //升级检测数据  
        "appid": plus.runtime.appid,  
        "version": plus.runtime.version  
    };  
    uni.request({  
        url: server,  
        data: req,  
        success: (res) => {  
            if (res.statusCode == 200 && res.data.status === 1) {  
                uni.showModal({ //提醒用户更新  
                    title: "更新提示",  
                    content: res.data.note,  
                    success: (res) => {  
                        if (res.confirm) {  
                            plus.runtime.openURL(res.data.url);  
                        }  
                    }  
                })  
            }  
        }  
    })  
    //#endif  
}  

注意:App的升级检测代码必须使用条件编译,否则在微信环境由于不存在plus相关API,将会报错。

服务端实现

根据客户端上报的版本号,比对服务端最新版本号,决定是否需要升级,若需升级则返回升级信息(rease notes、更新包地址等)

开发者可以根据服务端开发语言,自己实现升级检测逻辑,如下是一个php示例代码:

header("Content-type:text/json");  
$appid = $_GET["appid"];  
$version = $_GET["version"]; //客户端版本号  
$rsp = array("status" => 0); //默认返回值,不需要升级  
if (isset($appid) && isset($version)) {  
    if ($appid === "__UNI__123456") { //校验appid  
        if ($version !== "1.0.1") { //这里是示例代码,真实业务上,最新版本号及relase notes可以存储在数据库或文件中  
            $rsp["status"] = 1;  
            $rsp["note"] = "修复bug1;\n修复bug2;"; //release notes  
            $rsp["url"] = "http://www.example.com/uniapp.apk"; //应用升级包下载地址  
        }  
    }  
}   
echo json_encode($rsp);  
exit;  

常见问题

  1. 版本检测需要打包app,真机运行基座无法测试。因为真机运行的plus.runtime.version是固定值。
23 关注 分享
Trust 270635897@qq.com caiqihuang@126.com dev7 水灵退散 wzl16 DCloud_UNI_CHB 没得好名字 qq820805144 12003@qq.com 沧桑 1172106013@qq.com sonicsunsky@qq.com Onlyshy CodeIsLaw 草灯 1157817265@qq.com 642307404@qq.com 306816224@qq.com Iain shanjixiaboss@163.com 江西来客 392660515@qq.com

要回复文章请先登录注册

1052036428@qq.com

1052036428@qq.com

在写安卓app的时候
有一种情况
比如我1.0.1是apk整包更新的,但是这个时候用户不去更新,然后我服务器最新版本已经是1.0.2,这次是采用wgt更新的。
请问这种情况怎么处理?
是安装完apk之后再更新一次wgt吗
3 天前
1052036428@qq.com

1052036428@qq.com

回复 554733512@qq.com:
请问你解决了吗?apk跟wgt是不是一样的下载操作
2019-08-14 18:10
1052036428@qq.com

1052036428@qq.com

整包升级只能用 plus.runtime.openURL,不能用plus.downloader.createDownload是吗
2019-08-14 18:09
wangzd369@163.com

wangzd369@163.com

回复 暗眼小子:
谢谢,我也解决了,是上面例子中的代码有问题,我复制了例子中的代码,没仔细看代码
2019-08-08 15:51
暗眼小子

暗眼小子

回复 wangzd369@163.com:
希望对你有用,官方对声明周期函数解释的太少了,而且这些东西又不是绑定在组件上面,所以好多坑只能一点一点的踩了,一点一点的尝试
2019-08-08 14:06
暗眼小子

暗眼小子

回复 wangzd369@163.com:
已经解决,后来猜测是plus外部环境的问题,然后我就在各个地方试了一下,在onLoad里面执行方法a,然后将封装的函数放到a函数里面执行,然后就可以了
2019-08-08 14:03
wangzd369@163.com

wangzd369@163.com

回复 暗眼小子:
你解决了没有呢,我好像遇到了与你相同的问题
2019-08-07 22:35
wangzd369@163.com

wangzd369@163.com

uniapp下提示Uncaught ReferenceError: plus is not defined 是什么原因?怎么解决啊?
2019-08-07 22:34
暗眼小子

暗眼小子

onLaunch后面的函数封装到util里面,一直报plus is undefined
2019-07-25 14:34
1606726660@qq.com

1606726660@qq.com

需要更新的可以试试这个插件[点我试试](http://hhyang.cn/doc6/)
2019-07-24 11:01
wyc0859@qq.com

wyc0859@qq.com

uni.showModal覆盖了uni.request的res,所以不会打开网页
2019-07-24 10:43
1589876345@qq.com

1589876345@qq.com

ios 整包更新安装失败。。。ios能用这个方法更新吗
2019-07-24 08:26
554733512@qq.com

554733512@qq.com

回复 Neil_HL:
大佬 我现在服务端返回的apk还有一个wgt格式 但是都用uni.downloadFile这个api进行下载 返回的statusCode是400 这要怎么搞?
2019-07-09 09:10
554733512@qq.com

554733512@qq.com

回复 493341396@qq.com:
ios的话检测升级一般都是跳转到应用商店去手动更新
2019-07-08 09:31
PT

PT

用hbuildx云打包的话,这个例子是要自己弄张表记录版本号,和打包文件的地址,请求后返回信息吗,上面的请求地址是假的吧
2019-06-28 15:03
1011093617@qq.com

1011093617@qq.com

HBuilderX更新后,打包的app必须整包更新升级吗
2019-05-23 15:48
493341396@qq.com

493341396@qq.com

请问一下怎么判断用户的是ios版本的还是安卓版本的??另外ios整包更新也是一样,直接下载一个新的ipa安装包吗??
2019-04-26 15:22
incess

incess

执行会报错 Cannot read property 'android' of undefined;at App onShow function
2019-03-20 14:43
2267868726@qq.com

2267868726@qq.com

回复 Neil_HL:
谢谢,已解决
2019-01-21 10:28
Neil_HL

Neil_HL (作者)

回复 562748671@qq.com:
试试这个:https://ext.dcloud.net.cn/plugin?id=36
2019-01-19 20:47
Neil_HL

Neil_HL (作者)

回复 2267868726@qq.com:
想要应用内安装的话:使用uni的下载api进行下载,然后调用plus.runtime.install进行下载
2019-01-19 20:47
562748671@qq.com

562748671@qq.com

要是修改提示下载的弹出框的样式 要怎么修改
2019-01-19 17:05
2267868726@qq.com

2267868726@qq.com

请问从数据库查询的新版的apk文件如何下载到iPad本地中,并且进行安装升级APP
2019-01-15 16:08
657917826@qq.com

657917826@qq.com

uni.request如果H5运行,header自定义属性取不到吧?
2018-11-30 15:44
liuc000@163.com

liuc000@163.com

有没有什么更好的方法打开下载地址啊..
2018-11-22 19:56
freedemon

freedemon

这个针对uni APP的写的升级检测,其实就是只是针对h5+ APP写的不详细版本而已,重点在于小程序和APP升级的兼容写法没点出,帖子很灌水。
2018-11-06 10:16
Trust

Trust

666666
2018-10-24 14:55
wenju

wenju

回复 DCloud_UNI_CHB:
请问有大概的时间点不 ?
2018-10-10 12:02
DCloud_UNI_CHB

DCloud_UNI_CHB

回复 wenju:
目前uni-app还处于快速迭代器,基座会跟着快速升级,后期基座相对稳定后,会提供wgt的热更新模式
2018-10-08 17:53
wenju

wenju

这个是apk升级包 对于android合适的; 但是如果是ios应该怎么处理呢? 还得乖乖提交AppStore 审核通过后 提示用户跳转在AppStore升级 ??

wgt升级方式支持吗, 我看HBuilderX还没有打wgt的工具呢
2018-09-26 14:30
Neil_HL

Neil_HL (作者)

回复 工藤驼一:
是的
2018-09-11 16:53
工藤驼一

工藤驼一

回复 Neil_HL:
我知道默认是get,我说自定义,我需要post,是在request里加method:'POST',吗
2018-09-11 16:04
Neil_HL

Neil_HL (作者)

回复 工藤驼一:
uni.request默认get
2018-09-11 16:02
工藤驼一

工藤驼一

怎么没有自定义请求类型是get还是post?在哪儿定义?
2018-09-11 15:57