uniapp app 升级 - 蒲公英

启动APP时,需要一个接口提供是否有APP包更新,通过接口返回更新包的版本号、更新地址进等信息,通过获取app包版本号与更新包的版本号进行比较来进行更新。

一、发布蒲公英平台,进行实时APP更新(方案一)

1、获取manifest.json里的配置信息:plus.runtime.getProperty(plus.runtime.appid, function(widgetinfo) {})。
2、通过蒲公英api, 检测App是否有更新 接口获取APP更新内容,蒲公英 - 文档中心 - API 2.0


appKey值是APP唯一的key

3、用户版本号小于升级包版本号,先升级。
直接上代码:封装的方法可直接调用

export function checkUpdateApp() {
    //  获取manifest.json里的配置信息
    plus.runtime.getProperty(plus.runtime.appid, function(widgetinfo) {
        // 可以根据manifest.json里的应用名称来进行针对性的APP升级
        if (widgetinfo.name == 'xxxx') { //APP名称
            uni.request({
                url: 'https://www.pgyer.com/apiv2/app/check', //检测App是否有更新
                data: {
                    _api_key: '', //API 用户自己的Key
                    appKey: '' //App应用的唯一Key
                },
                success: check => {
                    console.log('check', check.data);
                    if (check.statusCode == 200 && check.data.code == 0 && check.data.data) {
                        console.log('1234');
                        let data = check.data.data;
                        console.log('data', data);
                        let version = widgetinfo.version, //用户当前版本
                            appVersion = data.buildVersion, //升级包版本
                            appName = widgetinfo.name, //app名称
                            // updata = data.apk_client_force_updata,//是否强制热更新
                            appurl = data.downloadURL, //升级包地址
                            intro = '发现新的《瑞金田长》APP,需要更新APP'; //升级包提示
                        // wgt_version = data.wgt_version,//热更新版本号
                        // wgt_download = data.wgt_download;//热更新地址
                        //如果用户版本号小于升级包版本号,先升级
    
                        if (data && version < appVersion) {
                            uni.showModal({
                                title: '更新提示',
                                confirmText: '立即升级',
                                content: intro,
                                success: res => {
                                    if (res.confirm) {
                                        uni.showLoading({
                                            title: '正在更新',
                                            mask: true
                                        });
                                        uni.downloadFile({
                                            url: appurl,
                                            success: download => {
                                                if (download.statusCode == 200) {
                                                    plus.runtime.install(
                                                        download.tempFilePath,
                                                        {
                                                            force: false
                                                        },
                                                        () => {
                                                            uni.hideLoading();
                                                            plus.runtime.restart(); //更新成功启动
                                                        },
                                                        err => {
                                                            //若没下载成功还是去下载
                                                            uni.hideLoading();
                                                            uni.showToast({
                                                                title: '更新失败,将跳转下载页面',
                                                                icon: 'none',
                                                                duration: 2000
                                                            });
                                                        }
                                                    );
                                                    setTimeout(function() {
                                                        plus.runtime.openURL(appurl);
                                                    }, 2000);
                                                }
                                            }
                                        });
                                    } else if (res.cancel) {
                                        console.log('用户点击取消');
                                        uni.showToast({
                                            title: '版本无法继续使用瑞金田长APP,请先升级',
                                            icon: 'none',
                                            duration: 2000
                                        });
                                        //退出app
                                        setTimeout(function() {
                                            plus.runtime.quit();
                                        }, 2000);
                                    }
                                },
                                fail: () => {
                                    uni.hideLoading();
                                }
                            });
                        } else {
                            
                        }
                    }
                }
            });
        } else {
            //非安卓
        }
    });
}

二、后台提供接口(方案二) APP升级或热更新

1、获取manifest.json里的配置信息:plus.runtime.getProperty(plus.runtime.appid, function(widgetinfo) {})
2、通过接口获取更新内容
3、如果用户版本号小于升级包版本号,先升级。
4、如果用户版本号大于升级包但不等于热更新版本的情况下,去热更新

