Flutter应用更新管理插件flutter_sparkle的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter应用更新管理插件flutter_sparkle的使用

简介

flutter_sparkle 是一个用于检查更新并安装您的 macOS 应用的 Flutter 插件。在 macOS 上使用 Sparkle,而在 Windows 平台上则使用 WinSparkle

支持平台

该插件仅支持 macOS 和 Windows 平台。

配置

macOS

  1. 启用网络连接:确保您的应用能够进行网络连接。
  2. 生成公钥:运行 ./bin/generate_keys 工具(来自 Sparkle 分发根目录)以生成公钥。
  3. 添加公钥:将您的公钥添加到应用的 Info.plist 文件中作为 SUPublicEDKey 属性。

使用

导入插件

首先导入 flutter_sparkle 插件:

import 'package:flutter_sparkle/flutter_sparkle.dart';

macOS 更新检查

使用 checkMacUpdate 方法来检查 macOS 的更新:

FlutterSparkle.checkMacUpdate('https://test.asfarastheeyecansee.cn/get/mac/version');

Windows 更新检查

main 函数中初始化 winSparkle,并传入您的 appcast.xml 源文件 URL:

await FlutterSparkle.initWinUpdate('https://test.astthestarsfall.cn/get/win/version');

使用 checkWinUpdate 方法来检查 Windows 的更新:

FlutterSparkle.checkWinUpdate();

您还可以使用 checkWinUpdateAndInstall 来检查并安装更新:

// 检查并安装更新
FlutterSparkle.checkWinUpdateAndInstall();

或者使用 checkWinUpdateWithoutUI 方法来检查更新而不显示用户界面,但仍然会在有新版本时自动安装:

// 检查更新但不显示 UI,有新版本时自动安装
FlutterSparkle.checkWinUpdateWithoutUI();

完整示例

以下是一个完整的示例代码,展示了如何在 Flutter 应用中使用 flutter_sparkle 插件:

import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:flutter_sparkle/flutter_sparkle.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  // 初始化 WinSparkle
  var result = await FlutterSparkle.initWinUpdate('https://test.astthestarsfall.cn/get/win/version');
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  // 异步方法,初始化平台状态
  Future<void> initPlatformState() async {
    String platformVersion;
    // 处理可能的异常和空值
    try {
      platformVersion = await FlutterSparkle.platformVersion ?? 'Unknown platform version';
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    // 如果组件被移除,则返回
    if (!mounted) return;

    // 更新状态
    setState(() {
      _platformVersion = platformVersion;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 检查 Windows 更新
              FlutterSparkle.checkWinUpdate();
            },
            child: const Icon(Icons.update),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter应用更新管理插件flutter_sparkle的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter应用更新管理插件flutter_sparkle的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter应用中使用flutter_sparkle插件进行更新管理的代码案例。flutter_sparkle是一个用于Flutter应用的更新管理插件,它借鉴了macOS上的Sparkle框架的概念。不过需要注意的是,flutter_sparkle这个插件名在Flutter社区中并不常见,这里假设你指的是一个类似功能的插件或者是一个自定义实现。通常,这类插件会涉及到检查更新、下载更新、安装更新等流程。

由于Flutter社区中并没有一个名为flutter_sparkle的官方或广泛使用的插件,我将给出一个基于类似功能的假设实现。在这个例子中,我们将使用http包来检查更新,使用file_saver包来下载更新包,并使用一些本地存储或文件系统操作来管理更新。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加必要的依赖:

dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.3  # 用于网络请求
  path_provider: ^2.0.2  # 用于获取应用存储路径
  file_saver: ^3.0.0  # 用于保存文件

2. 检查更新

创建一个服务来检查服务器上的最新版本:

import 'package:http/http.dart' as http;
import 'dart:convert';

class UpdateChecker {
  static const String updateUrl = "https://yourserver.com/latest_version.json";

  Future<String?> checkForUpdates() async {
    var response = await http.get(Uri.parse(updateUrl));
    if (response.statusCode == 200) {
      var data = jsonDecode(response.body) as Map<String, dynamic>;
      String latestVersion = data["version"] as String;
      // 这里假设你有一个方法来获取当前应用的版本
      String currentVersion = getCurrentAppVersion();
      if (latestVersion != currentVersion) {
        return latestVersion;
      }
    }
    return null;
  }

  // 你需要实现这个方法来获取当前应用的版本
  String getCurrentAppVersion() {
    // 假设你有一个方法来获取应用的包信息并返回版本
    // 这通常涉及到Platform Channels与原生代码交互
    return "1.0.0";  // 示例版本
  }
}

3. 下载更新

使用file_saver来下载更新包:

import 'package:file_saver/file_saver.dart';
import 'package:path_provider/path_provider.dart';

class UpdateDownloader {
  static const String updateFileName = "update.apk";  // 假设是Android的APK文件

  Future<void> downloadUpdate(String url) async {
    var directory = await getApplicationDocumentsDirectory();
    var filePath = directory.path + "/" + updateFileName;
    await FileSaver.saveAs(
      url,
      filePath,
      showProgressDialog: true,  // 显示下载进度对话框
      fileName: updateFileName,
    );
  }
}

4. 安装更新

对于Android,你可能需要引导用户手动安装APK文件。对于iOS,更新机制更为复杂,通常涉及到App Store或TestFlight。这里只给出Android的示例:

import 'package:android_intent/android_intent.dart';

class UpdateInstaller {
  static const String updateFilePath = "/path/to/your/update.apk";  // 替换为实际路径

  Future<void> installUpdate() async {
    var intent = AndroidIntent(
      action: Action.VIEW,
      data: Uri.parse("file://$updateFilePath"),
      type: "application/vnd.android.package-archive",
    );
    await intent.launch();
  }
}

5. 综合使用

在你的主应用中,你可以这样使用上述服务:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String? latestVersion;

  @override
  void initState() {
    super.initState();
    checkForUpdates();
  }

  Future<void> checkForUpdates() async {
    latestVersion = await UpdateChecker().checkForUpdates();
    if (latestVersion != null) {
      showDialog(
        context: context,
        builder: (context) => AlertDialog(
          title: Text("Update Available"),
          content: Text("Version ${latestVersion!} is available. Would you like to download it?"),
          actions: <Widget>[
            TextButton(
              onPressed: () {
                Navigator.of(context).pop();
                downloadAndUpdate();
              },
              child: Text("Download"),
            ),
            TextButton(
              onPressed: () {
                Navigator.of(context).pop();
              },
              child: Text("Later"),
            ),
          ],
        ),
      );
    }
  }

  Future<void> downloadAndUpdate() async {
    String updateUrl = "https://yourserver.com/update.apk";  // 替换为实际URL
    await UpdateDownloader().downloadUpdate(updateUrl);
    // 下载完成后,可以引导用户安装
    UpdateInstaller().installUpdate();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("Update Management Demo"),
        ),
        body: Center(
          child: Text("Current App Version: 1.0.0"),  // 替换为实际版本
        ),
      ),
    );
  }
}

请注意,这只是一个基本的示例,实际应用中你可能需要处理更多的错误情况、用户交互和平台特定的实现细节。此外,对于iOS,更新机制与Android完全不同,并且受到App Store政策的严格限制。对于生产环境,建议使用成熟的第三方服务或自己实现一个更加健壮和安全的更新系统。

回到顶部