Flutter应用自动更新插件auto_updater的使用

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

Flutter应用自动更新插件auto_updater的使用

简介

auto_updater 是一个用于Flutter桌面应用程序(基于 sparklewinsparkle)的自动更新插件。它支持macOS和Windows平台,使您的应用能够自动检查并安装最新版本。

alt text

平台支持

平台 支持情况
Linux ❌ 不支持
macOS ✔️ 支持
Windows ✔️ 支持

快速开始

安装

在你的 pubspec.yaml 文件中添加以下内容:

dependencies:
  auto_updater: ^0.2.0

或者使用git路径:

dependencies:
  auto_updater:
    git:
      path: packages/auto_updater
      url: https://github.com/leanflutter/auto_updater.git
      ref: main

注意:Windows用户需要安装openssl

通过Chocolatey安装:

choco install openssl

使用示例

下面是一个简单的使用示例,演示如何设置更新源、检查更新以及设置自动检查间隔:

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

void main() async {
  // 确保初始化Flutter绑定
  WidgetsFlutterBinding.ensureInitialized();

  String feedURL = 'http://localhost:5002/appcast.xml';
  await autoUpdater.setFeedURL(feedURL);
  await autoUpdater.checkForUpdates();
  await autoUpdater.setScheduledCheckInterval(3600); // 设置每小时检查一次更新

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Auto Updater Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Auto Updater Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                '等待更新...',
              ),
            ],
          ),
        ),
      ),
    );
  }
}

发布你的应用

生成私钥

运行以下命令来为macOS和Windows分别生成私钥:

dart run auto_updater:generate_keys

对于macOS,你需要将生成的公钥添加到项目的 Info.plist 文件中:

<key>SUPublicEDKey</key>
<string>bHaXClrRGMmKoKP/3HJnr/jn2ODTRPAM3VZhhkI9ZvY=</string>

对于Windows,你需要将生成的公钥添加到项目的资源文件中:

+/////////////////////////////////////////////////////////////////////////////
+//
+// WinSparkle
+//

+// And verify signature using DSA public key:
+DSAPub      DSAPEM      "../../dsa_pub.pem"

打包

为了简化打包过程,推荐使用 Flutter Distributor 工具。你可以在项目根目录下创建一个 distribute_options.yaml 文件,并配置如下:

output: dist/
releases:
  - name: prod
    jobs:
      - name: macos-zip
        package:
          platform: macos
          target: zip
          build_args:
            dart-define:
              APP_ENV: dev
      # See full documentation: https://distributor.leanflutter.org/configuration/makers/exe
      - name: windows-exe
        package:
          platform: windows
          target: exe
          build_args:
            dart-define:
              APP_ENV: dev

然后根据不同的平台运行相应的打包命令:

  • macOS:

    flutter_distributor release --name prod --jobs macos-zip
    
  • Windows:

    flutter_distributor release --name prod --jobs windows-exe
    

获取签名

根据不同的平台获取更新包的签名:

  • macOS:

    dart run auto_updater:sign_update dist/1.1.0+2/auto_updater_example-1.1.0+2-macos.zip
    

    输出结果中的 sparkle:edSignature 将用于更新 appcast.xml 文件中的相应属性。

  • Windows:

    dart run auto_updater:sign_update dist/1.1.0+2/auto_updater_example-1.1.0+2-windows-setup.exe
    

    同样地,输出结果中的 sparkle:dsaSignature 将用于更新 appcast.xml 文件中的相应属性。

分发

