uniapp如何实现自动更新功能

在uniapp中如何实现应用的自动更新功能?需要检测新版本并提示用户下载安装,最好能支持整包更新和热更新两种方式。具体应该怎么操作?有没有完整的代码示例或插件推荐?

2 回复

在uniapp中,可通过以下步骤实现自动更新:

  1. 使用uni.getUpdateManager()创建更新管理器
  2. 监听onCheckForUpdate检查更新
  3. 调用applyUpdate()应用更新
  4. 建议在App.vue的onLaunch中调用

注意:仅App端支持此功能,H5和小程序需使用各自平台的更新机制。


在 UniApp 中实现自动更新功能,可以通过以下步骤完成。这主要涉及检测版本更新、下载新版本资源包,以及引导用户重启应用。以下是具体实现方案:

实现步骤

  1. 检测版本更新
    在应用启动时,通过接口请求服务器,获取最新版本号,并与当前应用版本对比。如果服务器版本更高,则触发更新流程。

  2. 下载更新包
    使用 UniApp 的 uni.downloadFile API 下载新的 WGT 资源包(适用于原生 App 平台)。

  3. 安装更新
    下载完成后,通过 uni.installWgt(仅 App 端支持)安装资源包,并提示用户重启应用。

代码示例

以下是一个简单的实现代码,适用于 App 端(H5 和小程序不支持此更新方式):

// 在 App.vue 的 onLaunch 或页面中调用
function checkUpdate() {
  // 假设从服务器获取最新版本信息,这里用静态数据示例
  const serverVersion = '2.0.0'; // 服务器返回的最新版本
  const currentVersion = plus.runtime.version; // 当前应用版本

  if (compareVersion(serverVersion, currentVersion) > 0) {
    uni.showModal({
      title: '更新提示',
      content: '发现新版本,是否立即更新?',
      success: (res) => {
        if (res.confirm) {
          downloadAndInstall(serverVersion);
        }
      }
    });
  }
}

// 版本号比较函数
function compareVersion(v1, v2) {
  const arr1 = v1.split('.');
  const arr2 = v2.split('.');
  for (let i = 0; i < Math.max(arr1.length, arr2.length); i++) {
    const num1 = parseInt(arr1[i]) || 0;
    const num2 = parseInt(arr2[i]) || 0;
    if (num1 > num2) return 1;
    if (num1 < num2) return -1;
  }
  return 0;
}

// 下载并安装 WGT 包
function downloadAndInstall(version) {
  const downloadUrl = `https://your-server.com/update_${version}.wgt`; // 替换为实际资源包 URL
  
  uni.downloadFile({
    url: downloadUrl,
    success: (downloadResult) => {
      if (downloadResult.statusCode === 200) {
        plus.runtime.install(downloadResult.tempFilePath, {
          force: true
        }, () => {
          uni.showToast({
            title: '更新完成,重启应用生效',
            icon: 'none'
          });
          // 可引导用户手动重启,或延时后自动重启
          setTimeout(() => {
            plus.runtime.restart();
          }, 2000);
        }, (error) => {
          uni.showToast({ title: '安装失败', icon: 'none' });
          console.error('安装失败:', error);
        });
      }
    },
    fail: (error) => {
      uni.showToast({ title: '下载失败', icon: 'none' });
      console.error('下载失败:', error);
    }
  });
}

// 在应用启动时调用检测
export default {
  onLaunch() {
    // #ifdef APP-PLUS
    checkUpdate();
    // #endif
  }
}

注意事项

  • 平台限制:此方法仅适用于 App 端(Android 和 iOS),H5 和小程序需使用其各自的更新机制(如小程序可通过 wx.getUpdateManager 处理)。
  • 资源包格式:确保服务器提供的更新包为 WGT 格式(仅包含前端资源)。
  • 权限配置:在 App 模块配置中需启用 “WGT 资源增量升级” 权限。
  • 网络和安全:下载 URL 应使用 HTTPS,并确保资源包未被篡改。

通过以上步骤,即可在 UniApp 中实现基本的自动更新功能。根据实际需求,可扩展错误处理或用户交互提示。

回到顶部