feat: implement background update download without blocking user login

- Change update check and download to async execution, allowing immediate app entry for User users
- Updates run in background, showing update prompt when download completes
- Optimize login flow experience, eliminating blocking time caused by update downloads
- Add release notes for version 1.5.1

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Misaka
2026-03-24 21:43:03 +08:00
parent 7a78948a8c
commit ffc3cbb4a9
2 changed files with 17 additions and 5 deletions

7
docs/releases/1.5.1.md Normal file
View File

@@ -0,0 +1,7 @@
# 1.5.1
## 体验优化
- User 用户登录后立即进入应用,更新检查和下载在后台运行。
- 下载完成后自动显示更新提示,整个过程对用户透明。
- 优化登录流程体验,消除更新下载导致的阻塞时间。

View File

@@ -124,7 +124,12 @@ export class UpdateService {
return return
} }
await this.checkForUpdates() // 启动异步更新检查,不阻塞登录流程
void this.checkForUpdates().catch((error) => {
log.warn('Async update check failed', {
error: error instanceof Error ? error.message : String(error)
})
})
this.startPolling() this.startPolling()
} }
@@ -149,16 +154,16 @@ export class UpdateService {
this.publishStatus(nextStatus) this.publishStatus(nextStatus)
if (nextStatus.phase === 'available' && nextStatus.recommendedRelease) { if (nextStatus.phase === 'available' && nextStatus.recommendedRelease) {
try { // 异步下载,不阻塞更新检查流程
await this.downloadRelease(nextStatus.recommendedRelease) void this.downloadRelease(nextStatus.recommendedRelease).catch((error) => {
} catch (error) {
const message = error instanceof Error ? error.message : '下载更新失败' const message = error instanceof Error ? error.message : '下载更新失败'
log.warn('Async update download failed', { error: message })
this.publishStatus({ this.publishStatus({
phase: 'error', phase: 'error',
error: message, error: message,
message message
}) })
} })
} }
} else if (currentUserType === 'Admin') { } else if (currentUserType === 'Admin') {
this.publishStatus(this.catalogService.resolveAdminStatus(this.status, this.catalog)) this.publishStatus(this.catalogService.resolveAdminStatus(this.status, this.catalog))