Cash Loan(八):APP更新改造

【前言】

       最近在工作中发现一些奇怪的问题,出现一些按照正常的逻辑不可能出现的情况;第一直觉是有人刷接口进来的,经过对业务流程的梳理以及数据分析得出相同结论不应该出现这种情况,并让测试同事帮忙在测试环境模拟结果相同;

       百思不得其解时,另外一同事给出猜想,有可能用户是用的老版本的APP,按照这个思路果然将发现问题所在,我们在版本迭代过程中,主流程上做过变更,用老版APP会触发不到一些流程导致的;针对本次出现问题,我们进行了紧急修复。

【改造之旅】

        一、APP更新逻辑

              1、后台管理配置APP更新

                   在上新版本的APP时,相关管理人员会在我们的后台配置上APP版本,以及是否强制更新,同时将其他版本的APP配置置为失效状态;

                   说明:强制更新是指检测到有新的版本必须升级否则无法继续使用APP,不强制更新是指APP在检测到有新版本时只给用户提示,用户可以取消更新;

              2、APP及APP后台的更新接口逻辑

                  APP在每次启动时请求后台更新接口,后台去查当前配置有效的版本以及是否强更返回给APP;APP拿到后台返回的版本号和是否强更结果后,本身版本和后台返回版本做比较:

               (1)本身版本号>=后台返回版本号,不做提醒;

               (2)本身版本号<后台返回版本号,根据后台返回的强更给出用户相应的提示。

       二、改造逻辑梳理

             1、问题分析:

                 出现问题是由于,在配置强制更新的版本中,用户没有打开APP;

                 比如:用户在2018年6月1日下载APP版本号是V1.0.0;

                           我们在2018年6月10日升级系统(因系统流程有更改,故不支持V1.0.0版本)于是新发版APP在后台配置 V1.0.1  强制升级;   

                           我们在2018年6月20日升级系统(系统流程没有改动,支持V1.0.1版本),于是新发版APP并在后台配置 V1.0.2 不强制升级

                 正常用户如果在2018年6月10日到2018年6月20日启动我们APP的话会升级到V1.0.1这时是兼容没问题;但是如果用户在2018年6月10日到2018年6月20日没有使用APP在2018年6月20日之后使用,这时用户可以选择不更新,这时用户还是使用的V1.0.0版本的APP,此时再做业务的时候,便会出问题;

             2、问题修复:

                 APP请求更新接口时传入自己当前的版本号;后台去库中只要在这个版本到最新版本中有过强制更新,则返回强制更新;可以解决该问题;

               比如以上场景:用户在2018年6月20日后使用APP原来后台返回给APP的是V1.0.3版本 不需要强制更新;现在后台会根据APP传入的V1.0.0版本检查发现V1.0.1配置强更,于是会返回V1.0.3版本,强制更新

             3、大方向确定后,下面是程序处理逻辑;

                  (1)取当前后台配置的开启的版本,若配置是强制更新则直接返回;

                 (2)若不是强制更新,则去库中把所有配置是强更的版本拿到,判断如果有比APP传入的版本大,则将结果修改为强更返回;

       三、版本比较

            1、在数据库中版本号是以varchar类型存储,存储形式:1.0.0   1.0.1等,如果不做处理用字符串来比会出问题,因为对字符串处理是按ASCII码处理的;比如:在比较1.0.9和 1.0.10 时,因为9的ASCII码>1的ASCII码,于是得到1.0.9>1.0.10,显然不正确;

            2、在程序中可以通过正则表达式按照.切割后转换成数字进行比较,相应工具类如下:    

/**
     * 比较版本号的大小
     *
     * @param version1 版本 1
     * @param version2 版本 2
     * @return 版本1大则返回一个正数, 版本2大返回一个负数, 相等则返回0
     */
    public static int compareVersion(String version1, String version2) throws Exception {
        if (version1 == null || version2 == null) {
            throw new Exception("compareVersion error:illegal params.");
        }
        String[] versionArray1 = version1.split("\\.");//注意此处为正则匹配,不能用".";
        String[] versionArray2 = version2.split("\\.");
        int idx = 0;
        int minLength = Math.min(versionArray1.length, versionArray2.length);//取最小长度值
        int diff = 0;
        while (idx < minLength
                && (diff = versionArray1[idx].length() - versionArray2[idx].length()) == 0//先比较长度
                && (diff = versionArray1[idx].compareTo(versionArray2[idx])) == 0) {//再比较字符
            ++idx;
        }
        //如果已经分出大小,则直接返回,如果未分出大小,则再比较位数,有子版本的为大;
        diff = (diff != 0) ? diff : versionArray1.length - versionArray2.length;
        return diff;
    }

【总结】

       随着版本的迭代如果APP更新不改造的后,后期会有更多版本的兼容问题;发现有问题,如果其影响大一定要赶紧修复;

       遇到问题有第一直觉,接下来分析会无意识在辅证这一直觉会陷入思维误区,需要跳出来,多维度的去看问题,找到问题的根源所在;往往有种拨开云雾见青天的妙感。

猜你喜欢

转载自blog.csdn.net/u012829124/article/details/80715187