uni-app热更新
开发工具HbuilderX
开发框架 uni-app、h5+
1、生成 App 资源升级包
1.1、修改版本号
1.2、首先,更新 manifest.json 中的版本号。
比如之前是 1.0.0,那么新版本应该是 1.0.1 或 1.1.0 这样。

2、发行
2.1、然后,在 HBuilderX 中生成升级包(wgt)。
2.2、菜单->发行->原生App-制作移动App资源升级包

2.3、生成结束会在控制台告知升级包的输出位置。

3.安装资源升级包
3.1、应用的升级需要服务端与客户端配合完成,下面以本地测试过程中的操作举例说明:
3.2、生成的 wgt 文件给后端人员,放在服务器目录下,生成下载链接,返回给开发app开发者
4、服务端接口
4.1、与后端约定检测升级的接口 ,接口地址 'Home/getShopAppVersion’
5、客户端检测升级
5.1、在 App.vue 的 onLaunch 中检测升级(也可以在首页中,首页中请使用onLoad),代码如下
// 热更新
wgtUpload:function(){
const that=this;
//plus.runtime.getProperty(),获取本机安装的版本,具体使用请参照如下链接
//https://www.html5plus.org/doc/zh_cn/runtime.html#plus.runtime.WidgetInfo
plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {
//'Home/getShopAppVersion' 获取服务端的版本
that.$http.post('Home/getShopAppVersion',{},{'load':false}).then(function(response){
// 获取服务端版本转化为数组
var onlineAndroidVersion=response.data.android.split(".");
// 获取本机安装版本转化为数组
var localAndroidVersion=that.$Androidversion.split(".");
// 是否更新
var isUpload=false;
for(var i=0;i<onlineAndroidVersion.length;i++){
// 服务端版本是否大于本地版本
if(parseInt(onlineAndroidVersion[i])>parseInt(localAndroidVersion[i])){
isUpload=true;
}
}
if(response.code==1){
var data=response.data;
if(isUpload==true){
// 下载文件资源到本地,下载刚才打包的 .wgt文件
uni.downloadFile({
url: "http://api.yunshanghulian.net/__UNI__F89F8A7.wgt", // 下载资源的 url
success: (downloadResult) => {
if (downloadResult.statusCode === 200) {
/* 安装应用, 要安装的文件路径(downloadResult.tempFilePath)
force 是否强制安装
true表示强制安装,不进行版本号的校验;false则需要版本号校验,
如果将要安装应用的版本号不高
于现有应用的版本号则终止安装,并返回安装失败。 仅安装wgt和wgtu时生效,默认值 false。
*/
plus.runtime.install(downloadResult.tempFilePath, {
force: true
}, function() {
// 应用热重启,重新启动进入首页。
plus.runtime.restart();
isUpload=false;
console.log('安装成功','install success...');
}, function(e) {
console.error('安装失败','install fail...');
});
}
}
});
}
}
})
});
}
plus.runtime.version 或者 uni.getSystemInfo() 读取到的是 apk/ipa 包的版本号,而非 manifest.json 资源中的版本信息,所以这里用 plus.runtime.getProperty() 来获取相关信息
安装 wgt 资源包成功后,必须执行 plus.runtime.restart(),否则新的内容并不会生效。
如果App的原生引擎不升级,只升级wgt包时需要注意测试wgt资源和原生基座的兼容性。平台默认会对不匹配的版本进行提醒,如果自测没问题,可以在manifest中配置忽略提示,详见https://ask.dcloud.net.cn/article/35627
注意:
关于热更新是否影响应用上架
应用市场为了防止开发者不经市场审核许可,给用户提供违法内容,对热更新大多持排斥态度。
但实际上热更新使用非常普遍,不管是原生开发中还是跨平台开发。
Apple曾经禁止过jspatch,但没有打击其他的热更新方案,包括cordovar、react native、DCloud。封杀jspatch其实是因为jspatch有严重安全漏洞,可以被黑客利用,造成三方黑客可篡改其他App的数据。
使用热更新需要注意:
上架审核期间不要弹出热更新提示
热更新内容使用https下载,避免被三方网络劫持
不要更新违法内容、不要通过热更新破坏应用市场的利益,比如iOS的虚拟支付要老老实实给Apple分钱
如果你的应用没有犯这些错误,应用市场是不会管的
uni-app热更新的更多相关文章
- APP热更新方案
为什么要做热更新 当一个App发布之后,突然发现了一个严重bug需要进行紧急修复,这时候公司各方就会忙得焦头烂额:重新打包App.测试.向各个应用市场和渠道换包.提示用户升级.用户下载.覆盖安装. 重 ...
- Ionic APP 热更新 之 产品发布状态下的热更新搭建,去local-dev-addon插件
上一篇,我们介绍了在本地开发环境下的ionic项目热更新测试, 本文,我们将详细说明如何在去掉cordova-hot-code-push-local-dev-addon插件的情况下,实现热更新. 使用 ...
- Ionic APP 热更新
开门见山,本文主题:cordova-hot-code-push 作用:cordova热更新插件,提供了在应用程序中对基于Web的内容进行自动更新的功能. GitHub地址:https://github ...
- APP热更新方案(转)
本文转载自[http://creator.cnblogs.com/] 博客地址:Zealot Yin 为什么要做热更新 当一个App发布之后,突然发现了一个严重bug需要进行紧急修复,这时候公司各方就 ...
- 移动端APP热更新方案(iOS+Android)
出自:http://www.cnblogs.com/Creator/p/7007694.html 为什么要做热更新 当一个App发布之后,突然发现了一个严重bug需要进行紧急修复,这时候公司各方就会忙 ...
- 小程序容器技术,App热更新与敏捷开发新方案
作为追求代码洁癖的软件工程师,我们对"紧耦合"的技术实现可以说是深恶痛绝.要解决当前企业移动端App日益沉重.难以真正迭代.投入产出比低的问题,首先在技术架构上要实现真正的&quo ...
- H5 App实现热更新,不需要重新安装app
直接上代码吧,你竟然搜到了我的文章就应该知道了,为什么要热更新 //app热更新下载 //假定字符串的每节数都在5位以下 function toNum(a) { //也可以这样写 var c=a.sp ...
- flutter Dynamic updates 热更新 版本更新
比较新的解释 https://juejin.im/entry/5c85c959f265da2d881b5eb8 https://my.oschina.net/u/1464083/blog/297880 ...
- 移动端热更新方案(iOS+Android)
PPT资源包含iOS+Android 各种方案分析:https://github.com/qiyer/Share/blob/master/%E7%83%AD%E6%9B%B4%E6%96%B0%E5% ...
- uniapp中IOS安卓热更新和整包更新app更新
在App.vue中 onLaunch: function() { console.log('App Launch'); // #ifdef APP-PLUS this.getVersion(); // ...
随机推荐
- vue2.0+mint-ui资讯类顶导航和内容页联动实例(不是很完美)
<template> <div> <div class="navbox"> <div class="nav"> ...
- JPA EntityManager 在没有实体类的情况下返回Map
JPA entityManager.createNativeQuery()执行原生的SQL,当我们查询结果没有对应的实体类时,query.getResultList()返回的是一个List<Ob ...
- Java IO(十七)FIleReader 和 FileWriter
Java IO(十七)FIleReader 和 FileWriter 一.介绍 FIleReader 和 FileWriter 是读写字符文件的便利类,分别继承于 InputStreamReader ...
- C#线程 入门
Threading in C# 第一部分: 入门 介绍和概念 C#支持通过多线程并行执行代码.线程是一个独立的执行路径,能够与其他线程同时运行.C#客户端程序(控制台,WPF或Windows窗体) ...
- 泛微 e-cology OA 前台SQL注入
poc https://github.com/AdministratorGithub/e-cology-OA-SQL 用法:python elog_sql.py http://target 不存在返回 ...
- 网站的安全性对seo优化至关重要-智狐SEO顾问
网站的安全性对seo优化至关重要 作者:智狐zhihuseo 从大的范围来看,网站安全性能也属于seo的范畴之一.域名被恶意泛解析就是网站安全性能低下的特征之一,如果网站域名被恶意泛解析,会直接 ...
- OAuth + Security -1 - 认证服务器配置
配置 基础包依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...
- jchdl - GSL实例:FullAdder
https://mp.weixin.qq.com/s/CtT08xZON0YxnheqDM2FAw 全加器是能够计算低位进位的二进制加法电路.与半加器相比,全加器不只考虑本位计算结果是否有进位,也考虑 ...
- 实现 (5).add(3).minus(2),使其输出结果为:6
function check(n) { n = Number(n); return isNaN(n) ? 0 : n; } function add(n) { n = check(n); return ...
- 从SpringBoot源码分析 主程序配置类加载过程
1.@Import(AutoConfigurationPackages.Registrar.class) 初始SpringBoot 我们知道在SpringBoot 启动类上有一个@SpringBoot ...