uni-app App资源在线升级更新

发布于 1周前 作者 nodeper 来自 Uni-App

uni-app App资源在线升级更新

官方已发布APP升级中心,支持原生APP整包升级和wgt资源包升级。 详见 https://uniapp.dcloud.io/uniCloud/upgrade-center

注意:uni-app的热更新另见文档 https://ask.dcloud.net.cn/article/35667

5+应用可使用以下方式进行升级

本文重点介绍5+应用资源独立升级,相对整包升级有以下优势:

  • 无需重新提交应用市场审核更新,降低更新周期;
  • 无需用户手动点击操作安装更新,优化用户体验;
  • App资源相对整包体积更小,升级速度更快。

生成移动App资源升级包

  • 在HBuilder中编辑好新的移动App资源后,更新manifest.json的版本号
    原来版本是1.0,新版本修改为2.0:
    更新manifest.json

  • 在HBuilder中生成升级包文件(wgt)
    菜单“发行” -> “制作移动App资源升级包”:
    生成wgt
    在以下界面中通过“浏览”按钮选择保存路径,点击“确定”保存wgt文件:
    保存wgt

  • 生成wgt后提交到手机可访问的网络地址
    App资源升级包下载地址:
    http://www.dcloud.io/docs/a/update/H5EF3C469.wgt
    为了模拟正常的升级检测流程,添加以下检测升级地址(返回最新版本号):
    http://demo.dcloud.net.cn/test/update/check.php

应用中检测更新资源

检测服务器上是否有新版本

  • 获取当前应用的版本号
var wgtVer=null;  
function plusReady(){  
// ......  
// 获取本地应用资源版本号  
plus.runtime.getProperty(plus.runtime.appid,function(inf){  
    wgtVer=inf.version;  
    console.log("当前应用版本:"+wgtVer);  
});  
}  
if(window.plus){  
plusReady();  
}else{  
document.addEventListener('plusready',plusReady,false);  
}
  • 发起ajax请求检测是否有新版本
// 检测更新  
var checkUrl="http://demo.dcloud.net.cn/test/update/check.php";  
function checkUpdate(){  
plus.nativeUI.showWaiting("检测更新...");  
var xhr=new XMLHttpRequest();  
xhr.onreadystatechange=function(){  
    switch(xhr.readyState){  
        case 4:  
        plus.nativeUI.closeWaiting();  
        if(xhr.status==200){  
            console.log("检测更新成功:"+xhr.responseText);  
            var newVer=xhr.responseText;  
            if(wgtVer&&newVer&&(wgtVer!=newVer)){  
                downWgt();  // 下载升级包  
            }else{  
                plus.nativeUI.alert("无新版本可更新!");  
            }  
        }else{  
            console.log("检测更新失败!");  
            plus.nativeUI.alert("检测更新失败!");  
        }  
        break;  
        default:  
        break;  
    }  
}  
xhr.open('GET',checkUrl);  
xhr.send();  
}

更新应用资源

  • 从服务器下载应用资源包(wgt文件)
// 下载wgt文件  
var wgtUrl="http://demo.dcloud.net.cn/test/update/H5EF3C469.wgt";  
function downWgt(){  
plus.nativeUI.showWaiting("下载wgt文件...");  
plus.downloader.createDownload( wgtUrl, {filename:"_doc/update/"}, function(d,status){  
    if ( status == 200 ) {   
        console.log("下载wgt成功:"+d.filename);  
        installWgt(d.filename); // 安装wgt包  
    } else {  
        console.log("下载wgt失败!");  
        plus.nativeUI.alert("下载wgt失败!");  
    }  
    plus.nativeUI.closeWaiting();  
}).start();  
}
  • 更新应用资源包(wgt文件)
// 更新应用资源  
function installWgt(path){  
plus.nativeUI.showWaiting("安装wgt文件...");  
plus.runtime.install(path,{},function(){  
    plus.nativeUI.closeWaiting();  
    console.log("安装wgt文件成功!");  
    plus.nativeUI.alert("应用资源更新完成!",function(){  
        plus.runtime.restart();  
    });  
},function(e){  
    plus.nativeUI.closeWaiting();  
    console.log("安装wgt文件失败["+e.code+"]:"+e.message);  
    plus.nativeUI.alert("安装wgt文件失败["+e.code+"]:"+e.message);  
});  
}

1 回复

在uni-app中实现应用资源的在线升级更新,可以通过以下步骤实现。关键在于从服务器获取最新版本的应用资源包,并在用户同意后下载、解压并替换现有资源。以下是一个简化的代码示例,展示了如何实现这一功能。

1. 检查版本更新

首先,我们需要一个接口来检查服务器上的最新版本。

// 检查版本更新
function checkForUpdates() {
    uni.request({
        url: 'https://your-server.com/api/check-update',
        method: 'GET',
        success: (res) => {
            const latestVersion = res.data.version;
            const currentVersion = uni.getSystemInfoSync().version; // 注意:这里获取的是uni-app框架版本,实际应使用自定义的应用版本号
            if (latestVersion > currentVersion) {
                uni.showModal({
                    title: '更新提示',
                    content: `发现新版本${latestVersion},是否立即更新?`,
                    success: (result) => {
                        if (result.confirm) {
                            downloadAndUpdate(latestVersion);
                        }
                    }
                });
            }
        },
        fail: (err) => {
            console.error('检查更新失败', err);
        }
    });
}

2. 下载并解压更新包

下载更新包并解压到指定目录。这里假设更新包是一个zip文件。

// 下载并更新
function downloadAndUpdate(version) {
    const updateUrl = `https://your-server.com/updates/${version}.zip`;
    const tempFilePath = `${uni.env.USER_DATA_PATH}/update.zip`;

    uni.downloadFile({
        url: updateUrl,
        tempFilePath: tempFilePath,
        success: (downloadRes) => {
            // 解压文件
            const targetDir = `${uni.env.USER_DATA_PATH}/update_extract/`;
            uni.unzipFile({
                src: tempFilePath,
                dest: targetDir,
                success: () => {
                    // 替换现有资源(根据实际需求处理)
                    replaceResources(targetDir);
                },
                fail: (err) => {
                    console.error('解压失败', err);
                }
            });
        },
        fail: (err) => {
            console.error('下载失败', err);
        }
    });
}

// 替换资源函数(示例,需根据具体资源结构调整)
function replaceResources(targetDir) {
    // TODO: 实现资源替换逻辑
}

3. 调用检查更新函数

在应用的启动逻辑中调用checkForUpdates函数。

// 应用启动时检查更新
onLaunch() {
    checkForUpdates();
    // 其他启动逻辑...
}

注意:上述代码是一个简化的示例,实际应用中需要考虑更多细节,如错误处理、下载进度显示、用户取消更新操作、权限管理(特别是文件读写权限)等。此外,对于大型应用,可能需要考虑增量更新而不是全量更新,以节省用户带宽和时间。

回到顶部