现在基本每个公司都做APP,所以大家都面临 APP接口版本兼容的问题。

iOS和android 要不断开发新版本,很多服务端开发都是在以前接口的逻辑上进行修改。新的APP和接口开发后,接口如何兼容老的APP?

有的公司 每次发布完APP,就强制用户更新到最新版本。不推荐这样,因为用户体验太差。

就算是用 强制更新,在苹果审核期间,新的APP接口和 老的接口 也必须能同时使用。

下面我们说下如何做,大家有不同意见可以 留言讨论。

一、客户端 做兼容,接口不用做兼容

1、APP强制更新(不建议)

接口URL:api.xxx.com/v1.0/xxxx.java

接口的URL中加入版本号,如上:v1.0。

每次发布新APP版本就强制更新。

灰度服务器 部署正在审核中的 接口版本(如:v1.1)。等审核通过后,将老版本的APP设置强制更新,这样老的接口就不用了。

然后把线上服务器重新部署上最新的代码,再去掉灰度服务器。

这样APP接口全部访问正式的线上服务器。

2、热更新

紧急的小需求可以用热更新,大的需求建议还是用原生的代码,因为你用热更新修改完(用JS或Lua),最后还要在原生代码里修改。

网游用热更新的比较多,因为网游的APP太大,不可能加个小关卡 就要求用户重新下载,并且游戏更新比企业级APP更频繁,用热更新可以不断新加关卡、场景、活动推广。

3、React Native 和Weex

Weex比React Native好用,建议大家可以尝试下。个人建议先不要 大范围用它们来做,毕竟它们只是第三方的东西,有的东西也不太完善。

二、服务端 做 版本兼容

全部接口版本是否统一:

  • 所有的接口都用 相同的版本号:这样要发一个APP新版本就统一修改版本号,好修改,但是如果想修改其中一个接口的版本号就不行了。

  • 每个接口的版本号可以不一样:这样比较灵活,建议这样做。

因为已经好多年没有做过服务端了。下面的见解如果有错误,希望指正。

1、每个接口逻辑里 加if 判断(不建议)

接口URL:api.xxx.com/api?version=v1&..

if (version == ‘1.5.’) {
  do_something
} else if (version ==‘1.4.') {
  do_something
}

优点:实现简单

缺点:不同版本的逻辑都在一个方法里,在于容易造成代码混乱,不利于维护。

2、不同的文件夹

相当于每个接口版本都是一个独立的项目。放到服务器的独立文件夹里。

例如:

接口URL:api.xxx.com/v1.0/xxxx.php

文件夹位置:Controller/V1.0/

-----------------/xxxx.php

文件夹位置:Controller/V2.1/

-----------------/xxxx.php

优点:版本逻辑分开维护。看url就能知道哪个版本。删除多余版本 不用修改代码。

缺点:同个接口不同版本 文件是重复的。并且 如果有个接口前几版就有问题,一直遗留到现在,就需要改好几套一样的代码。

3、不同版本 用不同的方法 :

类似:

接口URL:api.xxx.com/v1.0/xxxx.php

class XXXX{

    public functionV1_0() { }

    public functionV2_0() { }

}

java或者C# 都有路由配置,可以用路由配置不同版本的URL跳转到不同的方法里。

4、用继承的方式

“一瓶真情”在评论中回复:采用继承的方式,既可以利用之前的接口代码,又可以采用override的方式修改部分接口的实现。

这样是可以的。但是如果你上个版本(也就是父类)修改了代码,就会影响后面的所有版本。
在线上有bug或者需求变更的时候 很可能会修改基类。

大家可以讨论下。

5、部署到不同的服务器

“xuanbg”在评论中回复:

不同版本不同分支,部署在不同的服务器上。如果某个版本用不到了,直接干掉服务就好了。

例如我现在的API要从1.x升到不兼容的2.0版本了,那就给当前的发布分支打个Tag。等哪天1.x版的API需要fix bug,就能很简单地从这个Tag切一个1.x的分支出来fix bug后进行测试发布,而且这个分支不会合并到任何分支,所以不会影响其他版本。
这个方案 不好的地方在于,如果2.0也有同样bug的话,也要在2.0分支上改一遍。如果版本很多的话,这活就不好干了。所以呢,一般不会同时发布两个以上的版本,在升级不兼容的第三个版本前,一定会把第一个版本干掉。

但是比如 淘宝、微信 ,有的时候忘记更新了,你会发现淘宝已经升级过4、5个版本了,然后老版本还能用。也就是有的APP确实需要兼容4、5个版本。
另外,如果要兼容过多的版本,服务器也需要够多才行。同时,因为老版本的人用的少,也就是有的服务器访问量很少,有的服务器访问量很多。不能真正的负载均衡,浪费了服务器资源。

6、混合使用

“ Tokyo^hot”在回复中说到两种方式的混合使用。服务端的几种方法混用:

6.1、第3种和第4种方法一起用。先用继承,如果新版本和以前的版本无法复用,就用路由设置新的方法。

6.2、第1种方法和第3中方法一起用,简单的小改动用 第1种,加个if判断。改动较大的用 第3种,新开个方法。

三、结尾

自己 已经有好几年没做 服务端了。如果大家有什么好办法,可以留言,谢。

