uni-app热更新问题,一天都解决不了

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

uni-app热更新问题,一天都解决不了

安装失败 code:10 message:error in opening zip file file: _doc/uniapp_temp_1731922721349/download/cfg1.0.9.wgt

确认文件是下载成功的, 如果文件不存在, 提示不一样

// 版本对比  
192.168.0.104 - - [18/Nov/2024:17:38:43 +0800] "GET /api/version?appid=__UNI__5A67C62&version=1.0.7&name=Android HTTP/1.1" 200 253 "-" "Mozilla/5.0 (Linux; Android 10; ELE-AL00 Build/HUAWEIELE-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/99.0.4844.88 Mobile Safari/537.36 uni-app Html5Plus/1.0 (Immersed/34.0)"  
// 成功下载  
192.168.0.104 - - [18/Nov/2024:17:38:45 +0800] "GET /down/cfg1.0.9.wgt HTTP/1.1" 200 3727445 "-" "Mozilla/5.0 (Linux; Android 10; ELE-AL00 Build/HUAWEIELE-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/99.0.4844.88 Mobile Safari/537.36 uni-app (Immersed/34.0)"
<!-- 权限声明 -->  
<!-- 添加读取外部存储权限 -->  
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />  
<!-- 添加写入外部存储权限 -->  
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
<!-- 添加网络访问权限 -->  
<uses-permission android:name="android.permission.INTERNET" />  
<uses-permission android:name="android.permission.INSTALL_PACKAGES"/>  
<uses-permission android:name="android.permission.CAMERA"/>  
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
// 安卓版本配置  
minSdkVersion 21  
targetSdkVersion 30  
versionCode 1  
versionName "1.0.7"  
//#ifdef APP-PLUS  
// 获取本地应用资源版本号  
console.log('版本号'+plus.runtime.appid)  
plus.runtime.getProperty(plus.runtime.appid, function(info) {  
var server = "http://192.168.0.101/api/version"; //检查更新地址  
var v = info.version  
var req = { //升级检测数据  
"appid": plus.runtime.appid,  
"version": info.version,  
"name": plus.os.name  
};  
console.log(req)  
uni.request({  
url: server,  
data: req,  
success: (res) => {  
// console.log(res.data)  
// console.log(res.data.app_version)  
if(res.data.code == 200){  
console.log("当前版本:"+res.data.data.app_version_android)  
if(res.data.data.app_version != v){  
uni.showModal({ //提醒用户更新  
title: "更新提示!!",  
content: res.data.data.app_version_content,  
confirmColor:'#ff6600',  
showCancel:false,  
success: (ret) => {  
if (ret.confirm) {  
//plus.runtime.openURL(res.data.data.app_version_android);  
// 下载文件资源到本地,下载刚才打包的 .wgt文件  
uni.downloadFile({  
url: res.data.data.app_version_download,  // 下载资源的 url  
success: (downloadResult) => {  
uni.$showMsg('downloadResult.statusCode ' + downloadResult.statusCode)  
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;  
uni.$showMsg('安装成功')  
console.log('安装成功','install success...');  
}, function(e) {  
uni.$showMsg('安装失败 code:' + e.code + ' message:' + e.message + ' file:' + downloadResult.tempFilePath)  
console.error('安装失败','install fail...');  
});  
}  
}  
);  
}  
}  
);  
}  
}  
// 整包更新  
}  
})  
});  

1 回复

针对你提到的uni-app热更新问题,这里提供一个基本的实现思路和代码示例,希望能帮助你快速定位和解决问题。在uni-app中,热更新(Hot Update, HU)通常依赖于服务器提供的更新包和客户端的更新逻辑。以下是一个简化的热更新实现过程:

1. 服务器端配置

首先,确保你的服务器能够提供一个API接口来返回最新的版本信息以及更新包的下载URL。例如,使用Node.js和Express框架,可以创建一个简单的服务器:

const express = require('express');
const app = express();
const port = 3000;

app.get('/update/info', (req, res) => {
  const updateInfo = {
    version: '1.0.1', // 当前最新版本号
    url: 'https://example.com/update/package-1.0.1.zip' // 更新包下载链接
  };
  res.json(updateInfo);
});

app.listen(port, () => {
  console.log(`Server running at http://localhost:${port}`);
});

2. 客户端检查更新

在uni-app的启动逻辑中,添加检查更新的代码。这里假设你使用的是uni.request来发起网络请求:

// app.js 或 main.js
uni.request({
  url: 'http://localhost:3000/update/info',
  success: (res) => {
    const { version, url } = res.data;
    const currentVersion = '1.0.0'; // 当前客户端版本

    if (version !== currentVersion) {
      // 触发下载并安装更新包
      uni.downloadFile({
        url,
        success: (downloadRes) => {
          const tempFilePath = downloadRes.tempFilePath;
          // 这里需要根据uni-app的文档实现具体的安装逻辑
          // 通常情况下,你可能需要解压更新包并替换相应的文件
          console.log('Update package downloaded:', tempFilePath);
          // 假设有一个函数 applyUpdate(filePath) 用于应用更新
          // applyUpdate(tempFilePath);
        },
        fail: (err) => {
          console.error('Failed to download update package:', err);
        }
      });
    } else {
      console.log('No update needed.');
    }
  },
  fail: (err) => {
    console.error('Failed to check for updates:', err);
  }
});

注意事项

  • 权限处理:确保应用有权限下载文件,特别是在iOS和Android平台上。
  • 解压与应用更新:上述代码示例中省略了解压和应用更新包的具体实现,这通常依赖于第三方库或平台特定的API。
  • 错误处理:在实际应用中,需要更完善的错误处理和用户提示机制。
  • 安全性:确保更新包的完整性和来源的可靠性,避免被恶意篡改。

希望这个示例能帮助你解决uni-app的热更新问题。如果问题依然存在,建议检查网络请求、服务器响应以及文件处理的具体实现细节。

回到顶部