游铛铛客户端采用 Tauri内置更新器 + 后端API服务 的更新架构,支持:
graph TB
subgraph "客户端 (Tauri + Rust)"
A[应用启动] --> B[检查更新API]
B --> C{有更新?}
C -->|是| D[下载更新包]
C -->|否| E[正常启动]
D --> F{强制更新?}
F -->|是| G[强制安装]
F -->|否| H[用户选择]
end
subgraph "后端服务 (FastAPI)"
I[更新API] --> J[版本检查]
J --> K[更新包管理]
K --> L[强制更新标记]
end
subgraph "分发服务"
M[CDN/OSS] --> N[更新包存储]
N --> O[数字签名]
end
A --> I
I --> M
src-tauri/tauri.conf.json{
"tauri": {
"updater": {
"active": true,
"endpoints": [
"https://api.youdangdang.com/updates/{{target}}/{{current_version}}"
],
"dialog": true,
"pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkK"
}
}
}
active: 启用更新功能endpoints: 更新检查API地址dialog: 显示更新对话框pubkey: 更新包验证公钥# 检查更新
GET /updates/{target}/{current_version}
# 下载更新包
GET /updates/download/{target}/{version}/{filename}
# 强制用户更新
POST /updates/force/{user_id}
# 更新统计
GET /admin/updates/stats
{
"version": "1.0.1",
"notes": "修复了重要bug,提升了稳定性",
"pub_date": "2026-01-01T10:00:00Z",
"platforms": {
"windows-x86_64": {
"signature": "数字签名字符串",
"url": "https://cdn.youdangdang.com/updates/windows-x86_64/1.0.1/update.exe",
"size": 52428800
}
}
}
#[tauri::command]
pub async fn check_for_updates(app: AppHandle) -> Result<UpdateInfo, String> {
// 自动检查更新逻辑
match app.updater().check().await {
Ok(update) => {
if update.is_update_available() {
// 检查是否强制更新
if should_force_update(&update).await {
perform_force_update(&app, &update).await?;
}
Ok(update.info().clone())
} else {
Err("No updates available".to_string())
}
}
Err(e) => Err(format!("Update check failed: {}", e))
}
}
async fn perform_force_update(app: &AppHandle, update: &Update) -> Result<(), String> {
// 显示强制更新对话框
let confirmed = tauri::api::dialog::blocking::ask(
app.get_window("main").as_ref(),
"强制更新",
"检测到重要更新,必须立即更新才能继续使用",
);
if !confirmed {
app.exit(1); // 强制退出
return Err("User declined forced update".to_string());
}
// 下载并安装更新
update.download_and_install().await?;
app.restart();
Ok(())
}
// 自动检查(应用启动时)
async function checkForUpdates() {
try {
const updateInfo = await invoke('check_for_updates');
// 处理更新信息
} catch (error) {
console.log('No updates available');
}
}
// 手工检查
async function manualCheck() {
try {
const result = await invoke('manual_update_check');
// 显示更新信息对话框
} catch (error) {
// 处理错误
}
}
# 后端配置
FORCE_UPDATE_VERSIONS = ["1.0.1", "1.1.0"] # 必须更新的版本
def should_force_update(current_version: str, target_version: str) -> bool:
"""判断是否需要强制更新"""
try:
current = parse_version(current_version)
target = parse_version(target_version)
# 主要版本升级强制更新
if target.major > current.major:
return True
# 次要版本有安全修复强制更新
if target.minor > current.minor and "SECURITY" in release_notes:
return True
# 特定版本强制更新
return target_version in FORCE_UPDATE_VERSIONS
except:
return False
@router.post("/admin/users/{user_id}/force-update")
async def force_user_update(user_id: int, target_version: str = None):
"""强制指定用户更新"""
# 在数据库中标记用户需要强制更新
await db.execute(
"UPDATE users SET force_update_version = ?, force_update_required = 1 WHERE id = ?",
target_version, user_id
)
# 下次客户端启动时会检测到强制更新标志
return {"success": True, "message": f"User {user_id} marked for forced update"}
# 构建应用
npm run tauri:build
# 生成更新包(Tauri会自动生成)
# 输出: src-tauri/target/release/bundle/msi/*.msi
# src-tauri/target/release/bundle/appimage/*.AppImage
# src-tauri/target/release/bundle/dmg/*.dmg
# 使用私钥签名更新包
tauri signer sign -k private_key.pem update.exe
# 生成签名文件
tauri signer generate -k private_key.pem
# 上传到CDN/OSS
aws s3 cp update.exe s3://youdangdang-updates/windows-x86_64/1.0.1/
# 更新后端数据库
INSERT INTO update_packages (version, platform, url, signature, size)
VALUES ('1.0.1', 'windows-x86_64', 'https://...', 'signature...', 52428800);
-- 更新统计查询
SELECT
version,
platform,
COUNT(*) as total_users,
SUM(CASE WHEN update_status = 'success' THEN 1 ELSE 0 END) as success_count,
SUM(CASE WHEN update_status = 'failed' THEN 1 ELSE 0 END) as failed_count,
AVG(update_time) as avg_update_time
FROM update_logs
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY version, platform;
# 检查网络连接
curl https://api.youdangdang.com/updates
# 检查API响应
curl "https://api.youdangdang.com/updates/windows-x86_64/1.0.0"
# 检查CDN访问
curl -I https://cdn.youdangdang.com/updates/windows-x86_64/1.0.1/update.exe
# 检查签名验证
tauri signer verify -k public_key.pem update.exe
# 检查文件权限
ls -la update.exe
# 检查磁盘空间
df -h
# 查看安装日志
tail -f /tmp/tauri-updater.log
此指南提供了完整的客户端强制更新部署方案,确保安全、稳定、高效的更新体验。