如题:谈一谈APP版本号问题

为什么要谈这个问题,周五晚上11~12点,被微信点名,说APP有错,无效的版本号,商城无法下单。
我正在准备收拾东西,周末回老家,结果看到这样问题,菊花一紧。
我擦,我刚加的版本号检查,在加版本号检查前,我还跟统计的妹妹仔细核对了近半年来所有的版本号,怎么还会有问题。
赶紧查,原来结果,看到了一个g1_2.5.5_65,在我的一再追问下说这个就是2.5.5的版本号。
然后咱们来说一说为什么要加版本号检查,然后再说,为什么会加出问题来,最后在讨论一下版本号规则。
题外话跟大家探讨一下version这样的参数怎么传递比较合理。

首先在APP发版过程中,由于新的版本上有新的功能,有些需要和老的版本做兼容,所以非常有可能服务器端需要知道APP的版本号,
而服务器在升级服务和自己的API也一定有版本号的概念,虽然很多时候我们可能注意不到,但是版本号这个一定是双方互相都存在的。
我就是在这样的一个情景下,我们的新的功能要同时需要兼容新的老的APP,所以服务器需要知道所有APP的版本号,这是需要APP传给服务的参数。
同时服务器也需要在基于某个版本号比如2.8.5做版本号大小的判断。
比如说小于2.8.5的版本号,那么就是老的逻辑,而大于等于2.8.5的版本就是新的逻辑。这可能是基于版本号的最简单的兼容逻辑了。

到这里有心的读者一定看出了说为什么加个版本号也会加出问题来了,对这就是加个版本号检查也加出问题的原因。
我在加检查前,不确定我们的版本号的规则,然后我找统计妹妹仔细统计了近半年的所有的版本号,得到的结果是我们的版本号是x.x.x这样的号码,
x一定是数字,那这么看来没有问题,我就按这个规则解析比较,结果当遇到上边看到的g1_2.5.5_65这个版本号时,直接numberformatexception.
还好,我们的处理非常之果断,在版本检查时出里任何异常,都提示用户版本过低,让用户升级。
但同样暴露出了我们很多的问题,我们的APP经过两年多的发版竟然从来没有统一过版本号,甚至规则都没有统一过。
再次追问下去,说由于不同的下载渠道和推送渠道,我们会写上不同的版本号,这个答案的结果我当然不满意。
心中多是无奈也没有办法,于是乎推进版本号赶紧统一,至少在规则上能有一个可以统一解析的规则。
这里的一个事情做得好的就是至少我们还有版本号,无论当时服务器使用没有使用版本号,至少APP是传了的。
需要注意的是,版本号这个东西不能随意写,也不能随意规划,这个需要统一规划,而且越快越早规划越好。

那么这里就引出了第三个问题,版本号的规则问题,关于这个问题,我不想深入探讨和研究。
百度“软件开发版本号规则”或者“软件开发版本号命名规范”讲的非常之详细,非常明白,很容易理解。
我想说的无论怎么样一定要指定一个自己可以统一解析的规则和规范,只要按照规则和规范一定能很好的处理版本号。
我比较推荐的使用的版本号有两种,
1是:主版本号.次版本号.修订版本号.日期版本号
2是:主版本号.次版本号.修订版本号.构建版本号
这样的一组号码,清晰明了,足够用了。

最后谈一谈版本号怎么传递比较合适,首先我们不说APP,我们做服务器端开发特别是RESTAPI时一定也遇到过说一个API的version问题,
网上不同的人有不同的见解,不同的网站有不同的实现方式,我说一下我知道的常见的几种方式:
1、在http header中传递,例如:header.set("version","2.8.5")
2、在使用url path的方式,例如:/www.xxx.com/order/v2.8.5/create
3、使用url query paramter的方式传递,例如:/www.xxx.com/order/create?v=2.8.5
4、使用form表单提交version,(这个貌似极其少见)例如:<form method="post|get" action="/order/create"><hiden name="version" value="2.8.5"/>...</form>
这个明白了之后那么APP给服务器传参,也无外乎这几种方式,具体使用哪种中方式可以根据自己的喜好而定。
貌似我在某一篇文章中看到说虽然使用url path的方式比较直观,有些大型的网站也在使用,但是REStful的规范说要在header中使用version才算正统。
这个就无所谓了,我感觉都行,之前老大还跟我争执过这个,我说要加在url path中就是使用第二种方式,结果老大不同意,说你这样将来要维护一堆的url,v1,v2会很麻烦。
说推荐第一种,我比较固执的按第二种方式做了,后来另一个同事也讨论起这事,所就按第二种方式比较好,这里老大的态度变了,说啥啥啥公司都是第二种,咱们也第二种吧,
我心里那个委屈,特么,我早跟你说,你跟我还争个毛线,我做都做了,还在我伤口上撒盐。我跟老大争这些是不是将来做不了老大,悲催。
现在想想第三种也非常棒,真的也非常不错的。

好了今天,关于版本号讨论就说这么些吧。

