diff --git a/making_school_asignment_app/appcast.xml b/making_school_asignment_app/appcast.xml new file mode 100644 index 0000000..b088a3c --- /dev/null +++ b/making_school_asignment_app/appcast.xml @@ -0,0 +1,56 @@ + + + + auto_updater_example + Most recent updates to auto_updater_example + en + + + Version 1.0.0 + #发行说明-读取html方式(2选1) + + #发行说明-写死方式(2选1) + + +
  • 1、新增XX功能
  • +
  • 2、新增XX功能
  • + + ]]> +
    + Sun, 16 Feb 2022 12:00:00 +0800 + #你更新程序的地址 + +
    +
    +
    \ No newline at end of file diff --git a/making_school_asignment_app/distribute_options.yaml b/making_school_asignment_app/distribute_options.yaml new file mode 100644 index 0000000..c154351 --- /dev/null +++ b/making_school_asignment_app/distribute_options.yaml @@ -0,0 +1,19 @@ +output: dist/ +releases: + - name: prod + jobs: + - name: macos-zip + package: + platform: macos + target: zip + build_args: + dart-define: + APP_ENV: dev + # 查看完整文档:https://distributor.leanflutter.org/configuration/makers/exe + - name: windows-exe + package: + platform: windows + target: exe + build_args: + dart-define: + APP_ENV: dev \ No newline at end of file diff --git a/making_school_asignment_app/dsa_priv.pem b/making_school_asignment_app/dsa_priv.pem new file mode 100644 index 0000000..8fc331f --- /dev/null +++ b/making_school_asignment_app/dsa_priv.pem @@ -0,0 +1,36 @@ +-----BEGIN DSA PRIVATE KEY----- +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 +-----END DSA PRIVATE KEY----- diff --git a/making_school_asignment_app/dsa_pub.pem b/making_school_asignment_app/dsa_pub.pem new file mode 100644 index 0000000..ffabf45 --- /dev/null +++ b/making_school_asignment_app/dsa_pub.pem @@ -0,0 +1,36 @@ +-----BEGIN PUBLIC KEY----- +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 +xqzNyz8my0P48jVXui+9PFlCdm21gcugzJQL +-----END PUBLIC KEY----- diff --git a/making_school_asignment_app/lib/common/api/retrofit_client.dart b/making_school_asignment_app/lib/common/api/retrofit_client.dart index e803f76..3597235 100644 --- a/making_school_asignment_app/lib/common/api/retrofit_client.dart +++ b/making_school_asignment_app/lib/common/api/retrofit_client.dart @@ -141,5 +141,5 @@ abstract class RetrofitClient { // 获取APP 版本 @GET("/api/infra/AppVersion/Get") - Future getLastAppVersion(@Query('appName') String appName, @Query('ftuType') int ftuType); // ftuType 1安卓 2IOS + Future getLastAppVersion(@Query('appName') String appName, @Query('ftuType') int ftuType); // ftuType 1安卓 2IOS 3windows } 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 aa8de30..ff2354a 100644 --- a/making_school_asignment_app/lib/common/job/app_version.dart +++ b/making_school_asignment_app/lib/common/job/app_version.dart @@ -28,7 +28,7 @@ class AppVersion extends Object { int ftuType; @JsonKey(name: 'downloadUrl') - String downloadUrl; + String? downloadUrl; @JsonKey(name: 'description') String? description; @@ -44,7 +44,7 @@ class AppVersion extends Object { this.downloadUrl, this.description, ) { - downloadUrl = RequestConfig.imgUrl + downloadUrl; + if (downloadUrl != null) downloadUrl = RequestConfig.imgUrl + downloadUrl!; } factory AppVersion.fromJson(Map srcJson) => _$AppVersionFromJson(srcJson); diff --git a/making_school_asignment_app/lib/common/mixins/event_bus_mixin.dart b/making_school_asignment_app/lib/common/mixins/event_bus_mixin.dart index 9c01517..3052c81 100644 --- a/making_school_asignment_app/lib/common/mixins/event_bus_mixin.dart +++ b/making_school_asignment_app/lib/common/mixins/event_bus_mixin.dart @@ -5,7 +5,7 @@ import 'package:event_bus/event_bus.dart'; import 'package:making_school_asignment_app/common/utils/event_bus_utils.dart'; mixin EventBusMixin { - StreamSubscription? _subscription; + late final StreamSubscription? _subscription; static final EventBusUtils _exampleUtil = EventBusUtils(); static final EventBus _eBus = _exampleUtil.getEventBus(); 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 4d41354..00e4f86 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,6 +14,7 @@ * @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'; @@ -168,15 +169,19 @@ class DownloadButton extends StatelessWidget { final count = logic.downloadRatio.value; if (count > 0) return Container(); var primaryColor = Theme.of(context).primaryColor; + + if (updateAppEvent.equipment == Equipment.windows) { + return SizedBox( + child: quickText('若没有弹出更新弹框,可关闭APP重新打开执行更新...', size: 16.sp), + ); + } + return Container( height: 38.h, 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 { @@ -203,6 +208,11 @@ class DownloadButton extends StatelessWidget { print('进来更新报错$e'); } } + // else if (deviceInfo == 'windows' && updateAppEvent.equipment == Equipment.windows) { + // await autoUpdater.setFeedURL(updateAppEvent.link); + // await autoUpdater.checkForUpdates(); + // await autoUpdater.setScheduledCheckInterval(0); + // } }), 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/model/UpdateAppEvent.dart b/making_school_asignment_app/lib/common/utils/app_upgrade/model/UpdateAppEvent.dart index 581721f..6db38c7 100644 --- a/making_school_asignment_app/lib/common/utils/app_upgrade/model/UpdateAppEvent.dart +++ b/making_school_asignment_app/lib/common/utils/app_upgrade/model/UpdateAppEvent.dart @@ -80,4 +80,4 @@ class UpdateAppEvent { } // 设备枚举 -enum Equipment { other, android, ios } +enum Equipment { other, android, ios, windows } 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 8bd7ee6..6f23c6e 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 @@ -33,6 +33,9 @@ class UpgradeLogic extends GetxController with RequestToolMixin { } else if (Platform.isIOS) { deviceInfo = "ios"; deviceType = 2; + } else if (Platform.isWindows) { + deviceInfo = "windows"; + deviceType = 3; } else { return; } @@ -48,7 +51,7 @@ class UpgradeLogic extends GetxController with RequestToolMixin { // String buildNumber = packageInfo.buildNumber; //小版本号 Map json = { - 'downloadPath': result.downloadUrl, + 'downloadPath': Platform.isWindows ? '' : result.downloadUrl, 'version': result.version, 'systemType': deviceType, 'description': result.description ?? 'APP新版本更新' diff --git a/making_school_asignment_app/lib/main.dart b/making_school_asignment_app/lib/main.dart index 01b99b6..47edd22 100644 --- a/making_school_asignment_app/lib/main.dart +++ b/making_school_asignment_app/lib/main.dart @@ -1,3 +1,5 @@ +import 'dart:io'; +import 'package:auto_updater/auto_updater.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; @@ -12,6 +14,7 @@ import 'package:making_school_asignment_app/routes/app_pages.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:permission_handler/permission_handler.dart'; +import 'common/config/request_config.dart'; import 'common/utils/app_upgrade/upgradeLogic.dart'; import 'package:flutter_native_splash/flutter_native_splash.dart'; @@ -27,6 +30,15 @@ void main() async { Get.put(UserStore().init()); Get.put(UpgradeLogic()); WidgetsFlutterBinding.ensureInitialized(); + + // Windows + if (Platform.isWindows) { + String feedURL = '${RequestConfig.imgUrl}infra-app/making_school_asignment_app/3/appcast.xml'; + await autoUpdater.setFeedURL(feedURL); + await autoUpdater.checkForUpdates(); + await autoUpdater.setScheduledCheckInterval(3600); + } + SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( statusBarColor: Colors.transparent, //状态栏背景颜色 statusBarIconBrightness: Brightness.dark // dark:一般显示黑色 light:一般显示白色 diff --git a/making_school_asignment_app/lib/page/global_widget/start_page.dart b/making_school_asignment_app/lib/page/global_widget/start_page.dart index 76e2607..e0ba1b0 100644 --- a/making_school_asignment_app/lib/page/global_widget/start_page.dart +++ b/making_school_asignment_app/lib/page/global_widget/start_page.dart @@ -19,7 +19,7 @@ import 'package:making_school_asignment_app/page/work_page/work_view.dart'; import 'package:making_school_asignment_app/routes/app_pages.dart'; class StartPage extends StatefulWidget { - const StartPage({Key? key}) : super(key: key); + const StartPage({super.key}); @override State createState() => _StartPageState(); diff --git a/making_school_asignment_app/lib/page/home_page/children/homework_review/components/question_paper_view.dart b/making_school_asignment_app/lib/page/home_page/children/homework_review/components/question_paper_view.dart index 9ccc15c..09527aa 100644 --- a/making_school_asignment_app/lib/page/home_page/children/homework_review/components/question_paper_view.dart +++ b/making_school_asignment_app/lib/page/home_page/children/homework_review/components/question_paper_view.dart @@ -439,6 +439,8 @@ class QuestionImageView extends HookWidget with EventBusMixin #include #include #include void RegisterPlugins(flutter::PluginRegistry* registry) { + AutoUpdaterWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("AutoUpdaterWindowsPluginCApi")); ConnectivityPlusWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); PermissionHandlerWindowsPluginRegisterWithRegistrar( diff --git a/making_school_asignment_app/windows/flutter/generated_plugins.cmake b/making_school_asignment_app/windows/flutter/generated_plugins.cmake index 9678546..1a3c9b6 100644 --- a/making_school_asignment_app/windows/flutter/generated_plugins.cmake +++ b/making_school_asignment_app/windows/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + auto_updater_windows connectivity_plus permission_handler_windows url_launcher_windows diff --git a/making_school_asignment_app/windows/packaging/exe/make_config.yaml b/making_school_asignment_app/windows/packaging/exe/make_config.yaml new file mode 100644 index 0000000..049374b --- /dev/null +++ b/making_school_asignment_app/windows/packaging/exe/make_config.yaml @@ -0,0 +1,12 @@ +# The value of AppId uniquely identifies this application. +# Do not use the same AppId value in installers for other applications. +app_id: 9EBCC58D-39D5-4A4A-92B6-966DFFD6CA22 +publisher: LeanFlutter +publisher_url: https://github.com/leanflutter/flutter_distributor +display_name: 点智学 +create_desktop_icon: true +# See: https://jrsoftware.org/ishelp/index.php?topic=setup_defaultdirname +# install_dir_name: "D:\\HELLO-WORLD" +locales: + - en + - zh \ No newline at end of file diff --git a/making_school_asignment_app/windows/runner/Runner.rc b/making_school_asignment_app/windows/runner/Runner.rc index 841566a..6af7114 100644 --- a/making_school_asignment_app/windows/runner/Runner.rc +++ b/making_school_asignment_app/windows/runner/Runner.rc @@ -119,3 +119,11 @@ END ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED + +///////////////////////////////////////////////////////////////////////////// +// +// WinSparkle +// + +// And verify signature using DSA public key: +DSAPub DSAPEM "./../../dsa_pub.pem"