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 scanuuid;
final String? version;
bool? isforceupdate;
final bool? iscontinuouschat;
final String? updatedescription;
final String? updatepackageaddress;
@ -91,6 +92,7 @@ class DBProduct {
required this.productimage,
required this.scanuuid,
required this.version,
required this.isforceupdate, //该产品固件版本是否强制更新
required this.iscontinuouschat,
required this.updatedescription,
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?,
scanuuid: json['scanuuid'] as String,
version: json['version'] as String?,
isforceupdate: json['isforceupdate'] as bool?,
iscontinuouschat: json['iscontinuouschat'] as bool?,
updatedescription: json['updatedescription'] as String?,
updatepackageaddress: json['updatepackageaddress'] as String?,
@ -91,6 +92,7 @@ Map<String, dynamic> _$DBProductToJson(DBProduct instance) => <String, dynamic>{
'productimage': instance.productimage,
'scanuuid': instance.scanuuid,
'version': instance.version,
'isforceupdate': instance.isforceupdate,
'iscontinuouschat': instance.iscontinuouschat,
'devicename': instance.devicename,
'updatedescription': instance.updatedescription,

18
lib/data/services/ota_check_service.dart

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

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

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

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

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

Loading…
Cancel
Save