diff --git a/Ink Canvas/Helpers/AutoUpdateHelper.cs b/Ink Canvas/Helpers/AutoUpdateHelper.cs index d860f4b8..abaef2d6 100644 --- a/Ink Canvas/Helpers/AutoUpdateHelper.cs +++ b/Ink Canvas/Helpers/AutoUpdateHelper.cs @@ -513,7 +513,7 @@ namespace Ink_Canvas.Helpers // 尝试获取当前版本的发布时间 DateTime? currentVersionReleaseTime = await GetVersionReleaseTime(localVersion, channel); - bool shouldPush = DeviceIdentifier.ShouldPushUpdate(apiVersion, releaseTime, true, currentVersionReleaseTime); // 明确标记为自动更新 + bool shouldPush = DeviceIdentifier.ShouldPushUpdate(apiVersion, releaseTime, true, currentVersionReleaseTime, localVersion); // 明确标记为自动更新 if (!shouldPush) { var priority = DeviceIdentifier.GetUpdatePriority(); @@ -569,7 +569,7 @@ namespace Ink_Canvas.Helpers // 尝试获取当前版本的发布时间 DateTime? currentVersionReleaseTime = await GetVersionReleaseTime(localVersion, channel); - bool shouldPush = DeviceIdentifier.ShouldPushUpdate(remoteVersion, DateTime.Now, true, currentVersionReleaseTime); // 明确标记为自动更新 + bool shouldPush = DeviceIdentifier.ShouldPushUpdate(remoteVersion, DateTime.Now, true, currentVersionReleaseTime, localVersion); // 明确标记为自动更新 if (!shouldPush) { var priority = DeviceIdentifier.GetUpdatePriority(); diff --git a/Ink Canvas/Helpers/DeviceIdentifier.cs b/Ink Canvas/Helpers/DeviceIdentifier.cs index ae9e19d4..3d93661a 100644 --- a/Ink Canvas/Helpers/DeviceIdentifier.cs +++ b/Ink Canvas/Helpers/DeviceIdentifier.cs @@ -1084,7 +1084,7 @@ namespace Ink_Canvas.Helpers /// 是否为自动更新检查(默认true,false表示版本修复) /// 当前版本发布时间 /// 是否应该推送更新 - public static bool ShouldPushUpdate(string updateVersion, DateTime releaseTime, bool isAutoUpdate = true, DateTime? currentVersionReleaseTime = null) + public static bool ShouldPushUpdate(string updateVersion, DateTime releaseTime, bool isAutoUpdate = true, DateTime? currentVersionReleaseTime = null, string localVersion = null) { try { @@ -1116,6 +1116,25 @@ namespace Ink_Canvas.Helpers daysBetweenVersions = (DateTime.Now - releaseTime).TotalDays; } + // 当无法获取版本发布时间时,判断版本号差异 + if (!currentVersionReleaseTime.HasValue && !string.IsNullOrEmpty(localVersion)) + { + int versionDiff = CalculateVersionGenerationDifference(localVersion, updateVersion); + LogHelper.WriteLogToFile($"DeviceIdentifier | 无法获取版本发布时间,使用版本号差异判断 - 本地版本: {localVersion}, 远程版本: {updateVersion}, 代数差异: {versionDiff}"); + + // 当版本号代数差异大于3时自动更新 + if (versionDiff > 3) + { + LogHelper.WriteLogToFile($"DeviceIdentifier | 版本号代数差异({versionDiff})大于3,自动更新"); + return true; + } + else + { + LogHelper.WriteLogToFile($"DeviceIdentifier | 版本号代数差异({versionDiff})不大于3,暂不更新"); + return false; + } + } + // 计算最近活跃度(最后一次使用距今的天数) var daysSinceLastUse = (DateTime.Now - stats.LastLaunchTime).TotalDays; @@ -1295,6 +1314,77 @@ namespace Ink_Canvas.Helpers } } + /// + /// 计算版本号代数差异 + /// + /// 本地版本号 + /// 远程版本号 + /// 版本号代数差异,如果无法计算则返回0 + private static int CalculateVersionGenerationDifference(string localVersion, string remoteVersion) + { + try + { + if (string.IsNullOrEmpty(localVersion) || string.IsNullOrEmpty(remoteVersion)) + return 0; + + // 移除可能的前缀(如 "v") + var cleanLocal = localVersion.TrimStart('v', 'V'); + var cleanRemote = remoteVersion.TrimStart('v', 'V'); + + // 解析版本号 (格式: X.X.X.X) + var localParts = cleanLocal.Split('.'); + var remoteParts = cleanRemote.Split('.'); + + if (localParts.Length < 4 || remoteParts.Length < 4) + return 0; + + // 解析四个版本号部分 + if (int.TryParse(localParts[0], out int localMajor) && + int.TryParse(localParts[1], out int localMinor) && + int.TryParse(localParts[2], out int localBuild) && + int.TryParse(localParts[3], out int localRevision) && + int.TryParse(remoteParts[0], out int remoteMajor) && + int.TryParse(remoteParts[1], out int remoteMinor) && + int.TryParse(remoteParts[2], out int remoteBuild) && + int.TryParse(remoteParts[3], out int remoteRevision)) + { + // 计算代数差异:主版本号差异 * 1000 + 次版本号差异 * 100 + 构建号差异 * 10 + 修订号差异 + int majorDiff = remoteMajor - localMajor; + int minorDiff = remoteMinor - localMinor; + int buildDiff = remoteBuild - localBuild; + int revisionDiff = remoteRevision - localRevision; + + // 如果主版本号不同,则代数差异很大 + if (majorDiff != 0) + { + return majorDiff * 1000 + minorDiff * 100 + buildDiff * 10 + revisionDiff; + } + + // 如果次版本号不同,则代数差异中等 + if (minorDiff != 0) + { + return minorDiff * 100 + buildDiff * 10 + revisionDiff; + } + + // 如果构建号不同,则代数差异较小 + if (buildDiff != 0) + { + return buildDiff * 10 + revisionDiff; + } + + // 只有修订号不同,代数差异最小 + return revisionDiff; + } + + return 0; + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"DeviceIdentifier | 计算版本号代数差异失败: {ex.Message}", LogHelper.LogType.Warning); + return 0; + } + } + /// /// 根据更新类型获取紧急程度倍数(仅用于自动更新分级) ///