diff --git a/lib/app_upgrade_simple.dart b/lib/app_upgrade_simple.dart index 2988732..150f9da 100644 --- a/lib/app_upgrade_simple.dart +++ b/lib/app_upgrade_simple.dart @@ -75,6 +75,21 @@ class _SimpleAppUpgradePlugin { } /// 比较版本号是否已更新 + /// + /// [targetVersion] 目标版本名称(如 "1.0.0") + /// [targetBuildNumber] 目标构建号 + /// + /// 返回 true 表示当前版本已更新到目标版本或更高版本 + /// 返回 false 表示当前版本低于目标版本,需要升级 + /// + /// 判断逻辑: + /// 1. 优先比较 buildNumber(构建号): + /// - 当前 buildNumber < 目标 buildNumber → 未更新,需要升级 + /// - 当前 buildNumber > 目标 buildNumber → 已更新 + /// - 当前 buildNumber == 目标 buildNumber → 继续比较版本名称 + /// 2. buildNumber 相同时,比较 versionName: + /// - 当前版本 >= 目标版本 → 已更新 + /// - 当前版本 < 目标版本 → 未更新,需要升级 Future isVersionUpdated(String targetVersion, int? targetBuildNumber) async { try { final appInfo = await getCurrentAppInfo(); @@ -86,16 +101,66 @@ class _SimpleAppUpgradePlugin { // 优先比较构建号(更准确) if (targetBuildNumber != null && targetBuildNumber > 0) { - return currentBuildNumber >= targetBuildNumber; + // 1. 首先比较 buildCode(构建号) + if (currentBuildNumber < targetBuildNumber) { + // 当前 buildCode < 目标版本,未更新 + return false; + } else if (currentBuildNumber > targetBuildNumber) { + // 当前 buildCode > 目标版本,已更新 + return true; + } + + // 2. buildCode 相同时,比较 versionName 字符串版本号 + // 当前版本 >= 目标版本时,表示已更新 + return _compareVersionStrings(currentVersion, targetVersion) >= 0; } - // 备用方案:比较版本号 - return currentVersion == targetVersion; + // 备用方案:只比较版本号字符串 + return _compareVersionStrings(currentVersion, targetVersion) >= 0; } catch (e) { debugPrint('版本对比失败: $e'); return false; } } + + /// 比较版本号字符串 + /// + /// [v1] 第一个版本号字符串(如 "1.2.3") + /// [v2] 第二个版本号字符串(如 "1.3.0") + /// + /// 返回值: + /// - -1 表示 v1 < v2(第一个版本低于第二个版本) + /// - 0 表示 v1 == v2(版本相同) + /// - 1 表示 v1 > v2(第一个版本高于第二个版本) + /// + /// 示例: + /// - _compareVersionStrings("1.2.3", "1.3.0") 返回 -1 + /// - _compareVersionStrings("2.0.0", "1.9.9") 返回 1 + /// - _compareVersionStrings("1.0.0", "1.0.0") 返回 0 + int _compareVersionStrings(String v1, String v2) { + try { + final v1Parts = v1.split('.').map((e) => int.tryParse(e) ?? 0).toList(); + final v2Parts = v2.split('.').map((e) => int.tryParse(e) ?? 0).toList(); + + final maxLength = v1Parts.length > v2Parts.length ? v1Parts.length : v2Parts.length; + + for (int i = 0; i < maxLength; i++) { + final part1 = i < v1Parts.length ? v1Parts[i] : 0; + final part2 = i < v2Parts.length ? v2Parts[i] : 0; + + if (part1 < part2) { + return -1; + } else if (part1 > part2) { + return 1; + } + } + + return 0; + } catch (e) { + // 如果解析失败,使用字符串比较 + return v1.compareTo(v2); + } + } } /// 升级配置选项