|
|
@ -1,5 +1,6 @@ |
|
|
import 'dart:io'; |
|
|
import 'dart:io'; |
|
|
import 'package:flutter/foundation.dart'; |
|
|
import 'dart:math' as math; |
|
|
|
|
|
|
|
|
import 'package:get/get.dart'; |
|
|
import 'package:get/get.dart'; |
|
|
import 'package:package_info_plus/package_info_plus.dart'; |
|
|
import 'package:package_info_plus/package_info_plus.dart'; |
|
|
import 'package:url_launcher/url_launcher.dart'; |
|
|
import 'package:url_launcher/url_launcher.dart'; |
|
|
@ -8,7 +9,6 @@ import 'package:device_info_plus/device_info_plus.dart'; |
|
|
import 'package:flutter_dotenv/flutter_dotenv.dart'; |
|
|
import 'package:flutter_dotenv/flutter_dotenv.dart'; |
|
|
import '../models/channel_app_model.dart'; |
|
|
import '../models/channel_app_model.dart'; |
|
|
import 'network/api.dart'; |
|
|
import 'network/api.dart'; |
|
|
import 'dart:math' as math; |
|
|
|
|
|
|
|
|
|
|
|
/// 版本更新服务类 |
|
|
/// 版本更新服务类 |
|
|
class VersionUpdateService extends GetxService { |
|
|
class VersionUpdateService extends GetxService { |
|
|
@ -49,7 +49,11 @@ class VersionUpdateService extends GetxService { |
|
|
String get cachedDeviceBrand => _deviceBrand ?? ''; |
|
|
String get cachedDeviceBrand => _deviceBrand ?? ''; |
|
|
|
|
|
|
|
|
/// 获取缓存的渠道信息 |
|
|
/// 获取缓存的渠道信息 |
|
|
UserChannel get cachedChannel => _channel ?? UserChannel.UNKNOWN; |
|
|
UserChannel get cachedChannel => |
|
|
|
|
|
_channel ?? |
|
|
|
|
|
(_platform?.toLowerCase() == 'ios' |
|
|
|
|
|
? UserChannel.GLOBAL_APPLE |
|
|
|
|
|
: UserChannel.GLOBAL_GOOGLE); |
|
|
|
|
|
|
|
|
/// 获取缓存的最新版本 |
|
|
/// 获取缓存的最新版本 |
|
|
String get cachedLatestVersion => _latestVersion ?? ''; |
|
|
String get cachedLatestVersion => _latestVersion ?? ''; |
|
|
@ -90,96 +94,6 @@ class VersionUpdateService extends GetxService { |
|
|
// super.onInit(); |
|
|
// super.onInit(); |
|
|
// } |
|
|
// } |
|
|
|
|
|
|
|
|
/// 获取当前应用版本信息 |
|
|
|
|
|
Future<String> getCurrentVersion() async { |
|
|
|
|
|
try { |
|
|
|
|
|
final packageInfo = await PackageInfo.fromPlatform(); |
|
|
|
|
|
_appVersion = packageInfo.version; |
|
|
|
|
|
_buildNumber = packageInfo.buildNumber; |
|
|
|
|
|
return '${packageInfo.version}+${packageInfo.buildNumber}'; |
|
|
|
|
|
} catch (e) { |
|
|
|
|
|
_logger.e('获取当前版本信息失败: $e'); |
|
|
|
|
|
return '1.0.0'; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// 获取当前平台信息 |
|
|
|
|
|
Future<PlatformInfo> getCurrentPlatformInfo() async { |
|
|
|
|
|
if (Platform.isIOS) { |
|
|
|
|
|
return const PlatformInfo( |
|
|
|
|
|
platform: 'ios', |
|
|
|
|
|
storeType: AppStoreType.appStore, |
|
|
|
|
|
channel: UserChannel.GLOBAL_APPLE, |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (Platform.isAndroid) { |
|
|
|
|
|
// 根据设备品牌判断应用商店类型 |
|
|
|
|
|
return await getAndroidStoreInfoByBrand(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return const PlatformInfo( |
|
|
|
|
|
platform: 'unknown', |
|
|
|
|
|
storeType: AppStoreType.unknown, |
|
|
|
|
|
channel: UserChannel.UNKNOWN, |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// 根据设备品牌获取应用商店信息 |
|
|
|
|
|
/// |
|
|
|
|
|
/// 该方法根据设备品牌判断应用商店类型,并返回对应的 [PlatformInfo] 对象。 |
|
|
|
|
|
/// 如果品牌不在预设列表中,将使用环境变量 [Channel] 或默认值 [UserChannel.GLOBAL_GOOGLE]。 |
|
|
|
|
|
Future<PlatformInfo> getAndroidStoreInfoByBrand() async { |
|
|
|
|
|
try { |
|
|
|
|
|
final deviceInfo = DeviceInfoPlugin(); |
|
|
|
|
|
final androidInfo = await deviceInfo.androidInfo; |
|
|
|
|
|
final brand = androidInfo.brand.toLowerCase(); |
|
|
|
|
|
|
|
|
|
|
|
_deviceBrand = brand; |
|
|
|
|
|
String channelFromEnv = dotenv.env['Channel'] ?? 'OFFICIAL'; |
|
|
|
|
|
_channel = UserChannel.fromName(channelFromEnv); |
|
|
|
|
|
|
|
|
|
|
|
UserChannel brandChannel; //品牌渠道,只用于请求版本更新信息 |
|
|
|
|
|
|
|
|
|
|
|
switch (brand) { |
|
|
|
|
|
case 'huawei': |
|
|
|
|
|
brandChannel = UserChannel.CHINA_HUAWEI; |
|
|
|
|
|
break; |
|
|
|
|
|
case 'xiaomi': |
|
|
|
|
|
case 'redmi': |
|
|
|
|
|
brandChannel = UserChannel.CHINA_XIAOMI; |
|
|
|
|
|
break; |
|
|
|
|
|
case 'oppo': |
|
|
|
|
|
case 'oneplus': |
|
|
|
|
|
brandChannel = UserChannel.CHINA_OPPO; |
|
|
|
|
|
break; |
|
|
|
|
|
case 'vivo': |
|
|
|
|
|
case 'iqoo': |
|
|
|
|
|
brandChannel = UserChannel.CHINA_VIVO; |
|
|
|
|
|
break; |
|
|
|
|
|
case 'honor': |
|
|
|
|
|
brandChannel = UserChannel.CHINA_HONOR; |
|
|
|
|
|
break; |
|
|
|
|
|
default: |
|
|
|
|
|
brandChannel = _channel ?? UserChannel.GLOBAL_GOOGLE; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return PlatformInfo( |
|
|
|
|
|
platform: 'android', |
|
|
|
|
|
storeType: AppStoreType.official, |
|
|
|
|
|
channel: brandChannel, |
|
|
|
|
|
); |
|
|
|
|
|
} catch (e) { |
|
|
|
|
|
_logger.e('获取Android设备信息失败: $e'); |
|
|
|
|
|
return const PlatformInfo( |
|
|
|
|
|
platform: 'android', |
|
|
|
|
|
storeType: AppStoreType.googlePlay, |
|
|
|
|
|
channel: UserChannel.UNKNOWN, |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// 检查版本更新 |
|
|
/// 检查版本更新 |
|
|
Future<VersionUpdateInfo> checkForUpdate() async { |
|
|
Future<VersionUpdateInfo> checkForUpdate() async { |
|
|
if (_lastCheckTime != null && |
|
|
if (_lastCheckTime != null && |
|
|
@ -203,7 +117,7 @@ class VersionUpdateService extends GetxService { |
|
|
final platformInfo = await getCurrentPlatformInfo(); |
|
|
final platformInfo = await getCurrentPlatformInfo(); |
|
|
|
|
|
|
|
|
_platform = platformInfo.platform; |
|
|
_platform = platformInfo.platform; |
|
|
//_channel = platformInfo.channel; |
|
|
_channel = platformInfo.channel; |
|
|
_lastCheckTime = DateTime.now(); |
|
|
_lastCheckTime = DateTime.now(); |
|
|
|
|
|
|
|
|
// 调用后端接口获取最新版本信息 |
|
|
// 调用后端接口获取最新版本信息 |
|
|
@ -233,7 +147,7 @@ class VersionUpdateService extends GetxService { |
|
|
|
|
|
|
|
|
// 设置游客登录显示状态(先用当前渠道结果作为回退,再用.env渠道覆盖以保持一致) |
|
|
// 设置游客登录显示状态(先用当前渠道结果作为回退,再用.env渠道覆盖以保持一致) |
|
|
_isShowTourists = appInfo.tourists; |
|
|
_isShowTourists = appInfo.tourists; |
|
|
if (_channel != platformInfo.channel) { |
|
|
if (Platform.isAndroid && _channel != platformInfo.channel) { |
|
|
//[4]当前渠道与.env渠道不同,需要从.env渠道获取游客登录配置 |
|
|
//[4]当前渠道与.env渠道不同,需要从.env渠道获取游客登录配置 |
|
|
await _refreshTouristsFromEnv(); |
|
|
await _refreshTouristsFromEnv(); |
|
|
} |
|
|
} |
|
|
@ -281,6 +195,97 @@ class VersionUpdateService extends GetxService { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// 获取当前应用版本信息 |
|
|
|
|
|
Future<String> getCurrentVersion() async { |
|
|
|
|
|
try { |
|
|
|
|
|
final packageInfo = await PackageInfo.fromPlatform(); |
|
|
|
|
|
_appVersion = packageInfo.version; |
|
|
|
|
|
_buildNumber = packageInfo.buildNumber; |
|
|
|
|
|
return '${packageInfo.version}+${packageInfo.buildNumber}'; |
|
|
|
|
|
} catch (e) { |
|
|
|
|
|
_logger.e('获取当前版本信息失败: $e'); |
|
|
|
|
|
return '1.0.0'; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// 获取当前平台信息 |
|
|
|
|
|
Future<PlatformInfo> getCurrentPlatformInfo() async { |
|
|
|
|
|
if (Platform.isIOS) { |
|
|
|
|
|
return const PlatformInfo( |
|
|
|
|
|
platform: 'ios', |
|
|
|
|
|
storeType: AppStoreType.appStore, |
|
|
|
|
|
channel: UserChannel.GLOBAL_APPLE, |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (Platform.isAndroid) { |
|
|
|
|
|
// 根据设备品牌判断应用商店类型 |
|
|
|
|
|
return await getAndroidStoreInfoByBrand(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return const PlatformInfo( |
|
|
|
|
|
platform: 'unknown', |
|
|
|
|
|
storeType: AppStoreType.unknown, |
|
|
|
|
|
channel: UserChannel.UNKNOWN, |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// 根据设备品牌获取应用商店信息 |
|
|
|
|
|
/// |
|
|
|
|
|
/// 该方法根据设备品牌判断应用商店类型,并返回对应的 [PlatformInfo] 对象。 |
|
|
|
|
|
/// 如果品牌不在预设列表中,将使用环境变量 [Channel] 或默认值 [UserChannel.GLOBAL_GOOGLE]。 |
|
|
|
|
|
Future<PlatformInfo> getAndroidStoreInfoByBrand() async { |
|
|
|
|
|
try { |
|
|
|
|
|
final deviceInfo = DeviceInfoPlugin(); |
|
|
|
|
|
final androidInfo = await deviceInfo.androidInfo; |
|
|
|
|
|
final brand = androidInfo.brand.toLowerCase(); |
|
|
|
|
|
|
|
|
|
|
|
_deviceBrand = brand; |
|
|
|
|
|
String channelFromEnv = dotenv.env['Channel'] ?? 'OFFICIAL'; |
|
|
|
|
|
Logger().d('channelFromEnv: $channelFromEnv'); |
|
|
|
|
|
_channel = UserChannel.fromName(channelFromEnv); |
|
|
|
|
|
|
|
|
|
|
|
UserChannel brandChannel; //品牌渠道,只用于请求版本更新信息 |
|
|
|
|
|
|
|
|
|
|
|
switch (brand) { |
|
|
|
|
|
case 'huawei': |
|
|
|
|
|
brandChannel = UserChannel.CHINA_HUAWEI; |
|
|
|
|
|
break; |
|
|
|
|
|
case 'xiaomi': |
|
|
|
|
|
case 'redmi': |
|
|
|
|
|
brandChannel = UserChannel.CHINA_XIAOMI; |
|
|
|
|
|
break; |
|
|
|
|
|
case 'oppo': |
|
|
|
|
|
case 'oneplus': |
|
|
|
|
|
brandChannel = UserChannel.CHINA_OPPO; |
|
|
|
|
|
break; |
|
|
|
|
|
case 'vivo': |
|
|
|
|
|
case 'iqoo': |
|
|
|
|
|
brandChannel = UserChannel.CHINA_VIVO; |
|
|
|
|
|
break; |
|
|
|
|
|
case 'honor': |
|
|
|
|
|
brandChannel = UserChannel.CHINA_HONOR; |
|
|
|
|
|
break; |
|
|
|
|
|
default: |
|
|
|
|
|
brandChannel = _channel ?? UserChannel.GLOBAL_GOOGLE; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return PlatformInfo( |
|
|
|
|
|
platform: 'android', |
|
|
|
|
|
storeType: AppStoreType.official, |
|
|
|
|
|
channel: brandChannel, |
|
|
|
|
|
); |
|
|
|
|
|
} catch (e) { |
|
|
|
|
|
_logger.e('获取Android设备信息失败: $e'); |
|
|
|
|
|
return const PlatformInfo( |
|
|
|
|
|
platform: 'android', |
|
|
|
|
|
storeType: AppStoreType.googlePlay, |
|
|
|
|
|
channel: UserChannel.UNKNOWN, |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/// 从.env文件刷新游客登录配置 |
|
|
/// 从.env文件刷新游客登录配置 |
|
|
Future<void> _refreshTouristsFromEnv() async { |
|
|
Future<void> _refreshTouristsFromEnv() async { |
|
|
try { |
|
|
try { |
|
|
|