diff --git a/making_school_asignment_app/lib/common/job/app_version.dart b/making_school_asignment_app/lib/common/job/app_version.dart index 0b456b8..776fbb9 100644 --- a/making_school_asignment_app/lib/common/job/app_version.dart +++ b/making_school_asignment_app/lib/common/job/app_version.dart @@ -44,10 +44,13 @@ class AppVersion extends Object { this.appFileUrl, this.description, ) { - if (appFileUrl != null) appFileUrl = RequestConfig.imgUrl + appFileUrl!; + if (appFileUrl != null && ftuType != 2) { + appFileUrl = RequestConfig.imgUrl + appFileUrl!; + } } - factory AppVersion.fromJson(Map srcJson) => _$AppVersionFromJson(srcJson); + factory AppVersion.fromJson(Map srcJson) => + _$AppVersionFromJson(srcJson); Map toJson() => _$AppVersionToJson(this); } diff --git a/making_school_asignment_app/lib/common/utils/app_upgrade/DownloadApk.dart b/making_school_asignment_app/lib/common/utils/app_upgrade/DownloadApk.dart index 8215516..1b472af 100644 --- a/making_school_asignment_app/lib/common/utils/app_upgrade/DownloadApk.dart +++ b/making_school_asignment_app/lib/common/utils/app_upgrade/DownloadApk.dart @@ -21,7 +21,8 @@ import 'upgradeLogic.dart'; class DownloadApk { /// 下载安卓更新包 - static Future _downloadAndroid(context, UpdateAppEvent event, UpgradeLogic logic) async { + static Future _downloadAndroid( + context, UpdateAppEvent event, UpgradeLogic logic) async { /// 创建存储文件 Directory? storageDir = await getExternalStorageDirectory(); final storagePath = storageDir?.path ?? '/'; @@ -47,10 +48,12 @@ class DownloadApk { print(e); // toPrint(val: e); } + return null; } // 安装apk - static Future installApk(context, UpdateAppEvent event, UpgradeLogic logic) async { + static Future installApk( + context, UpdateAppEvent event, UpgradeLogic logic) async { try { logic.loadingApk.value = true; File? _apkFile = await _downloadAndroid(context, event, logic); @@ -73,7 +76,9 @@ class DownloadApk { actions: [ MaterialButton( color: Theme.of(context).primaryColor, - child: const Text("我已知晓", style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold)), + child: const Text("我已知晓", + style: TextStyle( + color: Colors.white, fontWeight: FontWeight.bold)), onPressed: () => Navigator.of(context).pop(), ), ], @@ -87,9 +92,12 @@ class DownloadApk { // 其他方式下载 // await SystemNavigator.pop(); // 退出APP var options = ['应用市场更新APP', '浏览器下载并安装APP']; - var uri = Uri.parse('market://details?id=${event.packageName}'); // 应用市场URI - if (!await canLaunchUrl(uri)) options.removeAt(0); // 如果不能打开应用市场 就屏蔽掉 这个安装方式 - String? option = await UpgradePermission.showCustomModalBottomSheet(context, options); + var uri = + Uri.parse('market://details?id=${event.packageName}'); // 应用市场URI + if (!await canLaunchUrl(uri)) + options.removeAt(0); // 如果不能打开应用市场 就屏蔽掉 这个安装方式 + String? option = await UpgradePermission.showCustomModalBottomSheet( + context, options); if (option == '应用市场更新APP') await launchUrl(uri); if (option == '浏览器下载并安装APP') await launchUrl(Uri.parse(event.link)); } catch (_) {} @@ -107,7 +115,8 @@ class DownloadApk { } /// 展示下载进度 - static void showDownloadProgress(context, num received, num total, UpgradeLogic logic) { + static void showDownloadProgress( + context, num received, num total, UpgradeLogic logic) { if (total != -1) { double progress = double.parse((received / total).toStringAsFixed(2)); // debugPrint('下载进度$progress'); @@ -122,7 +131,8 @@ class RestartWidget extends StatefulWidget { const RestartWidget({super.key, required this.child}); static restartApp(BuildContext context) { - final _RestartWidgetState? state = context.findAncestorStateOfType<_RestartWidgetState>(); + final _RestartWidgetState? state = + context.findAncestorStateOfType<_RestartWidgetState>(); state?.restartApp(); } diff --git a/making_school_asignment_app/lib/common/utils/app_upgrade/UpdateDialog.dart b/making_school_asignment_app/lib/common/utils/app_upgrade/UpdateDialog.dart index 00e4f86..1543ba4 100644 --- a/making_school_asignment_app/lib/common/utils/app_upgrade/UpdateDialog.dart +++ b/making_school_asignment_app/lib/common/utils/app_upgrade/UpdateDialog.dart @@ -14,7 +14,6 @@ * @LastEditors: Please set LastEditors * @LastEditTime: 2021-01-12 15:08:43 */ -import 'package:auto_updater/auto_updater.dart'; import 'package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart'; import 'package:get/get.dart'; import 'package:making_school_asignment_app/common/utils/app_upgrade/DownloadApk.dart'; @@ -34,7 +33,8 @@ class UpdateDialog extends Dialog { final UpdateAppEvent updateAppEvent; final String deviceInfo; - const UpdateDialog({super.key, required this.updateAppEvent, required this.deviceInfo}); + const UpdateDialog( + {super.key, required this.updateAppEvent, required this.deviceInfo}); @override Widget build(BuildContext context) { @@ -72,11 +72,17 @@ class UpdateDialog extends Dialog { HtmlWidget( updateAppEvent.description, customStylesBuilder: (element) { - return {'color': '#666666', 'font-weight': 'normal', 'text-decoration': 'none'}; + return { + 'color': '#666666', + 'font-weight': 'normal', + 'text-decoration': 'none' + }; }, - onLoadingBuilder: (context, element, loadingProgress) => const CircularProgressIndicator(), + onLoadingBuilder: (context, element, loadingProgress) => + const CircularProgressIndicator(), renderMode: RenderMode.column, - textStyle: TextStyle(fontSize: 14.sp, color: Colors.black87), + textStyle: + TextStyle(fontSize: 14.sp, color: Colors.black87), ) ], ), @@ -97,7 +103,9 @@ class UpdateDialog extends Dialog { builder: (BuildContext context) { return WillPopScope( onWillPop: () async => false, - child: UpdateDialog(updateAppEvent: updateAppEvent, deviceInfo: updateAppEvent.deviceInfo), + child: UpdateDialog( + updateAppEvent: updateAppEvent, + deviceInfo: updateAppEvent.deviceInfo), ); }, ); @@ -136,7 +144,10 @@ class DownloadProgress extends StatelessWidget { Container( height: 6.h, ), - quickText('更新中...', size: 12.sp, fontWeight: FontWeight.w500, color: const Color.fromRGBO(90, 90, 90, 1)) + quickText('更新中...', + size: 12.sp, + fontWeight: FontWeight.w500, + color: const Color.fromRGBO(90, 90, 90, 1)) ], ); }); @@ -152,7 +163,7 @@ class DownloadButton extends StatelessWidget { // 打开浏览器或者对应的对应市场进行下载 Future toLaunch(UpdateAppEvent data) async { - var uri = Uri.parse('market://details?id=com.yuanxuan.making_school_asignment_app'); + var uri = Uri.parse('market://details?id=${updateAppEvent.packageName}'); if (await canLaunchUrl(uri)) { // 跳进对应的应用市场进行更新操作 return await launchUrl(uri); @@ -181,15 +192,20 @@ class DownloadButton extends StatelessWidget { width: 245.w, decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(42.h)), - gradient: LinearGradient(colors: [primaryColor, primaryColor.withOpacity(0.7)]), + gradient: LinearGradient( + colors: [primaryColor, primaryColor.withOpacity(0.7)]), ), child: MaterialButton( - onPressed: () => easyThrottle('DownloadButton_App_Upgrade', duration: const Duration(milliseconds: 1000), () async { - if (deviceInfo == "android" && updateAppEvent.equipment == Equipment.android) { + onPressed: () => easyThrottle('DownloadButton_App_Upgrade', + duration: const Duration(milliseconds: 1000), () async { + if (deviceInfo == "android" && + updateAppEvent.equipment == Equipment.android) { // 权限检查 判断是否有读写内存的权限 - bool flag = await UpgradePermission(updateAppEvent.deviceInfo).checkPermission(context, updateAppEvent); + bool flag = await UpgradePermission(updateAppEvent.deviceInfo) + .checkPermission(context, updateAppEvent); if (flag) { - flag = await DownloadApk.installApk(context, updateAppEvent, logic); + flag = await DownloadApk.installApk( + context, updateAppEvent, logic); if (!flag) { print('执行到了重置更新按钮的地方....'); logic.downloadRatio.value = 0.0; // 更新失败重置 更新按钮 @@ -201,8 +217,10 @@ class DownloadButton extends StatelessWidget { } // await FlutterClipboard.copy(updateAppEvent.link); // setTimeOut(1000, () => ToastUtils.showInfo('下载链接已经复制到设备,可前往浏览器下载安装')); - } else if (deviceInfo == "ios" && updateAppEvent.equipment == Equipment.ios) { + } else if (deviceInfo == "ios" && + updateAppEvent.equipment == Equipment.ios) { try { + print(updateAppEvent.link); await launchUrlString(updateAppEvent.link); } catch (e) { print('进来更新报错$e'); @@ -214,7 +232,8 @@ class DownloadButton extends StatelessWidget { // await autoUpdater.setScheduledCheckInterval(0); // } }), - child: quickText(!logic.loadingApk.value ? '立即体验' : '正在下载...', size: 16.sp, color: Colors.white, fontWeight: FontWeight.w500), + child: quickText(!logic.loadingApk.value ? '立即体验' : '正在下载...', + size: 16.sp, color: Colors.white, fontWeight: FontWeight.w500), ), ); }); diff --git a/making_school_asignment_app/lib/common/utils/app_upgrade/upgradeLogic.dart b/making_school_asignment_app/lib/common/utils/app_upgrade/upgradeLogic.dart index 3dc4626..e0d9114 100644 --- a/making_school_asignment_app/lib/common/utils/app_upgrade/upgradeLogic.dart +++ b/making_school_asignment_app/lib/common/utils/app_upgrade/upgradeLogic.dart @@ -44,7 +44,8 @@ class UpgradeLogic extends GetxController with RequestToolMixin { return; } - AppVersion? result = await getClient().getLastAppVersion('making_school_asignment_app', deviceType); + AppVersion? result = await getClient() + .getLastAppVersion('making_school_asignment_app', deviceType); if (result != null) { //获取当前版本 PackageInfo packageInfo = await PackageInfo.fromPlatform(); @@ -60,23 +61,31 @@ class UpgradeLogic extends GetxController with RequestToolMixin { 'systemType': deviceType, 'description': result.description ?? 'APP新版本更新' }; - UpdateAppEvent updateAppEvent = UpdateAppEvent.fromJson(json, localVersion, deviceInfo, appName, packageName, typeName: 'systemType'); + UpdateAppEvent updateAppEvent = UpdateAppEvent.fromJson( + json, localVersion, deviceInfo, appName, packageName, + typeName: 'systemType'); if (updateAppEvent.upgrade) { - DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin(); - AndroidDeviceInfo androidInfo = await deviceInfoPlugin.androidInfo; - Permission storagePermission; - if (androidInfo.version.sdkInt >= 33) { - storagePermission = Permission.manageExternalStorage; - } else { - storagePermission = Permission.storage; + if (Platform.isAndroid) { + DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin(); + AndroidDeviceInfo androidInfo = await deviceInfoPlugin.androidInfo; + Permission storagePermission; + if (androidInfo.version.sdkInt >= 33) { + storagePermission = Permission.manageExternalStorage; + } else { + storagePermission = Permission.storage; + } + await PermissionDescribeUtil.instance.toLaunchPermissionRequest( + Get.context ?? context, + title: '储存权限请求', + describe: "为了提供更好的服务,需要获取到存储权限用于保存APP升级文件APK,进行升级", + permissions: [storagePermission], + ); } - PermissionDescribeUtil.instance.toLaunchPermissionRequest( - context, - title: '储存权限请求', - describe: "为了提供更好的服务,需要获取到存储权限用于保存APP升级文件APK,进行升级", - permissions: [storagePermission], + + await UpdateDialog.showUpdateDialog( + Get.context ?? context, + updateAppEvent, ); - await UpdateDialog.showUpdateDialog(context, updateAppEvent); } } } finally { diff --git a/making_school_asignment_app/lib/common/utils/permission_describe_util.dart b/making_school_asignment_app/lib/common/utils/permission_describe_util.dart index b619dcf..4c90103 100644 --- a/making_school_asignment_app/lib/common/utils/permission_describe_util.dart +++ b/making_school_asignment_app/lib/common/utils/permission_describe_util.dart @@ -12,13 +12,18 @@ class PermissionDescribePage extends StatefulWidget { final String describe; final List permissions; - const PermissionDescribePage({required this.title, required this.describe, required this.permissions, super.key}); + const PermissionDescribePage( + {required this.title, + required this.describe, + required this.permissions, + super.key}); @override State createState() => _PermissionDescribePageState(); } -class _PermissionDescribePageState extends State with WidgetsBindingObserver { +class _PermissionDescribePageState extends State + with WidgetsBindingObserver { Timer? _timerPermission; bool theOpenAppSettings = false; int theExecutionFrequency = 0; @@ -132,7 +137,9 @@ class _PermissionDescribePageState extends State with Wi /// 权限发起请求 /// @param List permissions 权限集合 - Future> getStoragePermission(BuildContext context, List permissions, [int executionFrequency = 0]) async { + Future> getStoragePermission( + BuildContext context, List permissions, + [int executionFrequency = 0]) async { Map statusRes = await permissions.request(); List permanentRefusal = []; // 永久拒绝 @@ -173,7 +180,8 @@ class _PermissionDescribePageState extends State with Wi executionFrequency++; } if (executionFrequency <= 1) { - var res = await getStoragePermission(context, [key], executionFrequency); + var res = + await getStoragePermission(context, [key], executionFrequency); permanentRefusal.addAll(res); } else { permanentRefusal.add(key); @@ -231,12 +239,10 @@ class PermissionDescribeUtil { PermissionDescribeUtil._internal(); - static get instance { - return _instance ??= PermissionDescribeUtil._internal(); - } + static get instance => _instance ??= PermissionDescribeUtil._internal(); /// 发起权限请求 - void toLaunchPermissionRequest( + Future toLaunchPermissionRequest( BuildContext context, { required String title, required String describe,