用户选择更新后,后台是否会自动下载exe文件到本地进行安装?
答案:是的,但不是简单的"下载exe替换exe",而是通过Tauri内置的更新器进行完整的更新安装流程。
graph TD
A[用户点击更新按钮] --> B[调用start_manual_update]
B --> C[Tauri调用updater.check()]
C --> D[向后端API发送版本检查请求]
D --> E{后端返回更新信息}
E -->|有更新| F[显示更新确认对话框]
E -->|无更新| G[提示已是最新版本]
graph TD
H[用户确认更新] --> I[Tauri updater下载更新包]
I --> J[下载到临时目录]
J --> K[验证数字签名]
K -->|验证通过| L[解压更新文件]
K -->|验证失败| M[下载失败,显示错误]
L --> N[准备安装]
graph TD
O[开始安装] --> P{不同平台的安装方式}
P -->|Windows| Q[替换主程序exe文件]
P -->|macOS| R[更新.app包内容]
P -->|Linux| S[更新AppImage文件]
Q --> T[更新完成]
R --> T
S --> T
graph TD
U[安装完成] --> V[询问用户是否重启]
V -->|是| W[立即重启应用]
V -->|否| X[显示重启提醒]
W --> Y[启动新版本]
X --> Z[继续运行旧版本]
Z --> AA[下次启动时自动使用新版本]
# 更新包下载到临时目录
C:\Users\{username}\AppData\Local\Temp\tauri_updater\update.exe
# 同时下载签名文件用于验证
C:\Users\{username}\AppData\Local\Temp\tauri_updater\update.exe.sig
# Tauri更新器执行以下操作:
# 1. 验证更新包签名
# 2. 创建备份(可选)
# 3. 替换主程序文件
# 4. 更新相关配置文件
# 5. 清理临时文件
# 原始文件位置
C:\Program Files\游铛铛\youdangdang.exe
# 更新后的新文件
# (文件名不变,但内容已更新)
// Rust代码中的重启逻辑
app.restart(); // 这会关闭当前进程,启动新的exe文件
# 更新包下载到临时目录
/tmp/tauri_updater/update.dmg
# 挂载DMG文件
hdiutil attach /tmp/tauri_updater/update.dmg
# 复制新版本到应用程序目录
cp -r /Volumes/Update/游铛铛.app /Applications/
# 卸载DMG
hdiutil detach /Volumes/Update
# 下载AppImage文件
/tmp/tauri_updater/update.AppImage
# 替换原有AppImage文件
mv /tmp/tauri_updater/update.AppImage /opt/youdangdang/youdangdang.AppImage
# 设置执行权限
chmod +x /opt/youdangdang/youdangdang.AppImage
// Tauri的update.download_and_install() 做了更多事情:
// 1. 下载更新包到临时目录
// 2. 验证数字签名确保安全性
// 3. 根据平台执行特定的安装逻辑
// 4. 处理依赖项更新
// 5. 维护配置文件一致性
// 6. 清理旧版本文件
// 7. 准备重启环境
// 更新过程是原子的,要么全部成功,要么全部回滚
// 如果安装过程中断,不会产生损坏的安装状态
async fn safe_update(app: &AppHandle) -> Result<(), String> {
// 1. 下载到临时位置
// 2. 验证完整性
// 3. 原子性替换
// 4. 失败时自动清理
Ok(())
}
// 前端进度显示
const updateProgress = {
status: 'downloading', // downloading | installing | restarting
progress: 75, // 0-100
message: '正在安装更新...'
};
// 实时反馈给用户
updateUI(updateProgress);
// 每次更新都验证签名
let is_valid = verify_signature(update_file, signature, public_key)?;
if !is_valid {
return Err("Update signature verification failed".to_string());
}
// tauri.conf.json 中的权限配置
{
"updater": {
"active": true,
"pubkey": "应用程序公钥",
"endpoints": ["https://secure-api.youdangdang.com/updates"]
}
}
1. [发现更新] 对话框
"发现新版本 v1.0.1,是否更新?"
[更新内容]
- 修复了重要bug
- 提升了稳定性
[稍后提醒] [立即更新]
2. [下载中] 进度提示
"正在下载更新文件..."
[████████████░░░░] 75%
3. [安装中] 提示
"正在安装更新,请稍候..."
4. [完成] 重启确认
"更新完成,需要重启应用才能生效"
[稍后重启] [立即重启]
// 强制更新不允许跳过
if is_force_update {
let confirmed = dialog.ask("必须更新", "此更新包含重要安全修复,必须安装");
if !confirmed {
app.exit(1); // 直接退出应用
}
}
原因:网络问题、CDN故障
解决:自动重试、切换备用下载源
原因:更新包被篡改
解决:从官方渠道重新下载、联系技术支持
原因:权限不足、磁盘空间不足
解决:检查权限、清理磁盘空间
原因:更新未正确安装
解决:卸载重装、检查安装日志
// 支持静默更新(用户无感知)
async fn background_update() {
// 在应用运行时下载更新
// 等用户下次启动时自动生效
}
总结:用户选择更新后,系统会通过Tauri的成熟更新框架自动下载、验证、安装新版本exe文件,整个过程安全可靠,用户体验良好。 🚀