const UPDATE_URL = 'http://192.168.1.150:8443/updateInfo/' /** * 版本号比较 * @param {Object} v1 eg: 11.0.2 * @param {Object} v2 eg: 11.0.1 * @return {Number} -1 => v1 < v2 * 1 => v1 > v2 * 0 => v1 = v2 */ const compareVersion = function(v1, v2) { if (v1 === v2) return 0 v1 = v1.split('.') v2 = v2.split('.') const len = Math.max(v1.length, v2.length) while (v1.length < len) { v1.push('0') } while (v2.length < len) { v2.push('0') } for (let i = 0; i < len; i++) { const num1 = parseInt(v1[i]) const num2 = parseInt(v2[i]) if (num1 > num2) { return 1 } else if (num1 < num2) { return -1 } } return 0 } export default class UpdateApp { constructor() { this.force = false // 是否为强制更新 this.restart = true // 安装完成后是否需要强制重启 } check() { const that = this return new Promise((resolve, reject) => { plus.runtime.getProperty( plus.runtime.appid, function(widgetInfo) { uni.request({ url: UPDATE_URL, data: { version: widgetInfo.version, appid: plus.runtime.appid }, success: (result) => { // force: true, // 是否为强制更新 // restart: true, // 安装完成后是否需要强制重启 // androidWgtUrl: '****.wgt', // android wgt包地址(热更新时使用) // iosWgtUrl: '', // ios wgt包更新地址(热更新时使用) // androidPkgUrl: '', // android apk 地址(全量更新时使用) // iosPkgUrl: '', // ios 应用商店地址(全量更新时使用,用于直接跳转到应用商店) // remark: '1、用户体验优化\n2、BUG修复' const res = result.data.data // version: widgetInfo.version, // appid: plus.runtime.appid const updateFlag = compareVersion(res.version, widgetInfo.version) if (updateFlag === 0) { resolve({ downloadUrl: null }) return } that.force = res.force that.restart = res.restart const sys = uni.getSystemInfoSync() let downloadUrl = '' if (sys.platform === 'android') { downloadUrl = res.androidWgtUrl || res.androidPkgUrl } else if (sys.platform === 'ios') { downloadUrl = res.iosWgtUrl || res.iosPkgUrl } resolve({ ...res, downloadUrl: downloadUrl }) } }) } ) }) } /** * 下载安装更新包 * @param {String} data */ install(data) { const sys = uni.getSystemInfoSync() if (sys.platform === 'ios' && data.iosPkgUrl) { plus.runtime.openURL(data.iosPkgUrl) return } console.log('install data', data) uni.downloadFile({ url: data.downloadUrl, success: function(downloadResult) { if (downloadResult.statusCode === 200) { plus.runtime.install( downloadResult.tempFilePath, { force: data.force }, function() { console.log('install success...') if (data.restart) { plus.runtime.restart(); } }, function(e) { console.error('install fail...') plus.runtime.quit() } ) } }, error: function(e) { console.log('install error', e) uni.showToast({ position: 'top', title: '更新失败', icon: 'none', duration: 3000 }) } }) } }