Neil_HL
Neil_HL
  • 发布:2018-08-30 18:40
  • 更新:2019-12-06 18:02
  • 阅读:35754

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的升级检测代码必须使用条件编译,否则在非App环境由于不存在plus相关API,将会报错。

升级地址URL,如果是自行托管的App,就提供自己的包地址。如果是打开应用市场,那URL如下:

if (plus.os.name=="Android") {  
    appurl = "market://details?id=io.dcloud.hellouniapp"; //这个是通用应用市场,如果想指定某个应用商店,需要单独查这个应用商店的包名或scheme及参数  
}  
else{  
    appurl = "itms-apps://itunes.apple.com/cn/app/hello-uni-app/id1417078253";  
}

服务端实现

根据客户端上报的版本号,比对服务端最新版本号,决定是否需要升级,若需升级则返回升级信息(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是固定值。
25 关注 分享
Trust 270635897@qq.com caiqihuang@126.com dev7 水灵退散 wzl16 DCloud_UNI_CHB 没得好名字 qq820805144 12003@qq.com 沧桑 1172106013@qq.com sonicsunsky@qq.com wuguangyong CodeIsLaw 草灯 1157817265@qq.com 642307404@qq.com 306816224@qq.com Iain shanjixiaboss@163.com 江西来客 392660515@qq.com 知行合一 324166166@qq.com

要回复文章请先登录注册

1273553799@qq.com

1273553799@qq.com

holonomic
2019-12-06 18:02
森另

森另

为什么iOS打不开,点击没有反应?
2019-12-06 15:56
云飞扬啊

云飞扬啊

itms-apps://itunes.apple.com/cn/app/hello-uni-app/id1417078253 这个链接从哪找到?
2019-11-17 23:07
383188761@qq.com

383188761@qq.com

回复 1050211033@qq.com:
请问你解决这个问题了吗?我也遇到同样的问题了
2019-11-11 16:06
1050211033@qq.com

1050211033@qq.com

回复 1050211033@qq.com:
经实践,本地手机测试会有两个包,发布生产会有一个包,可不用担心
2019-11-05 15:53
1050211033@qq.com

1050211033@qq.com

回复 15093565100@163.com:
遇到相同问题,请问解决了吗
2019-11-04 17:45
1050211033@qq.com

1050211033@qq.com

安卓测试整包更新,plus.runtime.openURL下载apk会生成两个app?一个是老版本的app,一个是新下载的app,怎么解决app覆盖?只有一个新版app?
2019-11-04 17:44
jurieo@jurieo.com

jurieo@jurieo.com

回复 390301051@qq.com:
作用域不一样
2019-11-03 12:22
Monody

Monody

回复 pwkzyy@163.com:
升级之后ios的sessionid也会改变
2019-10-28 10:46
pwkzyy@163.com

pwkzyy@163.com

升级之后,storage 中保存的用户信息 会丢失,请问如何解决?????
2019-10-27 23:31