说明:此次只涉及uniapp的wgt包热更新,因为后端没空搞,所以就利用测试服务器搞了一个纯前端的wgt资源包热更新,为了方便查看下载反馈,下面代码里加了一些提示性组件;
1、首先配置wgt包热更新环境,需使用最新版HbuilderX(当前为v4.6.6),并修改manifest.json中的以下配置项:
官网链接里面也有很多注意事项:https://uniapp.dcloud.net.cn/collocation/manifest-app.html
2、在manifest.json配置页面中添加安卓安装权限,具体设置方式如图所示(可根据实际需求进行调整):
3、将官网wgt资源热更新写一个js文件,具体如下:
export default () => {
// #ifdef APP-PLUS
plus.runtime.getProperty(plus.runtime.appid, function (widgetInfo) {
uni.downloadFile({
url: 'http://test.com/one.wgt',
success: (downloadResult) => {
uni.showToast({
title:'wgt下载中...',
icon: 'none',
duration: 1000
})
if(downloadResult){
if (downloadResult.statusCode === 200) {
plus.runtime.install(
downloadResult.tempFilePath, {
force: false //true表示强制安装,不进行版本号的校验;false则需要版本号校验(即wgt的版本号要大于当前app版本号即可)
},
function() {
uni.showModal({
title: '成功提示',
content: '热更新成功,请重启应用',
showCancel: false,
success: function(res) {
if (res.confirm) {
plus.runtime.restart() //自动重启软件
}
}
})
},
function(e) {
uni.showModal({
title: '失败提示',
content: e,
showCancel: false,
})
}
);
}
}
}
})
//下面是官方代码
// plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {
// uni.request({
// url: 'http://www.example.com/update/',
// data: {
// version: widgetInfo.version,
// name: widgetInfo.name
// },
// success: (result) => {
// var data = result.data;
// if (data.update && data.wgtUrl) {
// uni.downloadFile({
// url: data.wgtUrl,
// success: (downloadResult) => {
// if (downloadResult.statusCode === 200) {
// plus.runtime.install(downloadResult.tempFilePath, {
// force: false
// }, function() {
// console.log('install success...');
// plus.runtime.restart();
// }, function(e) {
// console.error('install fail...');
// });
// }
// }
// });
// }
// }
// });
// });
})
// #endif
}
3.1:由于缺少后端接口支持,wgt热更新功能比官方版本少了一个接口环节。目前采用直接访问测试服务器上的wgt包来实现更新,例如: http://192.168.55.31:3000/one.wgt (注:以上链接仅为示例,非真实地址)
3.2:下面是里面各个数据的说明:
1、plus 变量仅在手机或模拟器环境下才会包含有效数据:
// #ifdef APP-PLUS 只有app或者模拟器才能触发这块代码,plus变量才有值
plus.runtime.getProperty(plus.runtime.appid, function (widgetInfo) {})
// #endif
2、建议将 uni.downloadFile 的 url 参数配置为可以直接通过浏览器下载 wgt 包的地址
3、uni.downloadFile 成功回调返回的 downloadResult 对象包含以下信息(仅供参考):
{
errMsg: "downloadFile:ok", //wgt包的下载状态
statusCode: 200, //wgt包的状态码
tempFilePath: "blob:http://localhost:8080/605-8f81-4b38-8ed2-5800dc0" //客户端存储wgt路径
}
4、plus.runtime.install()
方法的第二个参数force
用于控制安装行为:当设为false
时,要求WGT资源包的版本号必须高于当前App版本才能安装;设为true
时则强制安装,跳过版本号校验。但需要注意强制安装可能导致安装循环问题。
4、App.vue文件的onLaunch里面进行调用wgt热更新代码:
import hotUpdate from './utils/hotUpdate'
onLaunch: function() {
uni.showToast({
title:'准备更新',
icon: 'none',
duration: 1000
})
setTimeout(() => {
//等待页面加载完成后弹出
hotUpdate()
}, 2000);
}
5、如果跟我一样想要实现纯前端加服务器代理的wgt资源热更新,总结需要注意下面几项:
5.1:确保wgt资源包可以放浏览器地址栏直接下载
5.2:wgt资源包的版本号一定要大于安装的app版本号
5.3:建议将wgt资源与app原生资源区分展示,便于直观验证热更新效果。
6、如果想通过测试服务器代理wgt资源包但遇到nginx跨域问题,可以参考以下配置代码来解决。nginx.conf相关配置如下:
server{
listen 3000;
server_name localhost;
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;
add_header 'Access-Control-Max-Age' 1728000 always;
//下面代理不变,记得放server这个里面
}
7、最后感谢UniApp插件市场的赵永强大佬提供的帮助,大佬是真的有求必应,推荐去交流群里跟大佬沟通,插件地址:https://ext.dcloud.net.cn/plugin?id=7286