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>
 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容