uniapp 更新APP

/** App更新调用,在App.vue中调用
 * 最少字段 {"version":1.0.0,"file":"appUrl"}
 * 返回:{"update":true,"file":"appUrl"}
 * */

let $updateApp = (CloudAppUrl)=>{
    return new Promise((resolve,reject)=>{
        //获取本地版本信息
        let App = plus.runtime.getProperty(plus.runtime.appid,(info) => {
            if(CloudAppUrl.version !== undefined && CloudAppUrl.version !== null){
                if(CloudAppUrl.file !== undefined && CloudAppUrl.file !== null){
                    if(CloudAppUrl.version > info.version){
                        resolve({"update":true,"file":CloudAppUrl.file})
                    }
                }
            }
            reject({"update":false})
        })        
    })
}


/** 开始下载更新
 * 参数:url地址
 * 无返回:直接执行
 */

let $download = (fileUrl)=>{
    let options = {
        method:'GET',
        timeout:10,
        retry:1
    }
    // 创建开始下载
    let down = plus.downloader.createDownload(fileUrl,options,function(d,status){
        
        if(status === 200){
            // 下载成功以后调用APP安装
            plus.runtime.install(plus.io.convertLocalFileSystemURL(d.filename,{},{},function(err){
                plus.nativeUI.toast("更新程序安装失败")
            }))
        }else{
            plus.downloader.clear()
            down.abort()
            // 请求失败
            plus.nativeUI.toast('更新程序下载失败:'+status)
        }
    })
    try{
        // 开始下载
        down.start()
        // 获取当前下载进度
        let showLoadin = plus.nativeUI.showWaiting("开始下载....")
        down.addEventListener('statechanged',function(task,status){
            // 给下载人物设置一个监听
            switch(task.state){
                case 1:
                    showLoadin.setTitle("开始下载.....")
                    break;
                case 2:
                    showLoadin.setTitle("已连接到服务器")
                    break;
                case 3:
                    // console.log("当前",task.downloadedSize / task.totalSize * 100)
                    
                    let pr = parseInt((parseFloat(task.downloadedSize)/parseFloat(task.totalSize)*100))
                    showLoadin.setTitle('已下载:' +pr+ '%' )
                    break;
                case 4:
                    plus.nativeUI.closeWaiting()
                    // 下载完成
                    break;
            }
        })
    }catch(err){
        down.abort()
        plus.nativeUI.closeWaiting();
        throw new Error("更新程序出现错误")
    }
} 


// app更新
// 参数为对象:{"version":1.0.0,"file":"appUrl"}
 

let $updateAppRequest = (updateUrl)=>{
    uni.getNetworkType({
        success:res=>{
            // 当前是否有网络连接
            if(res.networkType === 'none'){
                console.log('当前无网络连接');
                uni.showToast({
                    icon:'none',
                    title:'当前无网络连接',
                    duration:3000
                })
            }else{
                // 判断版本是否需要更新
                $updateApp(updateUrl).then((res)=>{
                    if(res.update){
                        uni.showModal({
                            title:'有新版本更新!',
                            content:'立即更新后才能使用!',
                            showCancel:false,//隐藏取消按钮
                            confirmText:'立即更新',
                            confirmColor:'#576b95',
                            success:function(){
                                // 调用下载
                                $download(res.file)
                            }
                        })
                    }
                })
                
            }
        }
    })
}

猜你喜欢

转载自blog.csdn.net/cyz141001/article/details/130977114