import 'dart:convert'; import 'package:apk_update/utils/toast_util.dart'; import 'package:apk_update/widget/update_dialog.dart'; import 'package:dio/dio.dart'; import 'package:flustars_flutter3/flustars_flutter3.dart'; import 'package:flutter/material.dart'; import 'package:get/route_manager.dart'; import 'package:url_launcher/url_launcher.dart'; // 获取版本号 const String getSystemVersionByNumber = "/user-service/system/version/getSystemVersionByNumber"; // 获取OSS 下载授权ak sk token const String generateByExt = "/msl-document/common/oss/generateByExt"; const currentDay = "current_day"; const dateFormat = "yyyy-MM-dd"; /// 获取更新版本信息 /// url 请求地址 /// versionNumber 当前应用versionCode /// productNo 产品号 /// onceDay 一天提示一次(应用首页设置true) void checkVersion( {required String url, required Method method, Map<String, dynamic>? params, Map<String, dynamic>? header, bool onceDay = false, Function()? jumpAppStore, // 跳转AppStore Function(String? path)? installApk, // 安装Apk Function()? downloadApkError, // 下载Apk错误 Function(String? path,String? apkPath)? downloadApk, // 使用OSS下载Apk int? isOssDownload //1 使用OSS下载 }) async { try { final Response response = await Dio().request( url, options: Options(method: method.value, headers: header), queryParameters: params, data: params, ); // 网络请求成功 _printLog(response); // 打印日志 var responseData = response.data; if (responseData.runtimeType == String) { // 兼容后端数据返回string responseData = json.decode(responseData); } if (responseData?["code"] != 0) { ToastUtil.showToast(responseData?["msg"]); return; } var result = responseData?["data"]; //获取当前时间 String spCurrent = SpUtil.getString(currentDay) ?? ""; String current = DateUtil.formatDate(DateTime.now(), format: dateFormat); //一天提示一次升级 & 非强升 & 当天已提示 => 不再提示 if (onceDay && result?['versionForce'] == 0 && spCurrent == current) { // 不再提示 return; } //缓存当前时间 SpUtil.putString(currentDay, current); // 一天提示一次升级,是在应用首次设置,不需要提示最新版本toast if (!onceDay && result == null) { // 当前已经是最新版本 ToastUtil.showToast("当前已经是最新版本"); return; } if (result == null) { // 无升级任务,拦截 return; } // 升级弹框提示 Get.dialog( UpdateDialog( title: result['versionName'], content: result['tipContent'] ?? result['versionContent'], isUpdateMore: result['versionForce'] == 1, versionPath: result['versionPath'], jumpAppStore: jumpAppStore, installApk: installApk, isOssDownload: isOssDownload, downloadApk: downloadApk, downloadApkError: downloadApkError, ), ); } on DioException catch (e) { _printLog(e.response); // 打印日志 ToastUtil.showToast("服务器请求错误"); } } /// 打开浏览器 Future<void> openBrowser(String stringUrl) async { final Uri url = Uri.parse(stringUrl); if (!await launchUrl(url, mode: LaunchMode.externalApplication)) { throw Exception('Could not launch $url'); } } enum Method { get, post, put, patch, delete, } extension MethodExtension on Method { String get value => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'][index]; } /// 日志打印 _printLog(Response? response) { var responseData = response?.data; var requestOptions = response?.requestOptions; var headers = response?.headers; debugPrint("========== 网络请求响应 ==========\n" "statusCode:${response?.statusCode} \n" "statusMessage:${response?.statusMessage}\n" "method:${requestOptions?.method}\n" "path:${requestOptions?.path}\n" "headers:${headers?.map}\n\n" "queryParameters:${requestOptions?.queryParameters}\n" "data:${requestOptions?.data}\n" "responseData:$responseData\n"); }