整包更新:應(yīng)用在大版本更新叮阅,內(nèi)容更新較多時使用
熱更新:應(yīng)用在小版本更新,內(nèi)容更新較少時
整體流程:
注: 1. plus.runtime 文檔見 https://www.html5plus.org/doc/zh_cn/runtime.html
- 對于不同設(shè)備類型身腻,可通過 plus.os.name.toLocaleLowerCase()獲取诗越。
- 我們apk存放在oss上,有一個增量更新的文件夾嘲恍,一個安卓apk的文件夾足画,蘋果版本在商店上架
一. 蘋果應(yīng)用更新
- 使用plus.runtime.getProperty方法獲取指定APPID對應(yīng)的應(yīng)用信息,主要獲取當(dāng)前app應(yīng)用版本號佃牛。
- 通過訪問https://itunes.apple.com/cn/lookup?id=${appId},獲取蘋果商店中應(yīng)用的版本號锌云。
- 對比版本號,蘋果商店版本 > 當(dāng)前pad版本時吁脱,有大版本更新(整包更新)桑涎,直接從蘋果商店下載新版本彬向。
- 對比版本號,蘋果商店版本 < 當(dāng)前pad版本時攻冷,沒有大版本更新(整包更新)娃胆,此時去訪問后端接口,查看是否有增量更新的版本等曼,如果有里烦,通過plus.runtime.install下載。
二. 安卓應(yīng)用更新
- 使用plus.runtime.getProperty方法獲取指定APPID對應(yīng)的應(yīng)用信息禁谦,主要獲取當(dāng)前app應(yīng)用版本號胁黑。
- 訪問后端接口查看(接口傳入上面的版本號),此時查詢的是大版本(整包)文件夾下的版本州泊,是否有最新版本丧蘸。
- 有大版本版本更新時,通過后端接口遥皂,拿到鏈接力喷,plus.runtime.openFile下載。
- 沒有大版本版本更新時演训,訪問后端接口查增量更新文件夾下弟孟,有沒有最新版本,如果有样悟,通過plus.runtime.install下載拂募。
代碼:
在項(xiàng)目主頁,每次進(jìn)來先檢查更新
// 更新檢測
checkUpdate () {
plus.runtime.getProperty(plus.runtime.appid, (wgtinfo) => {
const platform = plus.os.name.toLocaleLowerCase()
if (platform === 'ios') {
uni.request({
url: `https://itunes.apple.com/cn/lookup?id=${appId}`,
success: (res) => {
const info = res.data.results[0] // 蘋果返回的產(chǎn)品詳情
let currentVersion = currentVer.replace(/\./g,'');
let newVersion = newVer.replace(/\./g,'');
// 蘋果商店最新版本 > 當(dāng)前pad版本 時窟她,有大新版本
if (newVersion > currentVersion) {
// 獲取更新內(nèi)容
this.getProductInfo();
} else {
// 如果沒有大版本更新没讲,去增量更新文件查找有沒有需要增量更新是文件
this.getIncremental();
}
}
})
} else {
this.server.checkVersion().then(async res => {
if (res.code == 200) {
// 有大版本更新,獲取更新內(nèi)容礁苗,打開彈窗
if (res.data) {
// 獲取更新內(nèi)容
this.getProductInfo();
} else {
// 如果沒有大版本更新爬凑,去增量更新文件查找有沒有需要增量更新是文件
this.getIncremental();
}
}
})
}
})
},
// 點(diǎn)擊彈窗確認(rèn),點(diǎn)擊下載
confirm () {
this.$refs.version.close();
this.updateOfApk()
},
// 下載apk包
updateOfApk () {
const platform = plus.os.name.toLocaleLowerCase()
if (platform === 'ios') {
// ios從蘋果商店下載
plus.runtime.launchApplication({
action: `itms-apps://itunes.apple.com/cn/app/id${appId}?mt=8`
}, function (e) {
console.log('Open system default browser failed: ' + e.message);
})
} else {
// 安卓下載從后端獲取的oss上下載
this.getUrlToOss()
}
},
// 獲取當(dāng)前版本更新內(nèi)容
getProductInfo () {
this.server.getProductDescription().then(res => {
if (res.code === 200) {
// 打開彈窗试伙,顯示更新內(nèi)容
this.$refs.version.open()
}
})
},
// 增量更新
async getIncremental (currentVersion) {
try {
// 檢查小版本更新
let res = await this.server.checkVersion()
// res.data為false時嘁信,沒有有新版本
if (!res.data) return
// 有小版本更新,獲取下載地址疏叨,進(jìn)行增量更新
let urlData = await this.server.downloadURL()
// 接口報錯截止
if (urlData.code !== 200) return
// uni下載文件
let downUrl = await this.uniDownLoadFile()
// 接口報錯截止
if (downUrl.statusCode !== 200) return
// 下載文件
plus.runtime.install(downUrl.tempFilePath, {
force: false
}, () => {
plus.runtime.restart(); // 重啟項(xiàng)目
}, (e) => {
// 調(diào)用一個接口潘靖,將e返回咯
console.log(e)
});
} catch (e) {
console.log(e)
}
},
// 安卓下載地址
async getUrlToOss () {
try {
let res = await this.server.downloadURL()
if (res.code !== 200) return
// uni下載文件
let downUrl = await this.uniDownLoadFile(res.data)
// 接口報錯截止
if (downUrl.statusCode !== 200) {
uni.showToast({
title: this.$t('error.下載失敗'),
duration: 2000,
icon: 'none'
});
return
}
// 下載文件
plus.runtime.openFile(downUrl.tempFilePath);
} catch (e) {
console.log(e, 'e')
}
},
// uni的下載文件
uniDownLoadFile (data) {
return new Promise((resolve, reject) => {
uni.downloadFile({
url: data,
success: (res) => {
resolve(res)
},
fail: (err) => {
reject(err)
}
});
})
}