App版本升级方案

发布于:2019-03-25 11:40:06

App版本升级方案小结


方案一:后端处理逻辑 - 通过指定数字版本号判断 app/ipad升级

入参数:

   appid app应用类型:1.A商城android app、2.A商城android ipad、3.A商城 ios app
   cur_version 当前app版本数字号,如99,必须

响应json参数:
    code
    msg
    data
    data下字段如下:
            1.最新app版本数字号 :new_version,如100,必须
            2.用于展示的app版本号 : app_version,如v1.0.1,必须
            3.apk或app store下载url : down_url,必须
            4.更新文案 : update_desc,必须
            5.是否可更新 : is_update,1需要更新,0无需更新,必须
            6.是否强制更新 : force_update,1强升、0无需强升,必须
            7.apk大小:app_size,单位字节,必须
            8.apk文件md5值:apk_md5,字符串,可选

json示例: {

	"code": 0,
"msg": "",
"data": {
"new_version": 100,
"app_version": "v1.0.1",
"down_url": "http://www.nfangbian.com/app.apk",
"update_desc": "优化app体验",
"is_update": 1,
"force_update": 0,
"app_size": "1000000",
"apk_md5": ""
}
}


服务端判断逻辑:
            查询最新版本信息SQL: select * from t_app_upgrade where appid=1 and is_delete=0 order by new_version desc limit 1;

            1. 默认值is_update = 0, force_update = 0
            2. 如果cur_version < new_version,则is_update = 1
            3. 如果cur_version < min_version,则force_update = 1
            4. 如果cur_version >= min_version,则force_update = 0
            5. 如果cur_version == new_version,则is_update = 0