欢迎大家评论发表意见或提出问题

谈一谈APP版本号问题的更多相关文章

  1. [原创]浅谈移动互联网App兼容性测试

    [原创]浅谈移动互联网App兼容性测试 今天要谈的话题,估计各位测试都有感受,移动互联网App兼容性测试,我们到底测试覆盖如何去挑选机型?具体移动App兼容性测试如何开展?是不是应引进像testin这 ...

  2. 从一张图开始,谈一谈.NET Core和前后端技术的演进之路

    从一张图开始,谈一谈.NET Core和前后端技术的演进之路 邹溪源,李文强,来自长沙.NET技术社区 一张图 2019年3月10日,在长沙.NET 技术社区组织的技术沙龙<.NET Core和 ...

  3. iOS获取设备型号和App版本号等信息(OC+Swift)

    iOS获取设备型号和App版本号等信息(OC+Swift) 字数1687 阅读382 评论3 喜欢10 好久没有写过博客了,因为中间工作比较忙,然后有些个人事情所以耽误了.但是之前写的博客还一直有人来 ...

  4. 谈一谈Java8的函数式编程(二) --Java8中的流

    流与集合    众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...

  5. 谈一谈泛型(Generic)

    谈一谈泛型 首先,泛型是C#2出现的.这也是C#2一个重要的新特性.泛型的好处之一就是在编译时执行更多的检查. 泛型类型和类型参数 ​ 泛型的两种形式:泛型类型( 包括类.接口.委托和结构 没有泛型枚 ...

  6. 谈一谈Elasticsearch的集群部署

      Elasticsearch天生就支持分布式部署,通过集群部署可以提高系统的可用性.本文重点谈一谈Elasticsearch的集群节点相关问题,搞清楚这些是进行Elasticsearch集群部署和拓 ...

  7. 谈一谈iOS事件的产生和传递

    谈一谈iOS事件的产生和传递 1.事件的产生 发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中. UIApplication会从事件队列中取出最前面的事件,并将事件 ...

  8. 谈一谈对MySQL InnoDB的认识及数据库事物处理的隔离级别

    介绍: InnoDB引擎是MySQL数据库的一个重要的存储引擎,和其他存储引擎相比,InnoDB引擎的优点是支持兼容ACID的事务(类似于PostgreSQL),以及参数完整性(有外键)等.现在Inn ...

  9. 谈一谈深度学习之semantic Segmentation

    上一次发博客已经是9月份的事了....这段时间公司的事实在是多,有写博客的时间都拿去看paper了..正好春节回来写点东西,也正好对这段时间做一个总结. 首先当然还是好好说点这段时间的主要工作:语义分 ...

随机推荐

  1. git 命令02

    1.怎么添加远程库2.克隆一个远程库3.什么是分支管理4.什么是标签管理3.搭建git服务器 1.添加远程库.我以github官网上提供给用户注册https://github.com/,可以在官网了自 ...

  2. 在linux中实现多网卡的绑定 介绍常见的7种Bond模式

    网卡bond是通过把多张网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡.在应用部署中是一种常用的技术,我们公司基本所有的项目相关服务器都做了bond,这里总结整理,以便待查. bond ...

  3. 解决 KendoUI TabStrip 高度 100% 问题

    摘自: http://www.kendoui.com/forums/kendo-ui-web/tabstrip/forcing-tabstrip-to-take-up-100-of-it-s-pare ...

  4. Python 面试中 8 个必考问题(转载)

    Python 面试中 8 个必考问题 1.下面这段代码的输出结果是什么?请解释. def extendList(val, list=[]): list.append(val) return list ...

  5. select()/poll() 的内核实现

    mark 引用:http://janfan.cn/chinese/2015/01/05/select-poll-impl-inside-the-kernel.html 文章 select()/poll ...

  6. POJ 3122-Pie(二分+精度)

    题目地址:id=3122">POJ 3122 题意:给出n个pie的直径.有F+1个人,假设给每人分的大小同样(形状能够不同),每一个人能够分多少.要求是分出来的每一份必须出自同一个p ...

  7. Java Nio Socket通讯

    Server端: #############服务器端连接请求处理############### public class MultiplexerServer implements Runnable { ...

  8. JMeter 十一:参数化

    Test Plan中定义变量 打开测试计划,在用户定义的变量中定义变量. 这里定义了一个HOST变量,值为“www.baidu.com”. 之后就可以使用 ${HOST} 来引用这个变量. User ...

  9. 算法笔记_114:等额本金(Java)

    1 等额本金 标题:等额本金 小明从银行贷款3万元.约定分24个月,以等额本金方式还款. 这种还款方式就是把贷款额度等分到24个月.每个月除了要还固定的本金外,还要还贷款余额在一个月 中产生的利息. ...

  10. Windows 2008 R2有效激活方法【转】

    原文地址:http://jingyan.baidu.com/article/851fbc3707096e3e1f15ab33.html 装了windows server 2008之后才发现,它与win ...