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

