uniapp實現(xiàn)Android自動更新(非熱更新)

思路:

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文件的接口

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容