<script>
export default {
    onLaunch: function() {
        console.log('App Launch');
    },
    onLoad() {
        
    },
    onShow: function() {
        // #ifdef APP-PLUS   //只有App才会执行 检查更新 方法
        uni.getSystemInfo({
            success: (res) => {
                var that = this;
                //检测当前平台,如果是安卓则启动安卓更新  
                if (res.platform == "android") {
                    that.checkUpdateApp();
                }
            }
        })
        // #endif
    },
    onHide: function() {
        
    },
    methods:{
        /* 检查更新 在线更新 */
        checkUpdateApp(){
            //  获取manifest.json里的配置信息
            plus.runtime.getProperty(plus.runtime.appid, function(widgetinfo) {
                // 可以根据manifest.json里的应用名称来进行针对性的APP升级
                if (widgetinfo.name == "xxxx") { //APP名称
                    // 获取manifest.json里的版本号   
                    uni.request({
                        url:'',//服务器请求更新信息地址
                        success:(srcData) => {
                            console.log(srcData)
                            let data = srcData.data;
                            let version = widgetinfo.version,//用户当前版本
                                appVersion = data.apk_client_version,//升级包版本
                                appName = widgetinfo.name, //app名称
                                updata = data.apk_client_force_updata,//是否强制热更新
                                appurl = data.apk_client_download,//升级包地址
                                intro = data.apk_client_intro,//升级包提示
                                wgt_version = data.wgt_version,//热更新版本号
                                wgt_download = data.wgt_download;//热更新地址
                            
                            //如果用户版本号小于升级包版本号,先升级   
                            if(data && (version < appVersion)){
                                uni.showModal({
                                    title:"更新提示",
                                    confirmText:"立即升级",
                                    content:intro,
                                    success: (src) => {
                                        if (res.confirm) {
                                            uni.showLoading({
                                                title:"正在更新",
                                                mask:true
                                            })
                                            uni.downloadFile({
                                                url:appurl,
                                                success: (download) => {
                                                    if(download.statusCode == 200){
                                                        plus.runtime.install(download.tempFilePath,{
                                                            force:false
                                                        },()=>{
                                                            uni.hideLoading();
                                                            plus.runtime.restart();//更新成功启动
                                                        },(err)=>{//若没下载成功还是去下载
                                                            uni.hideLoading();
                                                            uni.showToast({
                                                                title:"更新失败,将跳转下载页面",
                                                                icon:"none",
                                                                duration:2000
                                                            })
                                                        })
                                                        setTimeout(function(){
                                                            plus.runtime.openURL(appurl);
                                                        },2000)
                                                    }
                                                }
                                            })
                                        } else if (res.cancel) {
                                            console.log('用户点击取消');
                                            uni.showToast({
                                                title:"版本无法继续使用瑞金田长APP,请先升级",
                                                icon:"none",
                                                duration:2000
                                            })
                                            //退出app
                                            setTimeout(function(){
                                                    plus.runtime.quit();
                                            },2000)
                                        }
                                    },
                                    fail: () => {
                                        uni.hideLoading();
                                    }
                                })
                            }else{
                                
                            }
                            
                            //如果用户版本号大于升级包但不等于热更新版本的情况下,去热更新
                            if(data && (version >= appVersion) && (version != wgt_version)){
                                uni.showLoading({
                                    title:"正在更新包,请稍后...",
                                    mask:true
                                })
                                uni.downloadFile({
                                    url:wgt_download,
                                    success: (wgtdow) => {
                                        if(wgtdow.statusCode == 200){
                                            plus.runtime.install(wgtdow.tempFilePath,{
                                                force:true
                                            },()=>{
                                                uni.hideLoading();
                                                plus.runtime.restart();//更新成功启动
                                            },(err)=>{//若没下载成功还是去下载
                                                uni.hideLoading();
                                                uni.showModal({
                                                    content:"更新失败,请手动下载最新瑞金田长APP",
                                                    success: (res) => {
                                                        plus.runtime.openURL(wgt_download);
                                                    }
                                                })
                                            })
                                            
                                        }
                                    }
                                })
                            }
                        
                        }
                    })
                } else {
                    //非安卓
                }
            });
            
        }
    },
};
</script>
 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容