appcast.xml 文件放置在项目的 dist/ 目录下,并确保其中包含了正确的签名信息。例如:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle">
    <channel>
        <title>auto_updater_example</title>
        <description>Most recent updates to auto_updater_example</description>
        <language>en</language>
        <item>
            <title>Version 1.1.0</title>
            <sparkle:version>2</sparkle:version>
            <sparkle:shortVersionString>1.1.0</sparkle:shortVersionString>
            <sparkle:releaseNotesLink>
                https://your_domain/your_path/release_notes.html
            </sparkle:releaseNotesLink>
            <pubDate>Sun, 16 Feb 2022 12:00:00 +0800</pubDate>
            <enclosure url="1.1.0+2/auto_updater_example-1.1.0+2-macos.zip"
                       sparkle:edSignature="pbdyPt92pnPkzLfQ7BhS9hbjcV9/ndkzSIlWjFQIUMcaCNbAFO2fzl0tISMNJApG2POTkZY0/kJQ2yZYOSVgAA=="
                       sparkle:os="macos"
                       length="13400992"
                       type="application/octet-stream" />
        </item>
        <item>
            <title>Version 1.1.0</title>
            <sparkle:releaseNotesLink>
                https://your_domain/your_path/release_notes.html
            </sparkle:releaseNotesLink>
            <pubDate>Sun, 16 Feb 2022 12:00:00 +0800</pubDate>
            <enclosure url="1.1.0+2/auto_updater_example-1.1.0+2-windows.exe"
                       sparkle:dsaSignature="MEUCIQCVbVzVID7H3aUzAY5znpi+ySZKznkukV8whlMFzKh66AIgREUGOmvavlcg6hwAwkb2o4IqVE/D56ipIBshIqCH8rk="
                       sparkle:version="1.1.0+2"
                       sparkle:os="windows"
                       length="0"
                       type="application/octet-stream" />
        </item>
    </channel>
</rss>

启动测试更新服务器:

cd dist/
serve -l 5002

故障排除

macOS

  • 确保你已经按照 Sparkle文档 添加了Sparkle Pod。
  • 确保你已经在entitlement文件中添加并启用了网络权限,并且禁用了沙箱模式:
<key>com.apple.security.network.client</key>
  <true/>
<key>com.apple.security.network.server</key>
  <true/>
<key>com.apple.security.app-sandbox</key>
  <false/>

API

AutoUpdater

  • setFeedURL: 设置更新源URL并初始化自动更新器。
  • checkForUpdates: 检查是否有可用更新。调用此API前必须先调用setFeedURL
  • setScheduledCheckInterval: 设置自动检查更新的时间间隔,默认为86400秒(一天),最小值为3600秒(一小时),设置为0则禁用自动检查。

相关链接

许可证

本项目采用 MIT许可证 开源。


以上就是关于auto_updater插件的详细介绍和使用方法,希望对你有所帮助!如果你有任何问题或建议,请随时提出。


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

1 回复

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


当然,以下是如何在Flutter应用中使用auto_updater插件来实现自动更新的示例代码。请注意,这个插件的具体实现和API可能会随着版本更新而变化,因此建议查阅最新的官方文档以获取最准确的信息。

首先,确保你已经在pubspec.yaml文件中添加了auto_updater依赖:

dependencies:
  flutter:
    sdk: flutter
  auto_updater: ^最新版本号  # 替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,我们需要在Flutter应用中配置和使用auto_updater。以下是一个简单的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Auto Updater Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  void initState() {
    super.initState();
    // 检查更新
    _checkForUpdates();
  }

  Future<void> _checkForUpdates() async {
    try {
      // 假设你有一个API端点返回更新信息
      String updateUrl = "https://your-app-update-server.com/update.json";
      
      // 使用auto_updater插件检查更新
      AutoUpdater autoUpdater = AutoUpdater(
        updateUrl: updateUrl,
        mandatory: false, // 是否强制更新
        showDialog: true, // 是否显示更新对话框
        // 其他配置参数...
      );

      bool hasUpdate = await autoUpdater.checkForUpdates();
      
      if (hasUpdate) {
        print("有更新可用");
        // 处理更新,比如下载和安装
        await autoUpdater.downloadAndInstall();
      } else {
        print("当前已是最新版本");
      }
    } catch (e) {
      print("检查更新时出错: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Auto Updater Demo'),
      ),
      body: Center(
        child: Text('检查更新中...'),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. pubspec.yaml文件中添加了auto_updater依赖。
  2. MyApphome属性中定义了MyHomePage
  3. MyHomePageinitState方法中调用_checkForUpdates函数来检查更新。
  4. AutoUpdater对象被配置为从指定的URL检查更新,并设置了是否强制更新和是否显示更新对话框等参数。
  5. 调用checkForUpdates方法来检查是否有更新可用,如果有,则调用downloadAndInstall方法来下载并安装更新。

请注意,auto_updater插件的具体API和配置可能会根据你的实际需求和插件版本有所不同。因此,强烈建议查阅插件的官方文档以获取最新的使用指南和API参考。

此外,由于自动更新涉及到应用的安装和权限管理,确保你的应用有适当的权限来处理这些操作,并且在更新过程中给用户清晰的提示和反馈。

回到顶部