147 lines
4 KiB
JavaScript
147 lines
4 KiB
JavaScript
// 简化版本管理器 - 检测版本更新并提醒用户清理缓存
|
||
const config = require('../config/config.js');
|
||
|
||
class VersionManager {
|
||
constructor() {
|
||
this.currentVersion = config.appVersion;
|
||
this.versionKey = 'app_version';
|
||
this.isShowingDialog = false; // 防止重复弹框
|
||
}
|
||
|
||
/**
|
||
* 检查版本更新
|
||
* @returns {boolean} 如果有版本更新或正在显示弹框,返回 true
|
||
*/
|
||
checkVersionUpdate() {
|
||
try {
|
||
// 🔥 如果正在显示弹框,直接返回 true,阻塞所有逻辑
|
||
if (this.isShowingDialog) {
|
||
console.log('⚠️ 版本更新弹框正在显示中,阻塞后续逻辑');
|
||
return true;
|
||
}
|
||
|
||
const storedVersion = wx.getStorageSync(this.versionKey);
|
||
// 首次安装直接保存版本号
|
||
if (!storedVersion) {
|
||
wx.setStorageSync(this.versionKey, this.currentVersion);
|
||
return false;
|
||
}
|
||
|
||
// 版本不一致,提醒用户清理缓存
|
||
if (storedVersion !== this.currentVersion) {
|
||
console.log('⚠️ 检测到版本更新,旧版本:', storedVersion, '新版本:', this.currentVersion);
|
||
// 防止重复弹框
|
||
if (!this.isShowingDialog) {
|
||
// 🔥 立即设置标志,防止在弹框显示期间其他逻辑继续执行
|
||
this.isShowingDialog = true;
|
||
// 延迟一帧显示弹框,确保标志已设置
|
||
setTimeout(() => {
|
||
this.showClearCacheDialog(storedVersion, this.currentVersion);
|
||
}, 0);
|
||
}
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
} catch (error) {
|
||
console.error('版本检查失败:', error);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 显示版本更新提示框
|
||
*/
|
||
showClearCacheDialog(oldVersion, newVersion) {
|
||
// 设置标志防止重复弹框
|
||
this.isShowingDialog = true;
|
||
|
||
wx.showModal({
|
||
title: '版本更新',
|
||
content: `FindMe已更新版本,需要重新登录以确保应用正常运行。`,
|
||
showCancel: false, // 不显示取消按钮
|
||
confirmText: '确定',
|
||
success: (res) => {
|
||
// 用户只能点确定,直接清理缓存并跳转
|
||
this.clearCacheAndRestart(newVersion);
|
||
},
|
||
complete: () => {
|
||
// 对话框关闭后重置标志
|
||
this.isShowingDialog = false;
|
||
}
|
||
});
|
||
}
|
||
|
||
/**
|
||
* 清理缓存并重启应用
|
||
*/
|
||
clearCacheAndRestart(newVersion) {
|
||
wx.showLoading({
|
||
title: '正在重启应用...',
|
||
mask: true
|
||
});
|
||
|
||
try {
|
||
// 🔥 清除全局登录状态(必须在清除存储之前)
|
||
try {
|
||
const app = getApp();
|
||
if (app) {
|
||
app.globalData.isLoggedIn = false;
|
||
app.globalData.userInfo = null;
|
||
app.globalData.nim = null; // 清除 NIM 实例
|
||
console.log('✅ 已清除全局登录状态');
|
||
}
|
||
} catch (globalError) {
|
||
console.error('清除全局状态失败:', globalError);
|
||
}
|
||
|
||
// 清理所有缓存数据
|
||
wx.clearStorageSync();
|
||
|
||
// 更新版本号
|
||
wx.setStorageSync(this.versionKey, newVersion);
|
||
|
||
setTimeout(() => {
|
||
wx.hideLoading();
|
||
|
||
// 直接跳转到登录页面
|
||
wx.reLaunch({
|
||
url: '/pages/login/login'
|
||
});
|
||
}, 1500); // 稍微延长一点时间确保清理完成
|
||
|
||
} catch (error) {
|
||
wx.hideLoading();
|
||
console.error('清理缓存失败:', error);
|
||
|
||
// 🔥 即使清理失败也清除全局状态
|
||
try {
|
||
const app = getApp();
|
||
if (app) {
|
||
app.globalData.isLoggedIn = false;
|
||
app.globalData.userInfo = null;
|
||
app.globalData.nim = null;
|
||
}
|
||
} catch (globalError) {
|
||
console.error('清除全局状态失败:', globalError);
|
||
}
|
||
|
||
wx.showToast({
|
||
title: '清理失败,请手动清理',
|
||
icon: 'error'
|
||
});
|
||
|
||
// 即使清理失败也跳转到登录页
|
||
setTimeout(() => {
|
||
wx.reLaunch({
|
||
url: '/pages/login/login'
|
||
});
|
||
}, 2000);
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
// 导出单例
|
||
module.exports = new VersionManager();
|
||
|