uniapp的wgt资源包,实现热更新

        说明:此次只涉及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

### 实现 UniAppWGT 热更新 #### 准备工作 为了实现UniApp 应用程序中使用 Web Gateway Technology (WGT) 文件进行热更新,开发者需要完成一系列准备工作。这包括但不限于配置开发环境、设置服务器端逻辑以及编写客户端代码来处理更新流程。 #### 创建并上传 WGT 更新包 当构建应用程序时,`npm run build:app-plus` 命令会于 `/dist/build/app-plus` 路径下生成用于 Android 和 iOS 平台的应用资源文件夹[^2]。对于希望创建 wgt 格式的热补丁来说,应当仅选取该路径下的内容而不连同外层 `app-plus` 文件夹一起打包成 ZIP 归档;之后更改此压缩文档扩展名为 `${appid}.wgt` ,其中 ${appid} 是指 manifest.json 文件里定义的应用 ID 。这样的 .wgt 文件即成为可被用来执行增量式部署的有效载荷。 #### 客户端检测与下载最新版 WGT 包 在客户端方面,可以通过 JavaScript 方法调用来触发对远程服务器上是否有可用的新版本检查过程。一旦确认存在更高级别的固件可供安装,则可通过如下方式启动实际的数据获取动作: ```javascript downloadWgt() { plus.nativeUI.showWaiting("正在下载..."); var dtask = plus.downloader.createDownload( "http://example.com/path/to/latest.wgt", // 远程地址应替换为真实的URL {}, function(d, status){ if(status == 200){ console.log("下载成功:"+d.filename); // 下一步骤:验证签名和完整性校验 installUpdate(d.filename); // 成功后继续尝试安装新的wgt包 }else{ console.error("下载失败!"); } plus.nativeUI.closeWaiting(); } ); dtask.start(); } ``` 这段代码片段展示了如何利用 Plus API 来发起 HTTP 请求从而获得最新的 `.wgt` 文件,并且提供了基本的成功与否反馈机制[^3]。 #### 执行更新操作 假设上述步骤顺利完成并且已经得到了一个有效的本地副本,在确保其安全性和兼容性的前提条件下可以着手实施真正的覆盖写入动作。通常情况下,这涉及到卸载旧组件并将新组件放置到适当位置的过程。具体而言就是调用相应的方法来进行最终阶段的工作——将之前所提到过的已下载下来的`.wgt`文件应用于当前运行环境中: ```javascript function installUpdate(filePath) { plus.runtime.install( filePath, {}, function(){ alert("安装成功"); location.reload(); // 刷新页面使改动生效 }, function(e){ alert("安装失败:" + e.message); } ) } ``` 以上便是关于怎样借助 WGT 技术达成 UniApp热更新功能的大致介绍[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值