3***@qq.com
3***@qq.com
  • 发布:2024-09-18 15:49
  • 更新:2024-09-18 15:49
  • 阅读:140

热更新的静默更新会导致数据错误的优化方案

分类:uni-app

官方的热更新升级方案中是支持静默更新的,但是静默更新如果不重启常常会有页面样式错乱、数据加载错误等问题,看组件源码我们可以发现下载完成后是立即执行了wgt安装的操作,此时不重启app就会导致以上问题,这里我的思路是想在app在后台时执行安装并重启,或者在下次打开时执行安装并重启。

方案一、应用置于后台运行时安装热更新包并重启。
优点:更新会比较及时,只要应用置于后台了就会执行更新;
缺点:用户返回app时会执行安装重启,此时有明显的重启操作(安装完之后,我的wgt包20M需等3秒左右会重启),重启后会回到首页,这里可以记录重启前的页面,重启后重新定位该页面。

方案二、应用完全退出后重启时安装热更新包并再次重启。
优点:用户不会感觉到很明显的重启操作,不影响用户正常操作;
缺点:第一次启动时会有较长的时间停留在启动页(wgt包20M会停留在启动页7秒左右)安装完的重启几乎无感,很快,当然我们可以制作一个nvue的前端页面来代替启动页,并在这个页面用文字提示用户正在加载资源什么的(类似游戏打开先检查一番资源),获取用户信任,否则长时间的停留在启动页容易让用户误以为是app卡死。

主要的代码部分

uni-upgrade-center-app/utils/check-update.ts

// 静默更新,只有wgt有  
                    if (uniUpgradeCenterResult.is_silently) {  
                        uni.downloadFile({  
                            url,  
                            success: res => {  
                                if (res.statusCode == 200) {  
                                    uni.setStorageSync('WGTFilePath', res.tempFilePath)  
                                    // 下载好直接安装,下次启动生效  
                                    // plus.runtime.install(res.tempFilePath, {  
                                    //  force: false  
                                    // });  
                                }  
                            }  
                        });  
                        return;  
                    }  
保存wgt包的文件路径

App.vue
方案一:

onHide: function() {  
            let WGTFilePath = uni.getStorageSync('WGTFilePath')  
            if (WGTFilePath)  
                plus.runtime.install(WGTFilePath, {  
                    force: false  
                }, () => {  
                    uni.setStorageSync('WGTFilePath', '')  
                    plus.runtime.restart()  
                    return  
                })  
        },  

方案二:

onLaunch: function() {  
            let WGTFilePath = uni.getStorageSync('WGTFilePath')  
            if (WGTFilePath)  
                plus.runtime.install(WGTFilePath, {  
                    force: false  
                }, () => {  
                    uni.setStorageSync('WGTFilePath', '')  
                    plus.runtime.restart()  
                    return  
                })  
        },  

onShow: function() {  
            let WGTFilePath = uni.getStorageSync('WGTFilePath')  
            if (!WGTFilePath)//手动关闭启动页  
                plus.navigator.closeSplashscreen()  
},  

需要在配置文件关闭自动关闭启动页,并在app.vue手动处理  
  "splashscreen" : {  
            "alwaysShowBeforeRender" : false,  
            "waiting" : false,  
            "autoclose" : false,  
            "delay" : 0  
        },  
0 关注 分享

要回复文章请先登录注册