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(); // ...
随机推荐
- OGG应用进程abend报错无法insert虚拟列
环境11.2.0.4 linux6.9 RAC2节点,ogg版本Version 12.2.0.1.160823 OGGCORE_OGGADP.12.2.0.1.0_PLATFORMS_161019.1 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 统一规范API,包装返回模型
上一篇文章(https://www.cnblogs.com/meowv/p/12916613.html)使用自定义仓储完成了简单的增删改查案例,有心的同学可以看出,我们的返回参数一塌糊涂,显得很不友好 ...
- 避免scrollview内部控件输入时被键盘遮挡,监听键盘弹起,配合做滚动
1,监听键盘 2,根据当前键盘弹起高度与控件的底部位置计算滑动距离 3,根据滑动距离在键盘弹起和隐藏是分别设置动画完成滑动 实现: 1,监听键盘使用 #pragma mark - 键盘监听 ...
- J2EE项目分类管理中,提交表单数据是二进制形式时,对数据的修改失败。category赋值失败。
原因: 在条件判断时,对字符串的比较进行了错误比较. 解决方法: A==B,比较的是两个字符串是否是同一个对象. A.equal(B),比较的是两个字符串内容是否相同. 出现错误是用了第一种比较,应该 ...
- 解决ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) 这种问题需要强行重新修改密码,方法 ...
- web自动化之执行js脚本
from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from seleni ...
- Istio 流量劫持过程
开篇 Istio 流量劫持的文章其实目前可以在servicemesher社区找到一篇非常详细的文章,可查阅:Istio 中的 Sidecar 注入及透明流量劫持过程详解.特别是博主整理的那张" ...
- [Objective-C] 007_Foundation框架之NSString与NSMutableString
在Cocoa Foundation中的NSString和NSMutableString类,为我们提供了Unicode字符串的支持,NSString和NSMutableString类最大的区别是:NSS ...
- sku算法介绍及实现
前言 做过电商项目前端售卖的应该都遇见过不同规格产品库存的计算问题,业界名词叫做sku(stock Keeping Unit),库存量单元对应我们售卖的具体规格,比如一部手机具体型号规格,其中ipho ...
- Rocket - 断句 - Diplomatic Design Patterns: A TileLink Case Study
https://mp.weixin.qq.com/s/afRVgTCYs1Mxu898uSmVaQ 整理一篇介绍Diplomacy和TileLink的文章. 原文链接: https://carrv ...