uni-app 在 APP 端的版本强制更新与热更新

整包更新与热更新的区别

① 整包更新是指下载完整 apk 文件进行覆盖安装

② 热更新是指把 app 有改动的地方打包进 wgt 文件,只更新 wgt 文件中的内容,不进行整包安装,在用户视角也叫做省流量更新

版本号规则约束

建议严格遵循 Semantic Versioning 2.0.0 语义化版本规范。

主版本号:不兼容的 API 修改。
次版本号:向下兼容的功能性新增。
修订号:向下兼容的问题修正。

实现的原理

① 开发后台版本管理功能,每次发版上传 android 安装包,记录版本号、是热更新还是整包更新、是否强制更新等。

② 每次打开 app(onLaunch生命周期)的时候,通过接口请求最新版本信息,再获取当前安装包信息,对比版本号。

③ 如果版本号不一致,且接口获取的版本号大于当前应用的版本号,则进行整包更新或热更新。

④ IOS 并不存在下载安装包覆盖安装这种操作,所以在 IOS 平台需要跳转到 App Store 进行更新。

onLaunch() {
  this.upgradeAPP(); // APP版本升级
},

在 methods 中

/* APP版本升级 */
upgradeAPP() {
  // #ifdef APP-PLUS
  // 只在正式环境下启用,避免更新影响开发和测试环境(这步取决于你的需求)
  if (process.env.NODE_ENV === "production") {
    // 获取 app 运行信息
    plus.runtime.getProperty(plus.runtime.appid, widgetInfo => {
      // 通过接口获取最新版本信息
      getVersion({ platform: "1" }).then(res => {
        if (!res) return;
        // 版本号得到的是类似 '7.0.1' 的字符串,把它去除.并转为纯数字
        const appCode = parseInt(res.app_code.split(".").join(""));
        const version = parseInt(widgetInfo.version.split(".").join(""));
        // 只有接口版本号 > 当前包版本号才进行更新
        if (appCode > version && res.type == "0") {
          this.updateHot(res.download_url); // 热更新,下载更新文件(这一步可以先显示更新提示的 ui,用户点击更新后再下载更新)
        } else if (appCode > version && res.type == "1") {
          this.updatePackage(res.download_url); // 整包更新(这一步可以先显示更新提示的 ui,用户点击更新后再下载更新)
        }
      });
    });
  }
  // #endif
},
/* 整包更新 */
updatePackage(url) {
  // IOS 平台不允许这样更新,所以我们需要跳转到 appstore 进行更新
  if (uni.getSystemInfoSync().platform === "ios") {
    plus.runtime.launchApplication({ action: "itms-apps://xxx" }); // 调用第三方程序(链接可以通过接口获取)
  } else {
    // 构建了下载任务,但此时并未开始下载
    const dtask = plus.downloader.createDownload(url, {}, (downloadResult, status) => {
      if (status === 200) {
        plus.runtime.install(
          downloadResult.filename,
          { force: false },
          () => {
            plus.runtime.restart(); // 安装成功后重启
          },
          () => {
            uni.showToast({ icon: "none", title: "下载更新失败" });
          }
        );
      }
    });
    dtask.start(); // 执行安装包下载,开始下载任务
  }
},
/* 热更新 */
updateHot(url) {
  uni.downloadFile({
    url,
    success: downloadResult => {
      if (downloadResult.statusCode === 200) {
        // 下载更新文件成功后进行安装,force.是否强制安装(如果将要安装应用的版本号不高于现有应用的版本号则终止安装,并返回安装失败)
        plus.runtime.install(downloadResult.tempFilePath, { force: false }, () => {
          uni.showToast({ title: "更新完毕,即将重启", icon: "none", position: "bottom", mask: true });
          setTimeout(() => {
            plus.runtime.restart(); // 安装完成后重启应用
          }, 2000);
        });
      }
    }
  });
}

参考:uniapp开发APP:强制更新和热更新

猜你喜欢

转载自blog.csdn.net/AdminGuan/article/details/133989039
今日推荐