upgrade_handler.dart 1.97 KB
import 'dart:io';

import 'package:appframe/services/dispatcher.dart';
import 'package:archive/archive.dart';
import 'package:dio/dio.dart';
import 'package:path_provider/path_provider.dart';

class UpgradeHandler extends MessageHandler {
  @override
  Future<dynamic> handleMessage(params) async {
    if (params is! Map<String, dynamic>) {
      throw Exception('参数错误');
    }

    final url = params['url'] as String;
    final version = params['version'] as String;

    // 1 下载
    Directory? direct;
    if (Platform.isAndroid) {
      direct = await getExternalStorageDirectory();
    } else if (Platform.isIOS || Platform.isMacOS) {
      direct = await getApplicationDocumentsDirectory();
    } else {
      throw Exception('未知平台');
    }
    var saveFilePath = '${direct?.path}/dist_$version.zip';

    var dio = Dio();
    final resp = await dio.download(
      url,
      saveFilePath,
      onReceiveProgress: (received, total) {
        if (total != -1) {
          print((received / total * 100).toStringAsFixed(0) + "%");
        }
      },
    );
    dio.close();
    if (resp.statusCode != 200) {
      throw Exception('文件下载失败');
    }

    // 2 解压
    var outputDirectory = '${direct?.path}/http_dist_assets';
    await _extract(saveFilePath, outputDirectory);
  }

  Future<void> _extract(String zipFilePath, String outputDirectory) async {
    var file = File(zipFilePath);
    var bytes = await file.readAsBytes();

    // 解码 ZIP 文件
    final archive = ZipDecoder().decodeBytes(bytes);

    // 提取文件到指定目录
    for (final file in archive) {
      final filename = file.name;
      if (file.isFile) {
        final data = file.content as List<int>;
        final outputFile = File('$outputDirectory/$filename');
        outputFile.createSync(recursive: true);
        outputFile.writeAsBytesSync(data);
      } else {
        // 创建目录
        Directory('$outputDirectory/$filename').createSync(recursive: true);
      }
    }
  }
}