HTML5進階 二 HBuilder實現軟體自動升級
HBuilder實現軟體自動升級
前言
移動APP開發好後需要實現軟體自動升級功能,經過一番搜尋,發現HBuilder具有“App資源線上升級更新”的功能,遂研究之。
經過一番測試,在原始碼思想的基礎之上對其進行了優化。程式碼如下:
var wgtVer = null;
function plusReady(){
// 獲取本地應用資源版本號
plus.runtime.getProperty(plus.runtime.appid,function(inf){
wgtVer=inf.version;
console .log("當前應用版本:" + wgtVer);
console.log("=================版本測試=================");
});
}
if(window.plus){
plusReady();
}else{
document.addEventListener('plusready',plusReady,false);
document.addEventListener('plusready',checkUpdate,false);
}
// 檢測更新
var checkUrl="http://www.weimingcloud.cn/lmapp/versionCheck.html" ;
function checkUpdate(){
plus.nativeUI.showWaiting("檢測更新...");
/* $ionicLoading.show({
template: "檢測更新..."
});
$timeout(function() {
$ionicLoading.hide();
}, 1200);*/
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
switch(xhr.readyState){
case 4:
plus.nativeUI.closeWaiting();
if (xhr.status == 200){
console.log("檢測更新成功:" + xhr.responseText);
// 讀取最新版本號
var newVer = xhr.responseText;
console.log("最新版本:" + newVer);
if(wgtVer && newVer && (wgtVer != newVer)){
// H5 plus事件處理,彈出提示資訊對話方塊
plus.nativeUI.confirm("\"立馬送藥\"檢測到新版本,是否更新?", function(e) {
if(e.index == 0){
console.log("確定!");
downWgt(); // 下載升級包
}
}, " 立馬送藥", ["確定", "取消"]);
}else{
plus.nativeUI.alert("無新版本可更新!");
}
}else{
console.log("檢測更新失敗!");
plus.nativeUI.alert("檢測更新失敗!");
}
break;
default:
break;
}
}
xhr.open('GET',checkUrl);
xhr.send();
}
// 下載wgt檔案
var wgtUrl = "http://www.weimingcloud.cn/lmapp/files/download/H5202FBD5.wgt";
function downWgt(){
plus.nativeUI.showWaiting("下載wgt檔案...");
plus.downloader.createDownload( wgtUrl, {filename:"_doc/update/"}, function(d,status){
if ( status == 200 ) {
console.log("下載wgt成功:"+d.filename);
installWgt(d.filename); // 安裝wgt包
} else {
console.log("下載wgt失敗!");
plus.nativeUI.alert("下載wgt失敗!");
}
plus.nativeUI.closeWaiting();
}).start();
}
// 更新應用資源
function installWgt(path){
plus.nativeUI.showWaiting("安裝wgt檔案...");
// force:false進行版本號校驗,如果將要安裝應用的版本號不高於現有應用的版本號則終止安裝,並返回安裝失敗
plus.runtime.install(path,{force:false},function(){
plus.nativeUI.closeWaiting();
console.log("安裝wgt檔案成功!");
plus.nativeUI.alert("應用資源更新完成!",function(){
plus.runtime.restart();
});
},function(e){
plus.nativeUI.closeWaiting();
console.log("安裝wgt檔案失敗[" + e.code + "]:" + e.message);
plus.nativeUI.alert("安裝wgt檔案失敗[" + e.code + "]:" + e.message);
});
} <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
問題
注:確實在檔名上出問題,同一wgt檔名多次升級則出錯提示了,即使提示"應用資源更新完成!" ,但版本號還是沒更新的,因此同一wgt檔名只能使用一次, 這不知是哪裡的bug.
果然是這個問題,更新包的名稱不能重複,Android上第一次用了update.wgt。那麼第二次就不能用這個名字了,得換一個名字,IOS是好的。
更新完成後,再次進入APP,發現版本號沒變,還是原來的,接著有時更新....
遇到了上述問題,通過以上方法還是未能解決。難道這本身就是HBuilder的一個BUG?
檢測更新更好的模式應該是客戶端提交本地應用資源版本號到升級伺服器,由升級伺服器判斷是否可更新並且返回App升級資源包下載地址,避免在客戶端寫資源下載地址;
更新時可以在後臺靜默下載,下次啟動是直接更新,避免更新時打斷使用者操作。
使用官方Demo可以,懷疑是自己的wgt出錯。
升級第一次成功,第二次也成功了!打成包試試.....1.0、2.0..格式可以。
注
版本更新時,需要做到wgt版本與versionCheck.html中的版本號一致。
有圖有真相
優化
HTML5進階(三)HBuilder實現軟體自動升級(優化篇)參考文獻
1.http://ask.dcloud.net.cn/article/182
2.http://ask.dcloud.net.cn/question/12487
3.http://ask.dcloud.net.cn/question/11143
4.http://ask.dcloud.net.cn/article/282
5.http://ask.dcloud.net.cn/question/4088
6.http://www.dcloud.io/docs/api/zh_cn/runtime.shtml#plus.runtime.restart
7.http://ask.dcloud.net.cn/search/q-d2d0#all
8.http://www.html5plus.org/specification/Runtime.html
美文美圖
再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!https://www.cnblogs.com/captainbed