1、Windows下更新特有的問題
軟件更新在Linux和macOS還好說,可是在Windows上可能會遇到UAC問題,經常使用的方法是:Windows計劃任務、Windows Service,本質上這兩種方式仍是提權,Windows Service 與 Windows計劃任務相比最大的特色就是能夠與應用交互,Windows的更新就是使用Windows Update服務,即便在macOS的Edge瀏覽器也是使用的Microsoft Update服務。javascript
2、手動更新
手動更新是下載完整的安裝包,用戶手動安裝,若是數據須要保存在本地,那麼不要將數據保存在應用安裝目錄,而是用戶目錄。java
手動更新適合用戶粘性高,非頻繁更新的應用,在macOS的App Store中,一般只要上傳安裝包,用戶終端能夠自動更新。手動更新通常會有比較大的安裝包,由於是徹底下載。通常做爲降級更新方案使用。npm
3、覆蓋更新
程序自動替換,下載更新過程快,只須要重啓應用,甚至不須要重啓,可是容易出現寫入文件失敗,並且實現複雜,適合打補丁。json
4、自動更新
應用程序自動下載,再次啓動之後從新加載最新版本便可,通常這樣的應用結構是由一個固定的應用啓動程序讀取不一樣的應用版本。瀏覽器
這樣更新速度快,異步更新而且適合高頻更新的應用。缺點就是實現有必定的難度。緩存
5、Electron應用更新
(1)Web化
將業務視圖存放到遠程HTTPS服務器,這樣對用戶端無感知,可是致使應用沒法離線使用,並且還要實現一堆框架兼容新問題,好比Electron的desktopCapture模塊。服務器
(2)官方自動更新
基於Squirrel框架完成自動更新,而且解決了權限問題。框架
(3)Updater
是Electron官方更新的改版實現,有electron-builder提供。異步
- 支持Windows簽名驗證
- 支持進度條
- 基於electron-builder很是容易使用
- 沒有內置的Windows更新體驗好
- 在Windows上依舊存在權限問題
啓動時會調用更新器,而後一鍵安裝,等待更新完成後重啓。electron
6、增量更新
只更新不一樣的地方,所以只提供差別包便可,體積視修改面積決定,常見的更新方案以下:
- bsdiff、bspatch:在移動端很經常使用,適用於二進制文件,開源、免費
- Xdelta3:適用於二進制
- Courgette:Google提出的更新方案,是bsdiff和bspatch的優化
- RTPatch:是商業方案
7、客戶端灰度發佈
控制發佈風險,根據用戶標籤或者客戶端特徵進行,發佈時出現用戶體驗問題進行回滾。
8、Electron更新服務器
Electron提供了幾個更新服務器方案:
- Hazel – 用於私人或開源應用的更新服務器,能夠在 Now 上免費部署。 它從GitHub Releases中拉取更新文件,而且利用 GitHub CDN 的強大性能。
- Nuts-一樣使用GitHub Releases, 但得在磁盤上緩存應用程序更新並支持私有存儲庫.
- electron-release-server – 提供一個用於處理髮布的儀表板,而且不須要在GitHub上發佈發佈。
- Nucleus – 一個由Atlassian維護的 Electron 應用程序的完整更新服務器。 支持多種應用程序和渠道; 使用靜態文件存儲來下降服務器成本.
可是最大的問題就是沒法定製更新,所以咱們能夠本身實現更新服務。在更新方案中,客戶端使用autoUpdater模塊,可是Windows上依舊會存在一些問題,好比初次啓動沒法更新,Windows的更新通常是靜態存儲,能夠將更新包存放到對象存儲服務中,好比AWS S3。
autoUpdater是一個EventEmitter,提供一系列的事件,好比更細可用,更新下載完成等等。
Electron更新一直存在的問題:
- 文檔覆蓋不全面
- 包體積太大
- 沒有進度條
(1)macOS更新
響應內容:
{ "url": "https://example.com/update/release/name-version-platform.zip", "name": "My release name", "notes": "Update Text", "pub_date": "2020年 4月 1日 星期三 20時23分02秒 CST" }
響應狀態碼:
- 204:沒有內容,表示不須要更新
測試macOS下更新:
「鑰匙串訪問」-「證書訪問」-「證書助理」-「建立證書」,選擇自簽名證書。建立完成後,雙擊證書,安裝。
客戶端代碼邏輯:
const {autoUpdater} = require('electron'); autoUpdater.setFeedUrl('https://example.com/update/release/name-version-platform.zip'); autoUpdater.checkForUpdate(); // 檢查更新 autoUpdater.quitAndInstall(); // 退出並安裝更新
能夠監聽的事件:update-avliable、update-downloaded、error。
能夠經過dialog模塊通知用戶是否更新:
dialog.showMessageBox(); // 顯示信息 dialog.showOpenDialog(); // 打開對話框 dialog.showSaveDialog(); // 保存對話框
(2)Windows更新
響應內容:
包簽名 name-version-full.nupkg Hash值
安裝更新庫:
sudo npm i electron-squirrel-startup --save
在打包Windows的時候,會建立3個文件:
- 安裝包
- 更新包
- RELEASE,該文件就是更新服務器的響應體