Browse Source

feat(ota): 添加强制更新功能并优化版本检查逻辑

- 在DBProduct模型中添加isforceupdate字段标记强制更新
- 修改版本检查逻辑仅支持升级不支持降级
- 当检测到强制更新版本时不标记为已检查
- 缩短首页引导后的OTA检查延迟时间
newdev_shunjiawei
lxm 11 months ago
parent
commit
5859f99519
  1. 2
      lib/data/models/appconfig_model.dart
  2. 2
      lib/data/models/appconfig_model.g.dart
  3. 18
      lib/data/services/ota_check_service.dart
  4. 2
      lib/modules/home/controllers/home_controller.dart
  5. 13
      lib/modules/ota_upgrade/controllers/ota_core_contropller.dart

2
lib/data/models/appconfig_model.dart

@ -79,6 +79,7 @@ class DBProduct {
final String? productimage; final String? productimage;
final String scanuuid; final String scanuuid;
final String? version; final String? version;
bool? isforceupdate;
final bool? iscontinuouschat; final bool? iscontinuouschat;
final String? updatedescription; final String? updatedescription;
final String? updatepackageaddress; final String? updatepackageaddress;
@ -91,6 +92,7 @@ class DBProduct {
required this.productimage, required this.productimage,
required this.scanuuid, required this.scanuuid,
required this.version, required this.version,
required this.isforceupdate, //该产品固件版本是否强制更新
required this.iscontinuouschat, required this.iscontinuouschat,
required this.updatedescription, required this.updatedescription,
required this.updatepackageaddress, required this.updatepackageaddress,

2
lib/data/models/appconfig_model.g.dart

@ -79,6 +79,7 @@ DBProduct _$DBProductFromJson(Map<String, dynamic> json) => DBProduct(
productimage: json['productimage'] as String?, productimage: json['productimage'] as String?,
scanuuid: json['scanuuid'] as String, scanuuid: json['scanuuid'] as String,
version: json['version'] as String?, version: json['version'] as String?,
isforceupdate: json['isforceupdate'] as bool?,
iscontinuouschat: json['iscontinuouschat'] as bool?, iscontinuouschat: json['iscontinuouschat'] as bool?,
updatedescription: json['updatedescription'] as String?, updatedescription: json['updatedescription'] as String?,
updatepackageaddress: json['updatepackageaddress'] as String?, updatepackageaddress: json['updatepackageaddress'] as String?,
@ -91,6 +92,7 @@ Map<String, dynamic> _$DBProductToJson(DBProduct instance) => <String, dynamic>{
'productimage': instance.productimage, 'productimage': instance.productimage,
'scanuuid': instance.scanuuid, 'scanuuid': instance.scanuuid,
'version': instance.version, 'version': instance.version,
'isforceupdate': instance.isforceupdate,
'iscontinuouschat': instance.iscontinuouschat, 'iscontinuouschat': instance.iscontinuouschat,
'devicename': instance.devicename, 'devicename': instance.devicename,
'updatedescription': instance.updatedescription, 'updatedescription': instance.updatedescription,

18
lib/data/services/ota_check_service.dart

@ -57,6 +57,7 @@ class OtaCheckService extends GetxService {
/// [isFullyConnected] 设备是否完全连接 /// [isFullyConnected] 设备是否完全连接
/// 返回是否成功执行了检查 /// 返回是否成功执行了检查
Future<bool> performOtaCheck(bool isFullyConnected) async { Future<bool> performOtaCheck(bool isFullyConnected) async {
bool isForceUpdate = false;
try { try {
// 检查是否应该进行OTA检查 // 检查是否应该进行OTA检查
if (!shouldCheckOta()) { if (!shouldCheckOta()) {
@ -95,7 +96,12 @@ class OtaCheckService extends GetxService {
_otaCoreService.isNewVersionAvailable(currentVersion, latestVersion); _otaCoreService.isNewVersionAvailable(currentVersion, latestVersion);
if (hasUpdate) { if (hasUpdate) {
Logger.d(_tag, '发现新版本,准备显示升级提醒'); isForceUpdate = latestInfo['isForceUpdate'] as bool? ?? false;
if (isForceUpdate) {
Logger.d(_tag, '发现强制更新版本,准备显示升级提醒');
} else {
Logger.d(_tag, '发现新版本,准备显示升级提醒');
}
// 再次确认当前在Home页面(防止异步执行期间页面切换) // 再次确认当前在Home页面(防止异步执行期间页面切换)
if (_isCurrentlyOnHomePage()) { if (_isCurrentlyOnHomePage()) {
@ -109,12 +115,18 @@ class OtaCheckService extends GetxService {
} }
// 标记为已检查(无论是否有更新都标记为已检查) // 标记为已检查(无论是否有更新都标记为已检查)
_markAsChecked(); if (!isForceUpdate) {
_markAsChecked();
}
_isCheckingInProgress = false;
return true; return true;
} catch (e) { } catch (e) {
Logger.e(_tag, '检查OTA升级失败: $e'); Logger.e(_tag, '检查OTA升级失败: $e');
// 即使检查失败,也标记为已检查,避免重复尝试 // 即使检查失败,也标记为已检查,避免重复尝试
_markAsChecked(); if (!isForceUpdate) {
_markAsChecked();
}
_isCheckingInProgress = false;
return false; return false;
} }
} }

2
lib/modules/home/controllers/home_controller.dart

@ -277,7 +277,7 @@ class HomeController extends GetxController {
// 连接成功后检查OTA升级 // 连接成功后检查OTA升级
if (noviceGuideService.isHomeGuide) { if (noviceGuideService.isHomeGuide) {
Future.delayed(const Duration(seconds: 2), () { Future.delayed(const Duration(seconds: 1), () {
_checkOtaUpgrade(); _checkOtaUpgrade();
}); });
} }

13
lib/modules/ota_upgrade/controllers/ota_core_contropller.dart

@ -525,17 +525,20 @@ class OtaCoreService {
} }
} }
product.isforceupdate = product.version?.contains("+");
return { return {
'latestVersion': product.version ?? "", 'latestVersion': product.version?.split('+').first ?? "",
'updateDescription': product.updatedescription ?? "", 'updateDescription': product.updatedescription ?? "",
'updatePackageAddress': product.updatepackageaddress ?? "", 'updatePackageAddress': product.updatepackageaddress ?? "",
'isForceUpdate': product.isforceupdate ?? false,
}; };
} }
/// 比较版本号,判断是否有新版本可用 /// 比较版本号,判断是否有新版本可用
/// [currentVersion] 当前版本号 /// [currentVersion] 当前版本号
/// [latestVersion] 最新版本号 /// [latestVersion] 最新版本号
/// 返回true表示有新版本可用(支持升级和降级) /// 返回true表示有新版本可用(只支持升级)
bool isNewVersionAvailable(String currentVersion, String latestVersion) { bool isNewVersionAvailable(String currentVersion, String latestVersion) {
try { try {
List<int> currentParts = List<int> currentParts =
@ -555,10 +558,12 @@ class OtaCoreService {
latestParts.add(0); latestParts.add(0);
} }
// 比较每一段,只要有不同就返回true(支持升级和降级) // 从高位到低位比较版本号
for (int i = 0; i < maxLength; i++) { for (int i = 0; i < maxLength; i++) {
if (latestParts[i] != currentParts[i]) { if (latestParts[i] > currentParts[i]) {
return true; return true;
} else if (latestParts[i] < currentParts[i]) {
return false;
} }
} }

Loading…
Cancel
Save