参考引用: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版本升级信息表';