uniapp在线版本升级如何实现

在uniapp中如何实现在线版本升级功能?需要检测新版本并提示用户下载更新,最好能支持静默更新和强制更新两种模式。求具体的实现方案和代码示例,包括前后端的配置和注意事项。

2 回复

uniapp在线升级可通过以下方式实现:

  1. 使用uni-upgrade-center插件
  2. 后端提供版本检测接口
  3. 对比本地版本号与服务器最新版本
  4. 下载新版wgt资源包
  5. 调用plus.runtime.install安装更新

注意:需在manifest.json中配置版本信息,且仅支持wgt资源更新,不能升级基座。


在UniApp中实现在线版本升级,主要有两种方式:整包更新和wgt资源包更新。以下是具体实现方法:

1. 整包更新(推荐用于大版本更新)

适用于需要更新原生代码或重大功能变更的情况。

// 在App.vue的onLaunch中检测更新
export default {
  onLaunch: function() {
    // #ifdef APP-PLUS
    this.checkUpdate()
    // #endif
  },
  
  methods: {
    checkUpdate() {
      plus.runtime.getProperty(plus.runtime.appid, (widgetInfo) => {
        uni.request({
          url: 'https://your-domain.com/version.json', // 版本检测接口
          data: {
            version: widgetInfo.version,
            platform: uni.getSystemInfoSync().platform
          },
          success: (res) => {
            if (res.data.version !== widgetInfo.version) {
              uni.showModal({
                title: '发现新版本',
                content: res.data.note || '有新版本可用,请立即更新',
                success: (result) => {
                  if (result.confirm) {
                    // 下载新版本
                    this.downloadApp(res.data.url)
                  }
                }
              })
            }
          }
        })
      })
    },
    
    downloadApp(url) {
      uni.showLoading({ title: '下载中...' })
      const downloadTask = uni.downloadFile({
        url: url,
        success: (downloadResult) => {
          if (downloadResult.statusCode === 200) {
            plus.runtime.install(downloadResult.tempFilePath, {
              force: false
            }, () => {
              uni.hideLoading()
              plus.runtime.restart()
            }, (error) => {
              uni.hideLoading()
              uni.showToast({ title: '更新失败', icon: 'none' })
            })
          }
        }
      })
    }
  }
}

2. wgt资源包更新(热更新)

适用于只更新前端资源文件,不需要重新安装应用。

// wgt更新方法
wgtUpdate() {
  plus.runtime.getProperty(plus.runtime.appid, (widgetInfo) => {
    uni.request({
      url: 'https://your-domain.com/wgt-version.json',
      data: {
        version: widgetInfo.version,
        wgtVersion: widgetInfo.versionCode
      },
      success: (res) => {
        if (res.data.wgtVersion > widgetInfo.versionCode) {
          uni.showModal({
            title: '发现新版本',
            content: res.data.note || '有新版本可用,请立即更新',
            success: (result) => {
              if (result.confirm) {
                this.downloadWgt(res.data.wgtUrl)
              }
            }
          })
        }
      }
    })
  })
},

downloadWgt(url) {
  uni.showLoading({ title: '更新中...' })
  const downloadTask = uni.downloadFile({
    url: url,
    success: (downloadResult) => {
      if (downloadResult.statusCode === 200) {
        plus.runtime.install(downloadResult.tempFilePath, {
          force: false
        }, () => {
          uni.hideLoading()
          uni.showToast({ 
            title: '更新完成', 
            success: () => {
              plus.runtime.restart()
            }
          })
        }, (error) => {
          uni.hideLoading()
          uni.showToast({ title: '更新失败', icon: 'none' })
        })
      }
    }
  })
}

3. 版本检测接口示例

// version.json
{
  "version": "2.0.0",
  "versionCode": 200,
  "wgtVersion": 200,
  "url": "https://your-domain.com/app-2.0.0.apk",
  "wgtUrl": "https://your-domain.com/app-2.0.0.wgt",
  "note": "1. 新增用户反馈功能\n2. 优化界面体验\n3. 修复已知问题"
}

注意事项:

  1. 整包更新需要重新安装应用,会中断用户操作
  2. wgt更新不能修改原生代码,只能更新前端资源
  3. iOS应用需要通过App Store更新,不能直接下载安装
  4. 建议在应用启动时检测更新,也可在设置页面提供手动检查功能

选择哪种方式取决于你的更新需求:小功能优化用wgt更新,大版本改动用整包更新。

回到顶部