import callCheckVersion from './call-check-version' // 推荐再App.vue中使用 const PACKAGE_INFO_KEY = '__package_info__' export default function(isShowNoUpdateToast = false) { // #ifdef APP-PLUS return new Promise((resolve, reject) => { callCheckVersion().then(async (e) => { if (!e.result) return; const { code, message, is_silently, // 是否静默更新 url, // 安装包下载地址 platform, // 安装包平台 type // 安装包类型 } = e.result; // 此处逻辑仅为实例,可自行编写 if (code > 0 && isUpdate(e.result)) { console.log("更新逻辑。。。") // 腾讯云和阿里云下载链接不同,需要处理一下,阿里云会原样返回 /** const { fileList } = await uniCloud.getTempFileURL({ fileList: [url] }); if (fileList[0].tempFileURL) e.result.url = fileList[0].tempFileURL; resolve(e) **/ // 静默更新,只有wgt有 if (is_silently) { uni.downloadFile({ url: e.result.url, success: res => { if (res.statusCode == 200) { // 下载好直接安装,下次启动生效 plus.runtime.install(res.tempFilePath, { force: false }); } } }); return; } /** * 提示升级一 * 使用 uni.showModal */ // return updateUseModal(e.result) /** * 提示升级二 * 官方适配的升级弹窗,可自行替换资源适配UI风格 */ uni.setStorageSync(PACKAGE_INFO_KEY, e.result) uni.navigateTo({ url: `/pages/setting/upgrade-popup?local_storage_key=${PACKAGE_INFO_KEY}`, fail: (err) => { console.error('更新弹框跳转失败', err) uni.removeStorageSync(PACKAGE_INFO_KEY) } }) } else { if(isShowNoUpdateToast) { uni.showToast({ icon:'none', title:"当前已是最新版本!" }); uni.hideLoading(); } } if (code < 0) { // TODO 云函数报错处理 console.error(message) reject(e) } }).catch(err => { // TODO 云函数报错处理 console.error(err.message) reject(err) }) }); // #endif } /** * 使用 uni.showModal 升级 */ function updateUseModal(packageInfo) { const { title, // 标题 contents, // 升级内容 is_mandatory, // 是否强制更新 url, // 安装包下载地址 platform, // 安装包平台 type // 安装包类型 } = packageInfo; let isWGT = type === 'wgt' let isiOS = !isWGT ? platform.includes('iOS') : false; let confirmText = isiOS ? '立即跳转更新' : '立即下载更新' return uni.showModal({ title, content: contents, showCancel: !is_mandatory, confirmText, success: res => { if (res.cancel) return; // 安装包下载 if (isiOS) { plus.runtime.openURL(url); return; } uni.showToast({ title: '后台下载中……', duration: 1000 }); // wgt 和 安卓下载更新 downloadTask = uni.downloadFile({ url, success: res => { if (res.statusCode !== 200) { console.error('下载安装包失败', err); return; } // 下载好直接安装,下次启动生效 plus.runtime.install(res.tempFilePath, { force: false }, () => { if (is_mandatory) { //更新完重启app plus.runtime.restart(); return; } uni.showModal({ title: '安装成功是否重启?', success: res => { if (res.confirm) { //更新完重启app plus.runtime.restart(); } } }); }, err => { uni.showModal({ title: '更新失败', content: err .message, showCancel: false }); }); } }); } }); } /** * */ function isUpdate(packageInfo) { let isUpdate = false; const { type, // 安装包类型 version, //版本 min_uni_version, //最低原生版本 localVersion,//本地版本 localWgtVersion //本地wgtVersion } = packageInfo; let isWGT = type === 'wgt'; // console.log("更新类型:" + type); // console.log("服务器版本:" + version); // console.log("wgt更新需要原生最低版本:" + min_uni_version); // console.log("本地版本:" + localVersion); // console.log("本地wgt版本:" + localWgtVersion); if(isWGT) { //wgt更新,服务器版本,必须大于本地wgt版本,并且本地版本必须大于最低原生版本 // console.log("服务器版本与本地wgt版本比较:" + compare(version, localWgtVersion)); // console.log("本地版本与服务器原生最低需要版本比较:" + compare(localVersion, min_uni_version)); // console.log((compare(version, localWgtVersion) == 1)); // console.log(compare(localVersion, min_uni_version) != -1) isUpdate = (compare(version, localWgtVersion) == 1) && (compare(localVersion, min_uni_version) != -1); } else { isUpdate = compare(version, localVersion) == 1; } // console.log("是否需要更新:" + isUpdate); return isUpdate; } /** * 对比版本号,如需要,请自行修改判断规则 * 支持比对 ("3.0.0.0.0.1.0.1", "3.0.0.0.0.1") ("3.0.0.1", "3.0") ("3.1.1", "3.1.1.1") 之类的 * @param {Object} v1 * @param {Object} v2 * v1 > v2 return 1 * v1 < v2 return -1 * v1 == v2 return 0 */ function compare(v1 = '0', v2 = '0') { v1 = String(v1).split('.') v2 = String(v2).split('.') const minVersionLens = Math.min(v1.length, v2.length); let result = 0; for (let i = 0; i < minVersionLens; i++) { const curV1 = Number(v1[i]) const curV2 = Number(v2[i]) if (curV1 > curV2) { result = 1 break; } else if(curV1 < curV2) { result = -1 break; } } if (result === 0 && (v1.length !== v2.length)) { const v1BiggerThenv2 = v1.length > v2.length; const maxLensVersion = v1BiggerThenv2 ? v1 : v2; for (let i = minVersionLens; i < maxLensVersion.length; i++) { const curVersion = Number(maxLensVersion[i]) if (curVersion > 0) { v1BiggerThenv2 ? result = 1 : result = -1 break; } } } return result; }