import { getLastData } from '../api/user.js' export const checkAppUpdate = () => { // 开发环境跳过检查 const isDev = process.env.NODE_ENV === 'development' // if (isDev) { console.log('开发环境,不执行更新检查') return // } // 获取当前应用信息 plus.runtime.getProperty(plus.runtime.appid, (info) => { const currentVersion = info.version getLastData() .then((res) => { // let res = { // data: { // versionName: 'v1.6.83', // forceUpdate: '1', // androidPath: 'https://app.liuyingyong.cn/build/download/3c26e400-3a33-11f1-8997-a16e76fa35b3', // // androidPath: 'http://112.4.144.18:8040/shiningCloud/file/canneng_wulian.apk', // iosPath: 'xxxx', // }, // } if (!res?.data) { console.log('未获取到版本信息') return } // 适配新的接口返回格式 const { versionName, androidPath, iosPath, forceUpdate = '1' } = res.data // 版本相同则不需要更新 if (versionName.includes(currentVersion)) { console.log('已是最新版本') return } const isForce = forceUpdate === '1' // 字符串 '1' 表示强制更新 const iosUrl = iosPath handleUpdate({ version: versionName, androidPath, iosUrl, isForce }) }) .catch((err) => { console.error('获取版本接口失败', err) }) }) } /** * 处理更新逻辑 */ const handleUpdate = ({ version, androidPath, iosUrl, isForce }) => { const isAndroid = plus.os.name === 'Android' const isIOS = plus.os.name === 'iOS' if (isAndroid) { handleAndroidUpdate({ androidPath, isForce }) } else if (isIOS) { handleIOSUpdate({ iosUrl, isForce }) } else { console.warn('未知操作系统') } } /** * 处理安卓更新 */ const handleAndroidUpdate = ({ androidPath, isForce }) => { if (!androidPath?.length) { console.error('未找到安卓安装包') uni.showToast({ title: '更新包不存在', icon: 'error', }) return } const downloadUrl = androidPath uni.showModal({ title: '更新提示', content: '发现新版本,是否立即更新?', showCancel: !isForce, // 强制更新隐藏取消按钮 confirmText: '去更新', cancelText: '暂不更新', success: (modalRes) => { if (modalRes.confirm) { downloadAndInstallApk(downloadUrl) } else if (isForce) { // 强制更新且用户取消,退出应用 plus.runtime.quit() } }, }) } /** * 处理iOS更新 */ const handleIOSUpdate = ({ iosUrl, isForce }) => { if (!iosUrl) { console.error('未找到iOS下载链接') uni.showToast({ title: '更新链接不存在', icon: 'error', }) return } uni.showModal({ title: '更新提示', content: '发现新版本,请前往 App Store 更新', showCancel: !isForce, confirmText: '去更新', cancelText: '暂不更新', success: (modalRes) => { if (modalRes.confirm) { plus.runtime.openURL(iosUrl) } // 强制更新时,无论确认还是取消都退出应用 if (isForce) { setTimeout(() => { plus.runtime.quit() }, 300) // 给跳转留一点时间 } }, }) } /** * 下载并安装APK(安卓专用) */ const downloadAndInstallApk = (url) => { // 显示原生进度条 let progressWaiting = plus.nativeUI.showWaiting('正在下载中,请稍等...', { modal: true, round: true, close: false, // 不允许用户关闭 padlock: true, // 锁定屏幕 }) const options = { filename: '_doc/update/canneng_wulian.apk', timeout: 120, } const downloadTask = plus.downloader.createDownload(url, options, (downloadedFile, status) => { progressWaiting.close() if (status === 200) { installApk(downloadedFile.filename, url) } else { handleDownloadError(url) } }) // // 更新进度 downloadTask.addEventListener('statechanged', (task) => { if (task.state === 3 && task.totalSize > 0) { const percent = ((task.downloadedSize / task.totalSize) * 100).toFixed(0) console.log("🚀 ~ downloadAndInstallApk ~ percent:", percent) // 直接更新 waiting 的标题,不会闪烁 progressWaiting.setTitle(`正在下载更新 ${percent}%`) } }) downloadTask.start() } /** * 安装APK */ const installApk = (filePath, downloadUrl) => { console.log('🚀 ~ installApk ~ filePath:', filePath) plus.runtime.install( filePath, { force: true }, () => { // 安装成功 uni.showModal({ title: '安装成功', content: '是否立即重启应用?', showCancel: false, confirmText: '立即重启', success: () => { plus.runtime.restart() }, }) }, (error) => { console.error('安装失败', error) uni.showModal({ title: '安装失败', content: `安装失败:${error.message}\n请检查是否已开启安装权限`, confirmText: '重试', cancelText: '取消', success: (res) => { if (res.confirm) { downloadAndInstallApk(downloadUrl) } }, }) }, ) } /** * 处理下载错误 */ const handleDownloadError = (downloadUrl) => { uni.showModal({ title: '下载失败', content: '网络异常或下载链接失效,是否重试?', confirmText: '重试', cancelText: '取消', success: (res) => { if (res.confirm) { downloadAndInstallApk(downloadUrl) } }, }) }