Flutter使用auto_updater实现windows/mac桌面应用版本升级功能

本文主要是介绍Flutter使用auto_updater实现windows/mac桌面应用版本升级功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

因为windows应用一般大家都是从网上下载的,后期版本肯定会更新,那用flutter开发windows应用,怎么实现应用内版本更新功能了?可以使用auto_updater库,
这个插件允许 Flutter 桌面 应用自动更新自己 (基于 sparkle 和 winsparkle)
地址如下:

pub仓库地址:auto_updater | Flutter Package
github仓库地址:https://github.com/leanflutter/auto_updater
中文文档地址:https://github.com/leanflutter/auto_updater/blob/main/README-ZH.md

开始使用

先添加依赖,将此添加到你的软件包的 pubspec.yaml 文件:

dependencies:auto_updater: ^0.1.7

windows使用需要安装openssl:

安装教程:windows安装Chocolatey方法注意事项,以及安装openssl方法-CSDN博客 

然后在main.dart中添加下面代码:

import 'package:auto_updater/auto_updater.dart';void main() async {// 必须加上这一行。WidgetsFlutterBinding.ensureInitialized();String feedURL = 'http://localhost:5002/appcast.xml';await autoUpdater.setFeedURL(feedURL);await autoUpdater.checkForUpdates();await autoUpdater.setScheduledCheckInterval(3600);runApp(MyApp());
}

生成私钥

运行以下命令:需要分别在 macOS 和 Windows 系统中运行该命令。

dart run auto_updater:generate_keys

命令将为你生成私钥(dsa_priv.pem)及公钥(dsa_pub.pem),请备份你的私钥并确保其安全,并将公钥作为 Windows 资源添加到项目中。 

macOS运行命令后输出:

A key has been generated and saved in your keychain. Add the `SUPublicEDKey` key to
the Info.plist of each app for which you intend to use Sparkle for distributing
updates. It should appear like this:<key>SUPublicEDKey</key><string>pfIShU4dEXqPd5ObYNfDBiQWcXozk7estwzTnF9BamQ=</string>

更改文件 macos/Runner/Info.plist 如下: 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>...+	<key>SUPublicEDKey</key>
+	<string>bHaXClrRGMmKoKP/3HJnr/jn2ODTRPAM3VZhhkI9ZvY=</string>
</dict>
</plist>

Windows运行命令后输出:

Generated two files:
dsa_priv.pem: your private key. Keep it secret and don't share it!
dsa_pub.pem: public counterpart to include in youe app.
BACK UP YOUR PRIVATE KEY AND KEEP IT SAFE!
If you lose it, your users will be unable to upgrade!

更改文件 windows/runner/Runner.rc 如下:


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

打包应用

为了简化打包的过程,这里使用了 Flutter Distributor ,一个专门用于打包和发布 Flutter 应用的完整工具。官方网站:Getting Started | Flutter Distributor

安装flutter_distributor:

#安装命令
dart pub global activate flutter_distributor

安装Inno setup

必须安装Inno Setup 6 并且添加中文语言包,且安装目录要使用默认的C盘里面,否则打包失败。因为Flutter Distributor打包exe是基于inno setup 6实现的,默认官网是英文版本的,打包exe之后点击安装都是英文,所以我找到了中文版的inno setup 6和中文语言包,下载地址如下

Inno Setup 6和中文安装包下载地址:inno setup 带中文包.zip - 蓝奏云

添加distribute_options.yaml添加到你的项目根目录 

output: dist/
releases:- name: devjobs:- name: release-windowspackage:platform: windowstarget: exebuild_args:dart-define:APP_ENV: dev

添加 make_config.yaml 到你的项目 windows/packaging/exe (需要手动创建)目录:

make_config.yaml内容: (安装目录和快捷方式的名字,发布者名称配置等)

# AppId 的值唯一标识此应用。
# 不要在其他应用的安装程序中使用相同的 AppId 值。
# 以下为示例代码,实际根据你的项目进行替换
app_id: 5B566538-42B1-4826-A479-AF079F24A65D
publisher: Jory Cai
display_name: Hello Hado
create_desktop_icon: true
install_dir_name: hado_world
locales:- en- zh

开始生成exe文件:

flutter_distributor package --platform windows --targets exe

编译成功后:

对生成的exe文件进行升级签名:后面的路径要是你自己生成的文件路径

dart run auto_updater:sign_update dist/1.1.1/flutter_windows-1.1.1+1.1.1-windows-setup.exe

签名后的输入要添加到appcast.xml后面的dsaSignature属性里面:

appcast.xml内容:(配置更新版本和更新说明,还有更新文件下载链接等内容)

<?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>#发行说明-读取html方式(2选1)<sparkle:releaseNotesLink>https://your_domain/your_path/release_notes.html</sparkle:releaseNotesLink>#发行说明-写死方式(2选1)<description><![CDATA[<ul><li>1、新增XX功能</li><li>2、新增XX功能</li></ul>]]></description><pubDate>Sun, 16 Feb 2022 12:00:00 +0800</pubDate>#你更新程序的地址<enclosure url="http://wwww.xxx.com/1.1.0+2/auto_updater_example-1.1.0+2-macos.zip"sparkle:edSignature="pbdyPt92pnPkzLfQ7BhS9hbjcV9/ndkzSIlWjFQIUMcaCNbAFO2fzl0tISMNJApG2POTkZY0/kJQ2yZYOSVgAA=="sparkle:version="1.1.0"sparkle:os="macos"length="13400992"type="application/octet-stream" /></item><item><title>Version 1.1.0</title>#发行说明-读取html方式(2选1)<sparkle:releaseNotesLink>https://your_domain/your_path/release_notes.html</sparkle:releaseNotesLink>#发行说明-写死方式(2选1)<description><![CDATA[<ul><li>1、新增XX功能</li><li>2、新增XX功能</li></ul>]]></description><pubDate>Sun, 16 Feb 2022 12:00:00 +0800</pubDate>#你更新程序的地址<enclosure url="http://www.xx.com/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>

新版本更新操作

如果你的程序后续更新了,版本升级了,就修改项目根目录里面的 pubspec.yaml文件版本:

修改完之后,再执行命令重新打包: 

flutter_distributor package --platform windows --targets exe

打包后就会在项目根目录dist下面出现响应版本的exe:

然后运行命令对这个exe进行签名: 

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

将签名后的结果添加到appcast.xml里面:

并且修改appcast.xml里面响应的版本和更新说明:

然后启动历史版本的程序,检查更新:

点击安装更新后:

等待下载完成:点击安装更新

就会杀死现在的进程,然后重新执行安装操作:

这篇关于Flutter使用auto_updater实现windows/mac桌面应用版本升级功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/789935

相关文章

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2