148 lines
4.3 KiB
Dart
Executable File
148 lines
4.3 KiB
Dart
Executable File
import 'package:get/get.dart';
|
|
import 'dart:io' show Platform;
|
|
import 'package:url_launcher/url_launcher.dart';
|
|
import 'package:kaer_with_panels/app/widgets/dialogs/kr_update_dialog.dart';
|
|
import 'package:package_info_plus/package_info_plus.dart';
|
|
import '../localization/app_translations.dart';
|
|
import 'package:kaer_with_panels/app/utils/kr_log_util.dart';
|
|
|
|
import '../model/response/kr_config_data.dart';
|
|
|
|
/// 更新工具类
|
|
class KRUpdateUtil {
|
|
/// 单例模式
|
|
static final KRUpdateUtil _instance = KRUpdateUtil._internal();
|
|
factory KRUpdateUtil() => _instance;
|
|
KRUpdateUtil._internal();
|
|
|
|
/// 当前更新信息
|
|
KRUpdateApplication? _kr_currentUpdateInfo;
|
|
|
|
/// 初始化更新信息
|
|
/// [updateInfo] 更新信息对象
|
|
void kr_initUpdateInfo(KRUpdateApplication updateInfo) {
|
|
_kr_currentUpdateInfo = updateInfo;
|
|
}
|
|
|
|
/// 检查更新
|
|
Future<void> kr_checkUpdate() async {
|
|
if (_kr_currentUpdateInfo == null) {
|
|
return;
|
|
}
|
|
|
|
// 获取当前应用版本号
|
|
final PackageInfo packageInfo = await PackageInfo.fromPlatform();
|
|
final String currentVersion = packageInfo.version;
|
|
|
|
// 比较版本号
|
|
if (_kr_compareVersions(currentVersion, _kr_currentUpdateInfo!.kr_version) <
|
|
0) {
|
|
_kr_showUpdateDialog(_kr_currentUpdateInfo!);
|
|
}
|
|
}
|
|
|
|
/// 比较版本号
|
|
/// 返回值:
|
|
/// -1: 当前版本小于目标版本
|
|
/// 0: 当前版本等于目标版本
|
|
/// 1: 当前版本大于目标版本
|
|
int _kr_compareVersions(String currentVersion, String targetVersion) {
|
|
return currentVersion.compareTo(targetVersion);
|
|
}
|
|
|
|
/// 显示更新对话框
|
|
void _kr_showUpdateDialog(KRUpdateApplication updateInfo) {
|
|
// 获取更新内容
|
|
String? updateContent = updateInfo.kr_version_description;
|
|
|
|
// 如果更新内容为空,使用默认内容
|
|
if (updateContent?.isEmpty ?? true) {
|
|
updateContent = AppTranslations.kr_update.content;
|
|
}
|
|
|
|
KRUpdateDialog.show(
|
|
|
|
version: updateInfo.kr_version,
|
|
updateContent: updateContent,
|
|
onConfirm: () {
|
|
_kr_handleUpdate(updateInfo);
|
|
},
|
|
onCancel: () => Get.back(),
|
|
showCancelButton: true,
|
|
);
|
|
}
|
|
|
|
/// 处理更新
|
|
Future<void> _kr_handleUpdate(KRUpdateApplication updateInfo) async {
|
|
if (updateInfo.kr_url.isEmpty) {
|
|
Get.back();
|
|
return;
|
|
}
|
|
|
|
try {
|
|
final Uri uri = Uri.parse(updateInfo.kr_url);
|
|
|
|
if (Platform.isAndroid) {
|
|
// Android 平台处理
|
|
await _kr_handleAndroidUpdate(uri);
|
|
} else if (Platform.isIOS) {
|
|
// iOS 平台处理
|
|
await _kr_handleIOSUpdate(uri);
|
|
} else if (Platform.isMacOS) {
|
|
// macOS 平台处理
|
|
await _kr_handleMacOSUpdate(uri);
|
|
} else if (Platform.isWindows) {
|
|
// Windows 平台处理
|
|
await _kr_handleWindowsUpdate(uri);
|
|
} else if (Platform.isLinux) {
|
|
// Linux 平台处理
|
|
await _kr_handleLinuxUpdate(uri);
|
|
}
|
|
} catch (e) {
|
|
KRLogUtil.kr_e('更新处理错误: $e', tag: 'UpdateUtil');
|
|
} finally {
|
|
Get.back();
|
|
}
|
|
}
|
|
|
|
/// 处理 Android 平台更新
|
|
Future<void> _kr_handleAndroidUpdate(Uri uri) async {
|
|
// Android 平台通常是下载 APK 文件
|
|
if (await canLaunchUrl(uri)) {
|
|
await launchUrl(uri, mode: LaunchMode.externalApplication);
|
|
}
|
|
}
|
|
|
|
/// 处理 iOS 平台更新
|
|
Future<void> _kr_handleIOSUpdate(Uri uri) async {
|
|
// iOS 平台通常是跳转到 App Store
|
|
if (await canLaunchUrl(uri)) {
|
|
await launchUrl(uri, mode: LaunchMode.externalApplication);
|
|
}
|
|
}
|
|
|
|
/// 处理 macOS 平台更新
|
|
Future<void> _kr_handleMacOSUpdate(Uri uri) async {
|
|
// macOS 平台通常是下载 DMG 文件或跳转到 Mac App Store
|
|
if (await canLaunchUrl(uri)) {
|
|
await launchUrl(uri, mode: LaunchMode.externalApplication);
|
|
}
|
|
}
|
|
|
|
/// 处理 Windows 平台更新
|
|
Future<void> _kr_handleWindowsUpdate(Uri uri) async {
|
|
// Windows 平台通常是下载 exe 安装文件
|
|
if (await canLaunchUrl(uri)) {
|
|
await launchUrl(uri, mode: LaunchMode.externalApplication);
|
|
}
|
|
}
|
|
|
|
/// 处理 Linux 平台更新
|
|
Future<void> _kr_handleLinuxUpdate(Uri uri) async {
|
|
// Linux 平台通常是下载安装包文件
|
|
if (await canLaunchUrl(uri)) {
|
|
await launchUrl(uri, mode: LaunchMode.externalApplication);
|
|
}
|
|
}
|
|
}
|