Tauri 官方提供了一个功能完善的自动更新插件 @tauri-apps/plugin-updater,它可以在后台静默检查新版本,下载更新包并引导用户安装,完美解决了桌面应用的版本分发难题。该插件支持全平台,并且能实现差分更新(只下载变化部分),节省用户流量和时间。
1. 准备工作:生成密钥对
更新包必须经过数字签名,以保证下载的安装包没有被篡改。你需要一对公钥和私钥:
- 私钥你自行保管,用于在发版时对安装包签名(通常在 CI 环境中使用)。
- 公钥则内置在应用中,用于在下载后验签。
使用 Tauri CLI 可以快速生成密钥对:
npx tauri signer generate -w ~/.tauri/myapp.key
这会在指定位置生成一个私钥文件(如 myapp.key),并输出对应的公钥字符串。复制这段公钥,稍后会用到。
注意:私钥绝对不能泄露,更不能打包到应用里。公钥是公开的,可以放心嵌入。
2. 准备更新服务器
更新插件需要从你的服务器拉取一个 JSON 描述文件。这个文件告诉应用最新的版本号、下载链接和签名信息。一个合法的 JSON 响应格式如下:
{
"version": "1.2.0",
"notes": "修复了若干 Bug,增加了新功能",
"pub_date": "2025-03-15T12:00:00Z",
"platforms": {
"windows-x86_64": {
"signature": "content of the signature file",
"url": "https://your-cdn.com/app-v1.2.0_x64.msi.zip"
},
"darwin-aarch64": {
"signature": "...",
"url": "https://your-cdn.com/app-v1.2.0_aarch64.dmg"
},
"linux-x86_64": {
"signature": "...",
"url": "https://your-cdn.com/app-v1.2.0_amd64.AppImage.tar.gz"
}
}
}
version:必须严格遵循语义化版本,否则可能无法正确比对本机版本。signature:安装包经过签名后生成的签名文件内容(通常是.sig文件)。url:更新包的直链地址。Tauri 会自动下载这个文件。
3. 在应用中集成插件
安装插件包:
npm install @tauri-apps/plugin-updater
在 Rust 端,需要在 src-tauri/Cargo.toml 中添加:
[dependencies]
tauri-plugin-updater = "2"
并在 src-tauri/src/main.rs 中注册插件:
fn main() {
tauri::Builder::default()
.plugin(tauri_plugin_updater::Builder::new().build()) // 注册更新插件
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
在 tauri.conf.json 中配置更新端点和公钥:
{
"plugins": {
"updater": {
"endpoints": [
"https://your-server.com/update/check"
],
"pubkey": "你之前生成的公钥"
}
}
}
多个 endpoints 可以用于容灾,按顺序尝试。
4. 在 JavaScript 中调用更新
插件提供了简洁的 API,你可以在应用中提供一个“检查更新”按钮,或应用启动时自动检查:
import { check } from '@tauri-apps/plugin-updater';
async function checkForUpdates() {
try {
const update = await check();
if (update) {
console.log(`发现新版本 ${update.version},更新说明:${update.body}`);
// 下载并安装
await update.downloadAndInstall((event) => {
switch (event.event) {
case 'Started':
console.log('开始下载');
break;
case 'Progress':
console.log(`下载进度: ${event.data.chunk_length}/${event.data.content_length}`);
break;
case 'Finished':
console.log('下载完成');
break;
}
});
// 下载完成后,建议提示用户重启应用
// 或者直接调用 relaunch
await relaunch(); // 需要 import { relaunch } from '@tauri-apps/plugin-process'
}
} catch (error) {
console.error('更新失败', error);
}
}
downloadAndInstall 会自动验证签名、替换当前安装,并在下次启动时生效。大部分情况下,你只需要这一行就能完成更新流程。
5. 发布更新包并签名
在完成应用构建后,你需要对生成的安装包进行签名,然后将签名文件和安装包上传到服务器,并更新 JSON 端点。
例如,使用之前生成的私钥对 .msi 文件签名:
npx tauri signer sign -k ~/.tauri/myapp.key -f ./target/release/bundle/msi/app_1.2.0_x64.msi
命令会生成一个 .sig 签名文件,将其内容填入 JSON 的 signature 字段。
6. 注意事项
- 版本号必须递增:插件会比较本地版本和服务器版本,只有后者更大才会提示更新。
- 静默更新体验:
downloadAndInstall是异步的,你可以在下载过程中显示进度条,完成后使用relaunch()让应用重启。 - 错误处理:如果网络异常或签名验证失败,插件会主动抛出错误,建议用
try-catch捕获并友好提示。 - 差分更新:Tauri 更新插件支持差分更新,但需要在
tauri.conf.json中额外配置windows > installer > nsis > diffUpdater或类似选项,且仅对部分打包格式有效(如 NSIS)。具体可查阅官方文档。
有了这套机制,你的 Tauri 应用就拥有了与商业软件相媲美的自动更新能力,用户总能第一时间享受到新功能和安全修复,而无需手动下载覆盖安装。