UNI-APP热更新前后端代码,妈妈再也不用担心我的代码了。

2020-05-06  本文已影响0人  十一他叫路易斯
image.png

朋友,你是否天天更新前端几点鸡毛蒜皮代码,就要重新云打包一次。
朋友,你是否流量不够多,每次更新功能就要下一次APP。
朋友,你是否失眠过多,经常掉发?
集美们,魔鬼来咯。他来了他来了!偶买噶,热更新他来了。


image.png

Uni在APP.vue 生命周期钩子onLaunch中进行设备判断,
判断为手机,获取手机APPID,设备版本号。设备类型[安卓,苹果],那什么时候进行热更新,什么时候进行重更新呢?


image.png

重更新:服务端v2.1.103 客户端v1.1.103
热更新:服务端v1.1.104 客户端v1.1.103

uni打包wgt发给后端放在线上。


image.png image.png

注意!!!热更新必须为打包后的APP安装版本,真机调试无效!机调试无效!调试无效!

前端代码块-App.vue

onLaunch: function() {
        // #ifdef APP-PLUS
        plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {
            console.log(widgetInfo);
            uni.request({
                url: '不为人知的请求接口',
                data: {
                    appid: widgetInfo.appid,
                    version: widgetInfo.version,
                    name: plus.os.name
                },
                success: res => {
                    console.log(res);

                    if (res.data.code == 200) {
                        console.log(res);
                        // 重大更新
                        if (res.data.data.status == '1') {
                            uni.showModal({
                                //提醒用户更新
                                title: '更新提示',
                                content: res.data.note,
                                success: res => {
                                    if (res.confirm) {
                                        plus.runtime.openURL(res.data.url);
                                    }
                                }
                            });
                        }

                        // 热更新
                        if (res.data.data.status == '2') {
                            console.log('热更新');
                                                       //调用uni-downloadFile方法,具体可看API文档。
                            uni.downloadFile({
                                url: res.data.data.url,
                                success: downloadResult => {
                                    if (downloadResult.statusCode === 200) {
                                        console.log(downloadResult.tempFilePath);
                                        plus.runtime.install(
                                            downloadResult.tempFilePath,
                                            {
                                                force: false
                                            },
                                            function() {
                                                console.log('install success...');
                                                plus.runtime.restart();
                                            },
                                            function(e) {
                                                console.error('install fail...');
                                            }
                                        );
                                    }
                                },
                                fail: err => {
                                    console.log(err);
                                    console.log('热更新失败');
                                }
                            });
                        }
                    }
                }
            });
        });
        // #endif
    }
image.png

后端代码块(Php)

//服务端配置APP 更新参数 ($app_info["version"] 版本号    $app_info['id'] APP对应APPID )
        $app_info = config('app.APP_INFO');

        $appid = $data["appid"]; //客户端APPID
        $version = $data["version"]; //客户端版本号
        $name = $data['name']; //客户端设备

        //判断更新类型
        //取出版本号重大更新标签  比如 1.2.101 取出1
        $data_num = substr($data["version"],0,1);
        $app_num = substr($app_info["version"],0,1);

        if ($data["version"] == $app_info["version"]){
            //如果两个版本号一致,表示不更新
            $rsp["status"] = 0;
        }else if ($app_num - $data_num >= 1){
            //当两个版本号重大更新标签  相差大于或等于的时候 表示有重大更新
            $rsp["status"] = 1;
        }else if ($app_num - $data_num == 0){
            //其余不相等的为热更新,这里可以详细判断,但是没必要
            $rsp["status"] = 2;
        }

        if (isset($appid) && isset($version)) {
            if ($appid === $app_info['id']) { //校验appid
                if ($version !==  $app_info['version']) { //这里是示例代码,真实业务上,最新版本号及relase notes可以存储在数据库或文件中
                    // 1为整包更新,2为热更新
                    if($rsp["status"]==1){
                        $rsp["note"] = "修复bug1;\n修复bug2;"; //release notes
                        if ($name=="Android") {
                            $rsp["url"] = "";   // Android下载地址
                        }else{
                            $rsp["url"] = "";  // IOS下载地址
                        }
                    }else if ($rsp["status"]==2){
                        $rsp["url"]= '';    // 热更新包
                    }
                }
            }
        }
上一篇下一篇

猜你喜欢

热点阅读