思路:
1.在首頁檢測手機類型,為Android手機則判斷是否有版本更新
2.獲取api接口的版本號,對比app的版本號,api大于app則有版本更新
3.確認瀏覽器是否能訪問apk的下載地址(一般的IIS服務器都能訪問)
4.根據(jù)apk下載地址創(chuàng)建下載任務
5.監(jiān)聽下載進度
一、Vue
1.在首頁判斷手機類型
//onLoad
uni.getSystemInfo({
success: (res) => {
if(res.platform=="android"){
this.AndroidCheckUpdate();//檢測版本更新的方法
}
}
})
2.自動更新方法
AndroidCheckUpdate(){//自動更新
//獲取版本號并賦值到data數(shù)據(jù)中的versionapp
plus.runtime.getProperty(plus.runtime.appid,(wgtinfo)=>{
this.versionapp = wgtinfo.versionCode
})
uni.request({
url: ,//后臺接口,獲取連接api的版本號
data:{},
success:res=>{
var dataversion = res.data;//api版本號
if(res.data>this.versionapp){//api版本號高于現(xiàn)app版本號,則有新版本
if(plus.networkinfo.getCurrentType()!=3){
uni.showToast({
title: '有新版本發(fā)布,檢測到您目前非WiFi連接,為節(jié)約您的流量,程序已停止自動更新,將在您連接WIFI后重新檢測更新!',
mask: true,
duration: 5000,
icon: "none"
});
return;
}else{
var that = this;
uni.showModal({
title: "版本更新",
content: '有新版本發(fā)布,檢測到您當前為WIFI連接,是否立即進行新版本下載?',
confirmText: '立即更新',
cancelText: '稍后更新',
success: function(res){
if(res.confirm){
var downurl = that.apiRoot + '/apkupdate/uploadurl';//api接口,返回要下載的apk文件(或者直接寫IIS服務器的地址)
console.log(downurl)
var dtask = plus.downloader.createDownload(downurl,{},function(d,status){//下載任務,打開安裝程序
if(status == 200){
plus.runtime.install(plus.io.convertLocalFileSystemURL(d.filename),{},{},function(error){
uni.showToast({
title:'安裝失敗',
mask: false,
duration:1500,
icon: "none"
});
console.log(error)
})
}else{
uni.showToast({
title:'更新失敗',
mask: false,
duration:1500,
icon: "none"
});
}
});
console.log(dtask)
dtask.start();
//監(jiān)聽下載
var prg = 0;
var showLoading = plus.nativeUI.showWaiting("正在下載...")
dtask.addEventListener("statechanged",function(download,status){
switch(download.state){
case 2:
showLoading.setTitle("開始下載")
break;
case 3:
prg = parseInt((parseFloat(dtask.downloadedSize)/parseFloat(dtask.totalSize))*100);
showLoading.setTitle("下載進度"+prg+"%");
console.log('下載進度',dtask.downloadedSize,dtask.totalSize,'百分比',prg);
break;
case 4:
mui.toast("下載完成");
plus.nativeUI.closeWaiting();
break;
}
});
}else if(res.cancel){
console.log('稍后更新')
}
}
});
}
}
},
fail:()=>{
uni.showToast({
title: '調(diào)用請求失敗',
mask: false,
duration: 5000,
icon: "none"
})
}
})
},
二、C#返回apk文件的接口
var local = HttpRuntime.AppDomainAppPath.ToString();//API物理路徑
var version = Config.GetValue("Version");//獲取config文件的版本號
var dataurl = local+"軟件名稱"+version+".apk";//apk物理路徑
byte [] byteArray;//文件二進制流數(shù)組
using (FileStream fs = new FileStream(apk物理路徑,FileMode.Open,FileAccess.Read)){
byteArray = new byte[fs.Length];
fs.Read(byteArray,0,byteArray.Length);
}
MemoryStream ms = new MemoryStream(byteArray);
var contentType = "application/vnd.android.package-archive";//apk類型
return Response.FromByteArray(ms.ToArray(),contentType);
三、附
1.HTTP Content-type 對照表:https://blog.csdn.net/superbigcupid/article/details/48782335
2.已創(chuàng)建下載任務但totalSize為0且進度條無反應,考慮IIS的MIME類型是否支持apk
3.瀏覽器無法訪問api服務器,寫一個返回apk文件的接口