uniapp開發(fā)APP之強制更新和熱更新的實現(xiàn)
前言
app和h5相比,有著更新延遲和更新難的特性,h5在部署更新后可以保證所有用戶訪問的都是最新的功能,而app則可能存在多個版本,用戶也可以選擇不升級繼續(xù)使用;
但是有時候,app進行了大規(guī)模的調(diào)整,導致之前所有版本的app都不可用,或者一些重要功能作出了調(diào)整(比如收費內(nèi)容發(fā)生改變),強制用戶需要更新app,這樣的情況并不少見;
因此在第一版本的app內(nèi),就應(yīng)該把包內(nèi)更新的功能加上,以保證app的更新續(xù)航。
整包更新和熱更新
APP的更新分為整包更新和熱更新。
整包更新是指下載完整apk文件進行覆蓋安裝。
熱更新是指把app有改動的地方打包進wgt文件,只更新wgt文件中的內(nèi)容,不進行整包安裝,在用戶視角也叫做省流量更新
版本號約束
既然是版本更新,那就離開版本號的約束。
因為涉及兩種更新方式,所以要先制定版本號的規(guī)范:
建議 嚴格遵循 Semantic Versioning 2.0.0 語義化版本規(guī)范。
主版本號:不兼容的 API 修改
次版本號:向下兼容的功能性新增
修訂號:向下兼容的問題修正
實現(xiàn)原理
- 開發(fā)后臺版本管理功能,每次發(fā)版上傳android安裝包,記錄版本號、是熱更新還是整包更新、是否強制更新等
- 每次打開app(onLaunch生命周期)的時候,通過接口請求最新版本信息,再獲取當前安裝包信息,對比版本號
- 如果版本號不一致,且接口獲取的版本號大于當前應(yīng)用的版本號,則進行整包更新或熱更新。
- 需要注意的是,ios并不存在下載安裝包覆蓋安裝這種操作,所以在ios平臺需要跳轉(zhuǎn)到appstore進行更新
export default { onLaunch: function() { // 條件編譯,只在app環(huán)境下進行更新操作 // #ifdef APP-PLUS if (process.env.NODE_ENV === 'production') { // 只在正式環(huán)境下啟用,避免更新影響開發(fā)和測試環(huán)境(這步取決于你的需求) // 獲取app運行信息 plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) { // 通過接口獲取最新版本信息,具體請求不演示 getVersion({ platform: '1' }).then(res => { if (!res) { return; } // 版本號得到的是類似 '7.0.1'的字符串,把它去除.并轉(zhuǎn)為純數(shù)字 const appCode = parseInt(res.app_code.split('.').join('')) const version = parseInt(widgetInfo.version.split('.').join('')) if (appCode > version) { // 只有接口版本號 > 當前包版本號才進行更新 // type為0熱更新(看接口設(shè)計) if (res.type == '0') { // 熱更新,下載更新文件,這一步可以先顯示更新提示的ui,用戶點擊更新后再下載更新 this.updateHot(res.download_url) } else if (res.type == '1') { // 整包更新,這一步可以先顯示更新提示的ui,用戶點擊更新后再下載更新 this.updatePackage(res.download_url) } } }).catch(err => { console.error(err) }) }); } }, methods: { // 整包更新 updatePackage(url) { // ios平臺不允許這樣更新,所以我們需要跳轉(zhuǎn)到appstore進行更新 if (uni.getSystemInfoSync().platform === 'ios') { plus.runtime.launchApplication({ action: 'itms-apps://xxx' // 鏈接可以通過接口獲取 }); } else { this.isDownloading = true // 構(gòu)建了下載任務(wù),但此時并未開始下載 const dtask = plus.downloader.createDownload(url, {}, (downloadResult, status) => { if (status === 200) { plus.runtime.install(downloadResult.filename, { force: false }, function() { plus.runtime.restart(); // 安裝成功后重啟 }, function(e) { uni.showToast({ icon: 'none', title: '下載更新失敗' }) }); } } ); // 執(zhí)行安裝包下載 dtask.start(); } }, // 熱更新 updateHot(url) { uni.downloadFile({ url, success: (downloadResult) => { if (downloadResult.statusCode === 200) { // 下載更新文件成功后進行安裝 plus.runtime.install(downloadResult.tempFilePath, { force: false // 是否強制安裝, 如果將要安裝應(yīng)用的版本號不高于現(xiàn)有應(yīng)用的版本號則終止安裝,并返回安裝失敗。 }, function() { uni.showToast({ title:'更新完畢,即將重啟', icon: 'none', position: 'bottom' }) setTimeout(() => { plus.runtime.restart(); // 安裝完成后重啟應(yīng)用 },2000) }) } } }); } } }
其他方案
插件市場提供了uni-upgrade-center升級方案,包含了后臺管理app版本以及app自動更新的邏輯,需要注意的是后臺管理是基于uni-admin框架的插件,如果應(yīng)用內(nèi)沒有使用uni-admin,集成起來會相對麻煩
參考資料
總結(jié)
到此這篇關(guān)于uniapp開發(fā)APP之強制更新和熱更新的文章就介紹到這了,更多相關(guān)uniappAPP強制更新和熱更新內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js獲取當前年月日時分秒的方法實例(new?Date()/moment.js)
JavaScript是一種流行的編程語言,它可以用來獲取當前年月日,這篇文章主要給大家介紹了關(guān)于js獲取當前年月日時分秒的相關(guān)資料,分別使用的是new?Date()/moment.js,需要的朋友可以參考下2024-07-07使用JavaScript腳本無法直接改變Asp.net中Checkbox控件的Enable屬性的解決方法
今天工作中遇到個小問題,情況如下,當我在后臺頁面中設(shè)置Checkbox的Enable的值為false時,我在前端頁面中使用腳本(chk.disabled = false),無法改變disabled的值為false,下面看看小編是怎么解決此問題的,需要的朋友一起了解了解吧2015-09-09javascript檢測瀏覽器flash版本的實現(xiàn)代碼
javascript檢測瀏覽器flash版本的實現(xiàn)代碼,需要的朋友可以參考下。2011-12-12JavaScript對象拷貝與Object.assign用法實例分析
這篇文章主要介紹了JavaScript對象拷貝與Object.assign用法,結(jié)合實例形式分析了javascript深拷貝與淺拷貝以及Object.assign的功能與相關(guān)使用技巧,需要的朋友可以參考下2018-06-06