t150: 小幫手自我更新(背景備妥+重啟完成)+版本一致性

leo 07-29 三句話定調:
「小白不會動不動就刪除再裝新的」
「如果它都掛着,那準備好就告訴他重啓更新」
「**我要他下載多幾次他就放棄了,所以抓到一個客戶後不能讓他有機會離開**」

① 版本一致性(leo:「我的和下載下來的會是同一個嗎?」)
   真因:build-mac.sh L22/build-windows.sh L46 **只有 tray 注入版本,collector 沒有**
   ⇒ 托盤顯示 tray 的版本,實際幹活的 collector 無版本可查、可能不同版。
   修:collector 加 version/buildTime 變數與 --version 旗標;兩個 build 腳本都改為
   兩支注入同一個 LDFLAGS_VER(各 2 處)。
   驗:collector --version → v0.15.0 (build 20260729-2238);tray 內含同一組值。

② 自我更新(leo 選 1+3:完全自動,但要有提醒與手動檢查)
   - 背景每日檢查 manifest 的 daemon 版本(單一 CDN 靜態檔,非 GitHub API,不違反不輪詢紅線)
   - 有新版**默默下載並驗 sha256**,備妥後選單變「🟢 新版已就緒 — 點此重新啟動完成更新」
   - daemon 常駐不重啟 ⇒ 不偷換正在跑的自己;使用者按一下才 ditto 覆蓋並重啟
   - 另有「檢查更新…」讓人隨時手動按(不必等每日排程)
   - 驗章不符或解壓失敗=保留舊版不動(壞掉的 .app 比舊版更糟)
   ⇒ **封測者完全不必再下載任何東西**

驗:go build/go vet 過;三個版本比較測試通過(dev 不提示/同版不提示/新版要提示);
未剝離符號版確認 5 個更新函式在 build 範圍內
(註:打包版被 -s -w 剝符號,用 grep/strings 驗會誤判為「功能沒進去」)。
This commit is contained in:
2026-07-29 22:40:58 +08:00
parent 6a3942024a
commit 8dd15fbe43
5 changed files with 383 additions and 2 deletions
+47
View File
@@ -856,6 +856,43 @@ func main() {
versionItem := fyne.NewMenuItem("版本 "+versionLabel(), nil)
versionItem.Disabled = true
// t150leo 07-29):更新提示+一鍵完成。
// leo:「我要他下載多幾次他就放棄了,所以抓到一個客戶後不能讓他有機會離開」
// 「如果它都掛着,那準備好就告訴他重啓更新」
// ⇒ 背景自動下載備妥,這裡只呈現結果;使用者**完全不必再下載**,按一下重啟即完成。
var updateItem *fyne.MenuItem
if lbl, show := updateMenuLabel(); show {
updateItem = fyne.NewMenuItem(lbl, func() {
if st := loadStaged(); st.Ready {
if err := applyStagedAndRestart(); err != nil {
dialog.ShowError(err, win)
}
return
}
// 尚在下載中:告知狀態,不重複觸發下載
dialog.ShowInformation("更新下載中",
"新版正在背景下載,完成後這裡會變成「點此重新啟動完成更新」。", win)
})
}
// 手動「檢查更新」(leo:「他去按一下檢查更新然後更新就好」)——
// 自動檢查每日一次,但使用者想立刻確認時要按得到,不必等。
checkUpdateItem := fyne.NewMenuItem("檢查更新…", func() {
go func() {
st := checkForUpdate()
switch {
case st.Err != "":
dialog.ShowInformation("檢查更新", "暫時連不上更新伺服器:\n"+st.Err, win)
case st.Available:
go prepareUpdateInBackground()
dialog.ShowInformation("有新版本",
"發現新版 "+st.Latest+",正在背景下載。\n下載完成後,選單會出現「點此重新啟動完成更新」。", win)
default:
dialog.ShowInformation("檢查更新", "你已經是最新版本("+versionLabel()+")。", win)
}
}()
})
var items []*fyne.MenuItem
// t104per-account 分組——每個帳號獨立一段(帳號名稱標題 + 資料夾 + 新增按鈕)。
@@ -951,6 +988,10 @@ func main() {
}
}))
}
// t150:有更新才插這一項(沒新版時不佔位、不干擾)
if updateItem != nil {
items = append(items, fyne.NewMenuItemSeparator(), updateItem)
}
items = append(items,
fyne.NewMenuItemSeparator(),
syncNowItem, // t98:立刻同步
@@ -958,6 +999,7 @@ func main() {
fyne.NewMenuItem(" 新增帳號…", func() { showConnectWizard() }),
fyne.NewMenuItemSeparator(),
versionItem,
checkUpdateItem, // t150:手動檢查更新(leo:「他去按一下檢查更新然後更新就好」)
// t110 二修(leo 真機:v0.14.1 拿掉自訂項後選單「兩個都沒有」=
// 「fyne 會自動附 Quit」是錯誤前提,桌面截圖才是權威):自訂結束項加回,
// 這是唯一的結束入口。若某環境 fyne 真的又附了 Quit(v0.14.0 曾見雙項),
@@ -1002,6 +1044,11 @@ func main() {
showConnectWizard()
}
// t150:背景更新檢查(每日一次,啟動後延遲 1 分鐘避免搶開機資源)。
// 有新版就默默下載備妥,選單自動變成「點此重新啟動完成更新」——
// 使用者不必再下載任何東西(leo:「我要他下載多幾次他就放棄了」)。
startUpdateWatcher()
a.Lifecycle().SetOnStopped(func() { sup.Stop() })
a.Run()
}