表结构:
CREATE TABLE `t_app_upgrade` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
    `appid` tinyint(4) unsigned NOT NULL DEFAULT 0 COMMENT 'app应用类型:1.A商城 android app 、2.A商城 android ipad、3.A商城 ios app',
    `app_name` varchar(20) NOT NULL DEFAULT '' COMMENT 'App名称,如A商城',
    `update_desc` varchar(155) NOT NULL DEFAULT '' COMMENT '更新文案',
    `app_version` varchar(20) NOT NULL DEFAULT '' COMMENT '当前app版本,用于展示的,如v1.0.1',
    `new_version` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '数字版本号,最新版本按这个倒序排即可,例如100就代表是v1.0.1版本',
    `min_version` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '适合最小版本号,如80',
    `down_url` varchar(255) NOT NULL DEFAULT '' COMMENT 'apk或者app store下载地址',
    `apk_size` int(10) unsigned NOT NULL DEFAULT 0 COMMENT 'apk文件大小,单位字节,对ios值为空',
    `apk_md5` varchar(50) NOT NULL DEFAULT '' COMMENT 'apk文件md5值,对ios值为空',
    `is_delete` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除 0-正常 1-删除',
    `create_time` int(10) NOT NULL DEFAULT 0 COMMENT '创建时间',
    `update_time` int(10) NOT NULL DEFAULT 0 COMMENT '修改时间',
    `delete_time` int(10) NOT NULL DEFAULT 0 COMMENT '删除时间',
    PRIMARY KEY (`id`) USING BTREE,
    UNIQUE KEY `appidversionno` (`appid`,`cur_version`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='app升级信息表';


方案二:后端处理逻辑 - 考虑android和ios app/ipad升级,只录入最新上线版本的前一个版本升级策略

入参数:
    appid app应用类型:1.A商城 android app、2.A商城 ios app,3.A商城 android ipad、4.A商城 ios ipad, 必须
    app_version 当前app版本号(非数字版本),如v1.0.0 或者 1.0.0,为了兼容,服务端接收到v开头的版本,自动去掉大小写的v字母,必须
响应json参数:
    code
    msg
    data
    data字段不为空情况下:
        1.原样返回的app版本号 : app_version,如v1.0.1,必须
        2.app下载url : down_url,必须
        3.更新文案 : update_desc,必须
        4.更新方式: update_type,0可选更新,1强制更新,必须
        5.apk大小:app_size,单位字节,对andorid必须,对ios值为空
        6.apk文件md5值:apk_md5,字符串,可选

情况1-data为空则客户端无需升级:
        {
    "code": 0,
"msg": "",
"data": {}
}

    

情况2-有对应版本的升级策略:
{
"code": 0,
"msg": "",
"data": {
"app_version": "1.0.0",
"down_url": "http://www.nfangbian.com/app.apk",
"update_desc": "优化app体验",
"update_type": 0,
"app_size": "1000000",
"apk_md5": ""
}
}


服务端判断逻辑:
    1.查询指定版本的信息SQL: select * from t_app_upgrade02 where appid=1 and app_version='1.0.1' and is_delete=0 limit 1;
    2.如果没有查询到记录则不做更新,返回data为空对象
    3.如果查询到记录,则再查询 select * from t_app_upgrade02_lastinfo where appid=1 and is_lastversion=1 and is_delete=0 limit 1;
        同时拼接1和3返回的记录放入data对象中

表结构:
CREATE TABLE `t_app_upgrade02` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
    `appid` tinyint(4) unsigned NOT NULL DEFAULT 0 COMMENT 'app应用类型:1.A商城 android app、2.A商城 ios app、3.A商城 ios ipad、4.A商城 android ipad',
    `app_version` varchar(20) NOT NULL DEFAULT '' COMMENT '指定的app版本号,1.0.1',
    `update_type` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '更新方式,0可选更新,1强制更新',
    `is_delete` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除 0-正常 1-删除',
    `create_time` int(10) NOT NULL DEFAULT 0 COMMENT '创建时间',
    `update_time` int(10) NOT NULL DEFAULT 0 COMMENT '修改时间',
    `delete_time` int(10) NOT NULL DEFAULT 0 COMMENT '删除时间',
    PRIMARY KEY (`id`) USING BTREE,
    UNIQUE KEY `appidversion` (`appid`,`app_version`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='android和ios app升级表';

CREATE TABLE `t_app_upgrade02_lastinfo` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
    `appid` tinyint(4) unsigned NOT NULL DEFAULT 0 COMMENT 'app应用类型:1.A商城 android app、2.A商城 ios app、3.A商城 ios ipad、4.A商城 android ipad',
    `last_version` varchar(20) NOT NULL DEFAULT '' COMMENT '最新app版本号,1.0.1',
    `is_lastversion` tinyint(4) unsigned NOT NULL DEFAULT 0 COMMENT '是否最新版本记录,0历史版本记录,1最新版本记录,对于同一个appid和last_version的is_lastversion值为1的只有一条',
    `app_name` varchar(20) NOT NULL DEFAULT '' COMMENT 'App名称,如商城A',
    `update_desc` varchar(155) NOT NULL DEFAULT '' COMMENT '最新版本的更新文案',
    `down_url` varchar(255) NOT NULL DEFAULT '' COMMENT '如果应用类型是android则为apk下载地址,如果应用是ios则为app store下载地址',
    `apk_size` int(10) unsigned NOT NULL DEFAULT 0 COMMENT 'apk文件大小,单位字节,仅对android有效',
    `apk_md5` varchar(50) NOT NULL DEFAULT '' COMMENT 'apk文件md5值,仅对android有效',
    `is_delete` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除 0-正常 1-删除',
    `create_time` int(10) NOT NULL DEFAULT 0 COMMENT '创建时间',
    `update_time` int(10) NOT NULL DEFAULT 0 COMMENT '修改时间',
    `delete_time` int(10) NOT NULL DEFAULT 0 COMMENT '删除时间',
    PRIMARY KEY (`id`) USING BTREE,
    UNIQUE KEY `appidversion` (`appid`,`last_version`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='android和ios app版本信息表';



方案三-下发最新版本的信息,由客户端判断是否升级及强升逻辑
入参数:
    appid app应用类型:1.A商城、2.B商城,必须
    app_type 终端类型,1.android app,2.andorid ipad,3.ios app ,必须
响应json参数:
    code
    msg
    data
情况1-data为空则客户端无需升级:{ "code": 0, "msg": "", "data": { } }
情况2-有最新版本信息:
{
"code": 0,
"msg": "",
"data": {
    "last_version": "1.0.0",
    "min_version": "",
    "down_url": "http://www.nfangbian.com/app.apk",
    "update_desc": "升级文案",
    "update_type": 0,
    "app_size": "1000000",
    "apk_md5": ""
  }
}

查询记录sql: select * from t_app_upgrade03_lastinfo where appid=1 and app_type=1 and is_lastversion=1 and is_delete=0 limit 1;
客户端判断逻辑:
update_type表升级方式,0不升级,1可选升级,2强制升级
        1. 默认值update_type = 0
        2. 如果cur_version < last_version,则update_type = 1
        3. 如果cur_version < min_version,则update_type = 2

表结构
CREATE TABLE `t_app_upgrade03_lastinfo` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
    `appid` tinyint(4) unsigned NOT NULL DEFAULT 0 COMMENT 'app应用类型:1.A商城、2.B商城、3.C商城',
    `app_type` tinyint(4) unsigned DEFAULT 0 COMMENT '终端类型,1.app,2.ipad',
    `last_version` varchar(20) NOT NULL DEFAULT '' COMMENT '最新app版本号,1.0.1',
    `is_lastversion` tinyint(4) unsigned NOT NULL DEFAULT 0 COMMENT '是否最新版本记录,0历史版本记录,1最新版本记录,对于同一个appid和last_version的is_lastversion值为1的只有一条',
    `min_version` varchar(20) NOT NULL DEFAULT '' COMMENT 'App客户端版本小于这个版本则强升',
    `app_name` varchar(20) NOT NULL DEFAULT '' COMMENT 'App名称,如A商城',
    `update_desc` varchar(155) NOT NULL DEFAULT '' COMMENT '最新版本的更新文案',
    `down_url` varchar(255) NOT NULL DEFAULT '' COMMENT '如果应用类型是android则为apk下载地址,如果应用是ios则为app store下载地址',
    `apk_size` int(10) unsigned NOT NULL DEFAULT 0 COMMENT 'apk文件大小,单位字节,仅对android有效',
    `apk_md5` varchar(50) NOT NULL DEFAULT '' COMMENT 'apk文件md5值,仅对android有效',
    `is_delete` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除 0-正常 1-删除',
    `create_time` int(10) NOT NULL DEFAULT 0 COMMENT '创建时间',
    `update_time` int(10) NOT NULL DEFAULT 0 COMMENT '修改时间',
    `delete_time` int(10) NOT NULL DEFAULT 0 COMMENT '删除时间',
    PRIMARY KEY (`id`) USING BTREE,
    UNIQUE KEY `appidversion` (`appid`,`last_version`,`app_type`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='android和ios app最新版本信息表';



方案四: 服务器端判断
入参数:
    appid app应用类型:1.A商城、2.B商城,必须
    app_type 终端类型,1.android app,2.andorid ipad,3.ios app ,4.ios ipad,必须
    cur_version 客户端当前app版本,如1.0.1,v1.0.1,必须
响应json参数:
    code
    msg
    data
    data字段不为空情况下:
        1.升级方式: update_type,0无需更新,1可选更新,2强制更新,必须
        2.最新app版本号 : app_version,如1.0.1,必须
        3.app下载url : down_url,android是apk地址,ios是appstore地址,必须
        4.更新文案 : update_desc,必须
        5.apk大小:app_size,单位字节,对andorid必须,对ios值为空
        6.apk文件md5值:apk_md5,字符串,可选
    情况1-客户端兼容一下,如果data为空则客户端无需升级:{ "code": 0, "msg": "","data": { } }
   响应示例2:  {
"code": 0,
"msg": "",
"data": {
"update_type": 0,
"app_version": "1.0.0",
"down_url": "http://www.nfangbian.com/app.apk",
"update_desc": "优化app体验",
"app_size": "1000000",
"apk_md5": ""
}
}


服务端判断逻辑:
    1. 把接收的app版本换算成权重,$cur_version = '1.0.1';
            $last_versionno=versionToWeight($cur_version);//100000001
            //只支持三段式、四段式的,每段最多4位
            function versionToWeight($version) {
                $tmp = explode(".", $version);
                switch(count($tmp)) {
                case 1:
                    $number = $tmp[0];
                break;
                case 2:
                    $number = $tmp[0]*10000+$tmp[1];
                break;
                case 3:
                    $number = $tmp[0]*100000000+$tmp[1]*10000+$tmp[2];
                break;
                case 4:
                    $number = $tmp[0]*1000000000000 + $tmp[1]*100000000+$tmp[2]*10000+$tmp[3];; //不支持
                break;
                default:
                    $number = 0; //不支持
                break;
                    }
                return $number;
            }
    2. 查询最新版本记录: select * from t_app_upgrade04 where appid=1 and app_type=1 and is_delete=0 order by last_versionno desc limit 1;
    3. update_type表升级方式,0不升级,1可选升级,2强制升级
            默认值update_type = 0
            如果cur_version版本在强升白名单内(在php中配置),则update_type = 2
            如果cur_version < last_version,则update_type = 1
            如果cur_version < min_version,则update_type = 2

表结构
CREATE TABLE `t_app_upgrade04` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
    `appid` tinyint(4) unsigned NOT NULL DEFAULT 0 COMMENT 'app应用类型:1.A商城、2.B商城、3.C商城',
    `app_type` tinyint(4) unsigned DEFAULT 0 COMMENT '终端类型,1.android app,2.andorid ipad,3.ios app ',
    `last_version` varchar(20) NOT NULL DEFAULT '' COMMENT '最新app版本号,1.0.1',
    `last_versionno` bigint(20) NOT NULL DEFAULT 0 COMMENT '最新app版本号,1.0.1对应的权重值,值越大的为最新版本',
    `min_version` varchar(20) NOT NULL DEFAULT '' COMMENT 'App客户端版本小于这个版本则强升',
    `app_name` varchar(20) NOT NULL DEFAULT '' COMMENT 'App名称,如A商城',
    `update_desc` varchar(155) NOT NULL DEFAULT '' COMMENT '最新版本的更新文案',
    `down_url` varchar(255) NOT NULL DEFAULT '' COMMENT '如果应用类型是android则为apk下载地址,如果应用是ios则为app store下载地址',
    `apk_size` int(10) unsigned NOT NULL DEFAULT 0 COMMENT 'apk文件大小,单位字节,仅对android有效',
    `apk_md5` varchar(50) NOT NULL DEFAULT '' COMMENT 'apk文件md5值,仅对android有效',
    `is_delete` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否删除 0-正常 1-删除',
    `create_time` int(10) NOT NULL DEFAULT 0 COMMENT '创建时间',
    `update_time` int(10) NOT NULL DEFAULT 0 COMMENT '修改时间',
    `delete_time` int(10) NOT NULL DEFAULT 0 COMMENT '删除时间',
    PRIMARY KEY (`id`) USING BTREE,
    UNIQUE KEY `appidversion` (`appid`,`app_type`,`last_version`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='app版本升级信息表';