hexiaoyi 发表于 2022-11-14 11:07

uni-app更新组件(支持整包,dwt包)更新进度条

1、整包更新重新下载app安装
打包apk文件下载

2、热更新app内升级更新
制作wgt包

大体实现思路:客户端像服务端发送当前app的版本号,服务端接收到版本号判断是否需要升级;


说明:
热更新不支持的情况
sdk部分有调整,比如新增maps模块等,不可通过此方式,必须整包升级
原生插件的增改,同样不能使用此方式。


页面部分:
<template>
        <view v-if="showUpdate" class="uploadView">
                <view class="dis-c contentView">
                        <view class="poupleTitle">
                                <view class="ver">新版本升级</view>
                                <view class="ver-n">V{{ list.version }}</view>
                        </view>
                        <view class="contentContent">
                                <text space="ensp">{{ list.description }}</text>
                        </view>

                        <view class="downNow">
                                <u-line-progress
                                        v-if="isDownload"
                                        style="width: 80%;"
                                        :height="16"
                                        :percentage="progress"
                                        activeColor="#2979ff"
                                ></u-line-progress>

                                <view class="bt" v-if="status == 0" @click="handleDownload(list)">{{ btTxt }}</view>
                                <view class="bt" v-else @click="handleUndown">取消下载</view>
                        </view>
                </view>

                <view class="closeview">
                        <u-icon
                                @click="closePouple"
                                style="border-radius: 50%;border: 1px #fff solid;padding: 6rpx;font-weight: bold;"
                                name="close"
                                color="#fff"
                                size="24"
                        ></u-icon>
                </view>
        </view>
</template>

组件js相关代码
export default {
        name: 'update',
        props: {
                list: {
                        type: Object
                }
        },
        data() {
                return {
                        isDownload: false, //是否下载
                        progress: 30, //下载进度
                        showUpdate: false,
                        status: 0, //0为下载1 下载中2已完成,
                        tempSuccessFileUrl: '', //下载的apk临时目录
                        dowmTask: null, //下载任务
                        desc: '版本描述。', //下载任务
                        btTxt: '开始下载',
                        version: '1.0.0',
                        type: null, //区分整包还是wgt包1:整包 2:wgt热更新
                        downTaskUrl: null
                }
        },
        methods: {
                //显示更新
                update(e) {
                        console.log('==>', e)
                        this.type = e
                        this.status = 0
                        this.progress = 0
                        this.isDownload = true
                        this.showUpdate = true
                },
                //关闭弹窗
                closePouple() {
                        this.showUpdate = false
                },
                handleDownload(item) {
                        /******************************* 更新逻辑 **********************************/
                        // this.type:1 整包
                        // this.type:2 dwt包
                        // this.status: 0, //0为下载1 下载中2已完成,
                        this.isDownload = true
                        this.progress = 1

                        if (this.status == 0) {
                                if (this.type == 1) {
                                        this.downTaskUrl = IP + item.pkgUrl
                                } else if (this.type == 2) {
                                        this.downTaskUrl = IP + item.wgtUrl
                                }

                                this.dowmTask = uni.downloadFile({
                                        url: this.downTaskUrl,
                                        // header: {
                                        //         Authorization: 'Bearer ' + Utils.getToken()
                                        // },
                                        success: res => {
                                                //下载完的临时文件url
                                                console.log(res)
                                                uni.hideLoading()
                                                // #ifdef APP-PLUS
                                                if (res.statusCode == 200) {
                                                        this.tempSuccessFileUrl = res.tempFilePath
                                                        console.log('进来了===' + this.tempSuccessFileUrl)
                                                        if (this.type == 1) {
                                                                //整包
                                                                plus.runtime.install(this.tempSuccessFileUrl)
                                                        } else if (this.type == 2) {
                                                                //热更新
                                                                plus.runtime.install(
                                                                        this.tempSuccessFileUrl,
                                                                        {
                                                                                force: true
                                                                        },
                                                                        function() {
                                                                                console.log('install success...')
                                                                                plus.runtime.restart()
                                                                        },
                                                                        function(e) {
                                                                                console.error('install fail...')
                                                                        }
                                                                )
                                                        }
                                                }
                                                // #endif
                                        },
                                        fail: err => {
                                                console.log(err)
                                                uni.hideLoading()
                                        }
                                })
                                this.dowmTask.onProgressUpdate(res => {
                                        //console.log('下载进度', res)
                                        if (res.progress > 0 && res.progress < 100 && this.status != 1) {
                                                this.status = 1
                                        }
                                        if (res.progress == 100 && this.status != 2) {
                                                this.status = 2
                                        }
                                        //console.log('下载进度' + res.progress)
                                        this.progress = res.progress
                                        //console.log('已经下载的数据长度' + res.totalBytesWritten)
                                        //console.log('预期需要下载的数据总长度' + res.totalBytesExpectedToWrite)
                                })
                        } else if (this.status == 2) {
                                //下载完成
                                // #ifdef APP-PLUS
                                //if (this.tempSuccessFileUrl) plus.runtime.install(this.tempSuccessFileUrl)
                                if (this.tempSuccessFileUrl) {
                                        if (this.type == 1) {
                                                //整包
                                                plus.runtime.install(this.tempSuccessFileUrl)
                                        } else if (this.type == 2) {
                                                //热更新
                                                plus.runtime.install(
                                                        this.tempSuccessFileUrl,
                                                        {
                                                                force: true
                                                        },
                                                        function() {
                                                                console.log('install success...')
                                                                plus.runtime.restart()
                                                        },
                                                        function(e) {
                                                                console.error('install fail...')
                                                        }
                                                )
                                        }
                                }
                                // #endif
                        }
                },
                //取消下载
                handleUndown() {
                        if (this.dowmTask) {
                                this.dowmTask.abort()
                                this.status == 0
                                uni.$u.toast('下载已取消')
                                this.closePouple()
                        }
                }
        },
        watch: {
                status: function(newV, oldV) {
                        if (newV == 0) {
                                this.btTxt = '开始下载'
                        } else if ((newV = 1)) {
                                this.btTxt = '下载中'
                        } else if (newV == 2) {
                                this.btTxt = '立即安装'
                        }
                }
        }
}

hexiaoyi 发表于 2022-12-22 09:15

嬉皮笑脸 发表于 2022-12-17 15:58
我这里是运行不起来。

updatebg.png是背景图片 随便找一张就可以,comm.js是配置的接口地址IP等公共信息,这个可以根据自己实际项目配置,也可以不引用。

manwu 发表于 2022-11-14 19:20

谢谢楼主,已收藏

koohik 发表于 2022-11-14 20:01

谢谢楼主分享

PLAQD 发表于 2022-11-15 07:43


谢谢楼主,已收藏

000932 发表于 2022-11-15 12:02

谢谢楼主分享

Wddxg 发表于 2022-11-15 13:08

谢谢楼主!!!

acexxx 发表于 2022-11-15 14:39

谢谢楼主!!!

jabir 发表于 2022-11-17 10:17

这是做什么的

hexiaoyi 发表于 2022-11-17 15:09

jabir 发表于 2022-11-17 10:17
这是做什么的

app更新用的

zbzhangbao9001 发表于 2022-11-20 10:56

感谢分享
页: [1] 2
查看完整版本: uni-app更新组件(支持整包,dwt包)更新进度条