接口兼容其实主要是服务端的任务。APP的工作量相对简单。

大家都是怎么做的?

欢迎关注 今日头条号 名称: 云端梦想科技

欢迎关注 微信公众号:dreams2999

APP接口版本兼容的问题的更多相关文章

  1. APP接口版本不兼容怎么办? 教你一招

    现在基本每个公司都做APP,所以大家都面临 APP接口版本兼容的问题. iOS和android 要不断开发新版本,很多服务端开发都是在以前接口的逻辑上进行修改.新的APP和接口开发后,接口如何兼容老的 ...

  2. 关于开发APP接口版本不兼容的问题

    关于 APP接口版本兼容的问题. iOS和android 要不断开发新版本,很多服务端开发都是在以前接口的逻辑上进行修改. 新的APP和接口开发后,接口如何兼容老的APP? 有的公司 每次发布完APP ...

  3. APP多版本共存,服务端如何兼容?

    做过APP产品的技术人员都知道,APP应用属于一种C/S架构的,所以在做多版本兼容,升级等处理则比较麻烦,不像web应用那么容易.下面将带大家分析几种常见的情况和应对方式: 小改动或者新加功能的 这种 ...

  4. Java版本APP接口安全设计

    Java版本APP接口安全设计 安全设计分为两种: 1.传输安全. 2. 会话安全. 1.传输安全 怎么保证接口经过网络传输不被抓包获取? 1.如果只是使用对称性算法,破解APP拿到加密密钥就可以解密 ...

  5. 大家是怎么做APP接口的版本控制的?欢迎进来看看我的方案。升级版的Versioning

    背景 APP不同于网站,网站程序一发版,所有用户看到的都是最新的页面.调用最新的接口,没有新老版本一说.APP一旦下载到用户手机上,用户不更新你拿他一点办法都没有,但是随着业务的调整,同一个接口的请求 ...

  6. WebApi Swagger 接口多版本控制 适用于APP接口管理

    最近研究了下swagger多版本的维护,网上的文章千篇一律,无法满足我的需求,分享下我的使用场景以及实现 演示环境:Visual Studio 2019.Asp.NET WebAPI.NET Fram ...

  7. 说说APP接口中的版本控制

    引言 接口是APP的重要组成部分,数据是APP的核心,接口是连接APP和数据的纽带. 一般情况下,APP中会有大量的接口,再加上版本的变化,接口的升级,一个接口 可能会衍生出很多个稍有差异的接口,这个 ...

  8. Material Designer的低版本兼容实现(五)—— ActivityOptionsCompat

    extends:http://www.cnblogs.com/tianzhijiexian/p/4087917.html 本文是对API中的方法做了介绍,如果想要看如何让这些方法兼容4.x或2.x可以 ...

  9. PHP开发APP接口实现--基本篇

    最近一段时间一直在做APP接口,总结一下APP接口开发以来的心得,与大家分享: 1. 客户端/服务器接口请求流程: 安卓/IOS客户端   –> PHP接口 –> 服务器端  –> ...

随机推荐

  1. HiveQL 与 SQL的异同

    1 select 别名 (1)别名一定要加as 例:select ID as stuID from students (2) Hive QL不支持在group by, order by 中使用sele ...

  2. <十二>面向对象分析之UML核心元素之节点和设备

    节点,设备

  3. ssh 或者 scp 无需输入密码的解决办法

    这里假设主机A(192.168.100.3)用来获到主机B(192.168.100.4)的文件.   在主机A上执行如下命令来生成配对密钥: ssh-keygen -t rsa   遇到提示回车默认即 ...

  4. linux apache 配置fastcgi

    Redhat 上 FastCGI 安装与配置 软件包 相关软件包: httpd 2.2.14      //注意版本 这个版本不会出问题   注:apache httpd安装 fcgi-2.4.0.t ...

  5. JQuery开发之Galleriffic图片插件介绍

    Galleriffic是一个用于创建快速展示相册中照片的jQuery插件.从图一中可以看成,图片既可以以幻灯片的方式查看,也可以手动点击缩略图查看.Galleriffic还支持分页,从而使得它能够展示 ...

  6. Golang几个常用记录日志对比

    go语言有一个标准库,log,提供了最基本的日志功能,但是没有什么高级的功能,如果需要高级的特性,就需要使用第三方包,下面是一些候选的包: go_tmlog https://code.google.c ...

  7. 【转】linux之ln命令

    转自:http://www.cnblogs.com/peida/archive/2012/12/11/2812294.html ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位 ...

  8. C.xml

    pre{ line-height:1; color:#1e1e1e; background-color:#f0f0f0; font-size:16px;}.sysFunc{color:#627cf6; ...

  9. 解决“运行arm-linux-gcc命令,提示No such file or directory”的问题

    今天在ubuntu14.04上安装arm的交叉编译器arm-linux-gcc,环境变量配置好以后,运行arm-linux-gcc命令,总提示No such file or directory.然后去 ...

  10. 实现JQuery EasyUI右键菜单变灰不可用效果

    使用过EasyUI的朋友想必都知道疯狂秀才写的后台界面吧,作为一个初学者我不敢妄自评论它的好坏,不过它确实给我们提供了一个很好框架,只要在它的基础上进行修改,基本上都可以满足我们开发的需要. 知道“疯 ...